Skip to content

Commit

Permalink
feat(electron, backend): coordinate Electron auto-updates via IPC and…
Browse files Browse the repository at this point in the history
… install with visible installer

Closes #256
  • Loading branch information
Harjot1Singh committed Nov 12, 2019
1 parent 87b6f90 commit ac0373d
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 30 deletions.
20 changes: 13 additions & 7 deletions app/electron/electron-wrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,25 @@
import { app } from 'electron'

import logger from '../lib/logger'

import { createMainWindow, createNonMainWindows, closeNonMainWindows } from './window'
import { isDev } from '../lib/consts'

import { createMainWindow, createNonMainWindows, closeNonMainWindows } from './window'
import { setBeta, initUpdates, checkUpdates } from './updates'

const onReady = () => {
logger.info( 'Starting Electron Shell' )
createMainWindow()
}

const onSettingsChange = ( { system } ) => {
// Toggle multiple displays
if ( system.multipleDisplays ) createNonMainWindows()
else closeNonMainWindows()

// Ensure updater beta settings are in sync
setBeta( system.betaOptIn )
}

const onReady = server => {
logger.info( 'Starting Electron Shell' )
initUpdates( server )
createMainWindow()
}

// Catch any errors
Expand Down Expand Up @@ -45,8 +50,9 @@ if ( isDev ) {

// Handlers for server IPC events
const handlers = {
ready: () => () => ( app.isReady() ? onReady() : app.on( 'ready,', onReady ) ),
ready: server => () => ( app.isReady() ? onReady( server ) : app.on( 'ready,', () => onReady( server ) ) ),
settings: () => onSettingsChange,
'update-check': server => () => checkUpdates( server ),
}

// Register handlers from server IPC
Expand Down
32 changes: 32 additions & 0 deletions app/electron/updates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// eslint-disable-next-line import/no-extraneous-dependencies
import { app } from 'electron'
import { autoUpdater } from 'electron-updater'

import logger from '../lib/logger'

export const initUpdates = server => {
autoUpdater.logger = logger
autoUpdater.autoInstallOnAppQuit = false

autoUpdater.on( 'update-available', info => server.send( { event: 'update-available', payload: info } ) )

autoUpdater.on( 'update-downloaded', info => {
server.send( { event: 'update-downloaded', payload: info } )

//* Override app handler to visually show installer
app.on( 'will-quit', event => {
event.preventDefault()
autoUpdater.quitAndInstall( false, false )
} )
} )
}

export const checkUpdates = async server => {
logger.info( 'Checking for app updates, beta:', autoUpdater.allowPrerelease )

await autoUpdater.checkForUpdates().catch( logger.error )

server.send( { event: 'update-checked' } )
}

export const setBeta = beta => { autoUpdater.allowPrerelease = beta }
42 changes: 19 additions & 23 deletions app/lib/Updater.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import { dependencies } from '../package.json'
import logger from './logger'
import settings from './settings'
import { DATABASE_FOLDER, electronVersion } from './consts'
import { sendToElectron } from './utils.js'

const databasePackage = `@shabados/database@${dependencies[ '@shabados/database' ]}`
const databasePackage = `@syhabados/database@${dependencies[ '@shabados/database' ]}`

class Updater extends EventEmitter {
constructor( { tempFolder, interval } ) {
Expand All @@ -28,34 +29,29 @@ class Updater extends EventEmitter {
if ( electronVersion ) this.updateLoop( Updater.checkApplicationUpdates.bind( this ) )
}

// Set up application update events via IPC
initElectronUpdates() {
// eslint-disable-next-line global-require
const { autoUpdater } = require( 'electron-updater' )

autoUpdater.logger = logger
autoUpdater.autoInstallOnAppQuit = false
autoUpdater.allowPrerelease = settings.get( 'system.betaOptIn' )

// Change beta opt-in on settings change
settings.on( 'change', ( { system: { betaOptIn = false } } ) => {
autoUpdater.allowPrerelease = betaOptIn
} )
const events = {
'update-available': info => this.emit( 'application-update', info ),
'update-downloaded': info => this.emit( 'application-updated', info ),
'update-checked': () => this.emit( 'update-checked' ),
}

// Set up application autoupdates
autoUpdater.on( 'update-available', info => this.emit( 'application-update', info ) )
autoUpdater.on( 'update-downloaded', info => this.emit( 'application-updated', info ) )
process.on( 'message', ( { event, payload } ) => events[ event ] && events[ event ]( payload ) )
}

/**
* Executes electron-autoupdater's checker.
* Executes electron-autoupdater's checker via IPC to the electron shell.
*/
static async checkApplicationUpdates() {
// eslint-disable-next-line global-require
const { autoUpdater } = require( 'electron-updater' )

logger.info( 'Checking for app updates, beta:', autoUpdater.allowPrerelease )
const { downloadPromise } = await autoUpdater.checkForUpdates()
return downloadPromise
static checkApplicationUpdates() {
return new Promise( resolve => {
sendToElectron( 'update-check' )

this.once( 'update-checked', () => {
logger.info( 'Checked for updates' )
resolve()
} )
} )
}

/**
Expand Down

0 comments on commit ac0373d

Please sign in to comment.