76 lines
		
	
	
	
		
			2.2 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.2 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { app } from 'electron';
 | 
						|
import { EventEmitter } from 'events';
 | 
						|
import * as squirrelUpdate from './squirrel-update-win';
 | 
						|
 | 
						|
class AutoUpdater extends EventEmitter {
 | 
						|
  updateAvailable: boolean = false;
 | 
						|
  updateURL: string | null = null;
 | 
						|
 | 
						|
  quitAndInstall () {
 | 
						|
    if (!this.updateAvailable) {
 | 
						|
      return this.emitError(new Error('No update available, can\'t quit and install'));
 | 
						|
    }
 | 
						|
    squirrelUpdate.processStart();
 | 
						|
    app.quit();
 | 
						|
  }
 | 
						|
 | 
						|
  getFeedURL () {
 | 
						|
    return this.updateURL;
 | 
						|
  }
 | 
						|
 | 
						|
  setFeedURL (options: { url: string } | string) {
 | 
						|
    let updateURL: string;
 | 
						|
    if (typeof options === 'object') {
 | 
						|
      if (typeof options.url === 'string') {
 | 
						|
        updateURL = options.url;
 | 
						|
      } else {
 | 
						|
        throw new Error('Expected options object to contain a \'url\' string property in setFeedUrl call');
 | 
						|
      }
 | 
						|
    } else if (typeof options === 'string') {
 | 
						|
      updateURL = options;
 | 
						|
    } else {
 | 
						|
      throw new Error('Expected an options object with a \'url\' property to be provided');
 | 
						|
    }
 | 
						|
    this.updateURL = updateURL;
 | 
						|
  }
 | 
						|
 | 
						|
  checkForUpdates () {
 | 
						|
    const url = this.updateURL;
 | 
						|
    if (!url) {
 | 
						|
      return this.emitError(new Error('Update URL is not set'));
 | 
						|
    }
 | 
						|
    if (!squirrelUpdate.supported()) {
 | 
						|
      return this.emitError(new Error('Can not find Squirrel'));
 | 
						|
    }
 | 
						|
    this.emit('checking-for-update');
 | 
						|
    squirrelUpdate.checkForUpdate(url, (error, update) => {
 | 
						|
      if (error != null) {
 | 
						|
        return this.emitError(error);
 | 
						|
      }
 | 
						|
      if (update == null) {
 | 
						|
        return this.emit('update-not-available');
 | 
						|
      }
 | 
						|
      this.updateAvailable = true;
 | 
						|
      this.emit('update-available');
 | 
						|
      squirrelUpdate.update(url, (error) => {
 | 
						|
        if (error != null) {
 | 
						|
          return this.emitError(error);
 | 
						|
        }
 | 
						|
        const { releaseNotes, version } = update;
 | 
						|
        // Date is not available on Windows, so fake it.
 | 
						|
        const date = new Date();
 | 
						|
        this.emit('update-downloaded', {}, releaseNotes, version, date, this.updateURL, () => {
 | 
						|
          this.quitAndInstall();
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  // Private: Emit both error object and message, this is to keep compatibility
 | 
						|
  // with Old APIs.
 | 
						|
  emitError (error: Error) {
 | 
						|
    this.emit('error', error, error.message);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export default new AutoUpdater();
 |