mirror of https://github.com/vector-im/riot-web
				
				
				
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
| const { app, autoUpdater, ipcMain } = require('electron');
 | |
| 
 | |
| const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
 | |
| const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
 | |
| 
 | |
| function installUpdate() {
 | |
|     // for some reason, quitAndInstall does not fire the
 | |
|     // before-quit event, so we need to set the flag here.
 | |
|     global.appQuitting = true;
 | |
|     autoUpdater.quitAndInstall();
 | |
| }
 | |
| 
 | |
| function pollForUpdates() {
 | |
|     try {
 | |
|         autoUpdater.checkForUpdates();
 | |
|     } catch (e) {
 | |
|         console.log('Couldn\'t check for update', e);
 | |
|     }
 | |
| }
 | |
| 
 | |
| module.exports = {};
 | |
| module.exports.start = function startAutoUpdate(updateBaseUrl) {
 | |
|     if (updateBaseUrl.slice(-1) !== '/') {
 | |
|         updateBaseUrl = updateBaseUrl + '/';
 | |
|     }
 | |
|     try {
 | |
|         let url;
 | |
|         // For reasons best known to Squirrel, the way it checks for updates
 | |
|         // is completely different between macOS and windows. On macOS, it
 | |
|         // hits a URL that either gives it a 200 with some json or
 | |
|         // 204 No Content. On windows it takes a base path and looks for
 | |
|         // files under that path.
 | |
|         if (process.platform === 'darwin') {
 | |
|             // include the current version in the URL we hit. Electron doesn't add
 | |
|             // it anywhere (apart from the User-Agent) so it's up to us. We could
 | |
|             // (and previously did) just use the User-Agent, but this doesn't
 | |
|             // rely on NSURLConnection setting the User-Agent to what we expect,
 | |
|             // and also acts as a convenient cache-buster to ensure that when the
 | |
|             // app updates it always gets a fresh value to avoid update-looping.
 | |
|             url = `${updateBaseUrl}macos/?localVersion=${encodeURIComponent(app.getVersion())}`;
 | |
| 
 | |
|         } else if (process.platform === 'win32') {
 | |
|             url = `${updateBaseUrl}win32/${process.arch}/`;
 | |
|         } else {
 | |
|             // Squirrel / electron only supports auto-update on these two platforms.
 | |
|             // I'm not even going to try to guess which feed style they'd use if they
 | |
|             // implemented it on Linux, or if it would be different again.
 | |
|             console.log('Auto update not supported on this platform');
 | |
|         }
 | |
| 
 | |
|         if (url) {
 | |
|             autoUpdater.setFeedURL(url);
 | |
|             // We check for updates ourselves rather than using 'updater' because we need to
 | |
|             // do it in the main process (and we don't really need to check every 10 minutes:
 | |
|             // every hour should be just fine for a desktop app)
 | |
|             // However, we still let the main window listen for the update events.
 | |
|             // We also wait a short time before checking for updates the first time because
 | |
|             // of squirrel on windows and it taking a small amount of time to release a
 | |
|             // lock file.
 | |
|             setTimeout(pollForUpdates, INITIAL_UPDATE_DELAY_MS);
 | |
|             setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
 | |
|         }
 | |
|     } catch (err) {
 | |
|         // will fail if running in debug mode
 | |
|         console.log('Couldn\'t enable update checking', err);
 | |
|     }
 | |
| }
 | |
| 
 | |
| ipcMain.on('install_update', installUpdate);
 | |
| ipcMain.on('check_updates', pollForUpdates);
 | |
| 
 | |
| function ipcChannelSendUpdateStatus(status) {
 | |
|     if (global.mainWindow) {
 | |
|         global.mainWindow.webContents.send('check_updates', status);
 | |
|     }
 | |
| }
 | |
| 
 | |
| autoUpdater.on('update-available', function() {
 | |
|     ipcChannelSendUpdateStatus(true);
 | |
| }).on('update-not-available', function() {
 | |
|     ipcChannelSendUpdateStatus(false);
 | |
| }).on('error', function(error) {
 | |
|     ipcChannelSendUpdateStatus(error.message);
 | |
| });
 |