From 747890c6ada1a65b5b9fee16e1a5c562e76f19fd Mon Sep 17 00:00:00 2001 From: root Date: Fri, 14 Feb 2020 01:37:49 +0100 Subject: [PATCH] Changes of Linux development v0.0.79 --- .../development/app_bootstrap/hostUpdater.js | 21 +- .../development/app_bootstrap/splashScreen.js | 53 ++-- appasar/development/common/moduleUpdater.js | 258 ++++++++++++++---- 3 files changed, 249 insertions(+), 83 deletions(-) diff --git a/appasar/development/app_bootstrap/hostUpdater.js b/appasar/development/app_bootstrap/hostUpdater.js index c706952..11ad17d 100644 --- a/appasar/development/app_bootstrap/hostUpdater.js +++ b/appasar/development/app_bootstrap/hostUpdater.js @@ -4,22 +4,22 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _events = require('events'); - -var _squirrelUpdate = require('./squirrelUpdate'); - -var squirrelUpdate = _interopRequireWildcard(_squirrelUpdate); - var _electron = require('electron'); +var _events = require('events'); + var _request = require('./request'); var _request2 = _interopRequireDefault(_request); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _squirrelUpdate = require('./squirrelUpdate'); + +var squirrelUpdate = _interopRequireWildcard(_squirrelUpdate); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + function versionParse(verString) { return verString.split('.').map(i => parseInt(i)); } @@ -127,6 +127,13 @@ class AutoUpdaterLinux extends _events.EventEmitter { this.updateUrl = url; } + quitAndInstall() { + // Just restart. The splash screen will hit the update manually state and + // prompt the user to download the new package. + _electron.app.relaunch(); + _electron.app.quit(); + } + checkForUpdates() { const currVersion = versionParse(_electron.app.getVersion()); this.emit('checking-for-update'); diff --git a/appasar/development/app_bootstrap/splashScreen.js b/appasar/development/app_bootstrap/splashScreen.js index 2533efb..4f9d55a 100644 --- a/appasar/development/app_bootstrap/splashScreen.js +++ b/appasar/development/app_bootstrap/splashScreen.js @@ -13,6 +13,12 @@ exports.pageReady = pageReady; var _electron = require('electron'); +var _events = require('events'); + +var _fs = require('fs'); + +var _fs2 = _interopRequireDefault(_fs); + var _path = require('path'); var _path2 = _interopRequireDefault(_path); @@ -21,23 +27,17 @@ var _url = require('url'); var _url2 = _interopRequireDefault(_url); -var _events = require('events'); - var _moduleUpdater = require('../common/moduleUpdater'); var moduleUpdater = _interopRequireWildcard(_moduleUpdater); -var _ipcMain = require('./ipcMain'); - -var _ipcMain2 = _interopRequireDefault(_ipcMain); - var _paths = require('../common/paths'); var paths = _interopRequireWildcard(_paths); -var _fs = require('fs'); +var _ipcMain = require('./ipcMain'); -var _fs2 = _interopRequireDefault(_fs); +var _ipcMain2 = _interopRequireDefault(_ipcMain); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -86,6 +86,7 @@ let updateAttempt; let splashState; let launchedMainWindow; let quoteCachePath; +let restartRequired = false; function initSplash(startMinimized = false) { modulesListeners = {}; @@ -98,56 +99,68 @@ function initSplash(startMinimized = false) { updateSplashState(CHECKING_FOR_UPDATES); }); - addModulesListener(UPDATE_CHECK_FINISHED, (succeeded, updateCount, manualRequired) => { + addModulesListener(UPDATE_CHECK_FINISHED, ({ succeeded, updateCount, manualRequired }) => { stopUpdateTimeout(); if (!succeeded) { scheduleUpdateCheck(); updateSplashState(UPDATE_FAILURE); } else if (updateCount === 0) { + moduleUpdater.setInBackground(); launchMainWindow(); updateSplashState(LAUNCHING); } }); - addModulesListener(DOWNLOADING_MODULE, (name, current, total) => { + addModulesListener(DOWNLOADING_MODULE, ({ name, current, total }) => { stopUpdateTimeout(); splashState = { current, total }; updateSplashState(DOWNLOADING_UPDATES); }); - addModulesListener(DOWNLOADING_MODULE_PROGRESS, (name, progress) => { + addModulesListener(DOWNLOADING_MODULE_PROGRESS, ({ name, progress }) => { splashState.progress = progress; updateSplashState(DOWNLOADING_UPDATES); }); - addModulesListener(DOWNLOADED_MODULE, (name, current, total, succeeded) => delete splashState.progress); + addModulesListener(DOWNLOADED_MODULE, ({ name, current, total, succeeded }) => { + delete splashState.progress; + if (name === 'host') { + restartRequired = true; + } + }); - addModulesListener(DOWNLOADING_MODULES_FINISHED, (succeeded, failed) => { + addModulesListener(DOWNLOADING_MODULES_FINISHED, ({ succeeded, failed }) => { if (failed > 0) { scheduleUpdateCheck(); updateSplashState(UPDATE_FAILURE); } else { - process.nextTick(() => moduleUpdater.quitAndInstallUpdates()); + process.nextTick(() => { + if (restartRequired) { + moduleUpdater.quitAndInstallUpdates(); + } else { + moduleUpdater.installPendingUpdates(); + } + }); } }); addModulesListener(NO_PENDING_UPDATES, () => moduleUpdater.checkForUpdates()); - addModulesListener(INSTALLING_MODULE, (name, current, total) => { + addModulesListener(INSTALLING_MODULE, ({ name, current, total }) => { splashState = { current, total }; updateSplashState(INSTALLING_UPDATES); }); - addModulesListener(INSTALLED_MODULE, (name, current, total, succeeded) => delete splashState.progress); + addModulesListener(INSTALLED_MODULE, ({ name, current, total, succeeded }) => delete splashState.progress); - addModulesListener(INSTALLING_MODULE_PROGRESS, (name, progress) => { + addModulesListener(INSTALLING_MODULE_PROGRESS, ({ name, progress }) => { splashState.progress = progress; updateSplashState(INSTALLING_UPDATES); }); - addModulesListener(INSTALLING_MODULES_FINISHED, (succeeded, failed) => moduleUpdater.checkForUpdates()); + addModulesListener(INSTALLING_MODULES_FINISHED, ({ succeeded, failed }) => moduleUpdater.checkForUpdates()); - addModulesListener(UPDATE_MANUALLY, newVersion => { + addModulesListener(UPDATE_MANUALLY, ({ newVersion }) => { splashState.newVersion = newVersion; updateSplashState(UPDATE_MANUALLY); }); @@ -242,7 +255,7 @@ function launchSplashWindow(startMinimized) { } _ipcMain2.default.on('SPLASH_SCREEN_READY', () => { - let cachedQuote = chooseCachedQuote(); + const cachedQuote = chooseCachedQuote(); if (cachedQuote) { webContentsSend(splashWindow, 'SPLASH_SCREEN_QUOTE', cachedQuote); } diff --git a/appasar/development/common/moduleUpdater.js b/appasar/development/common/moduleUpdater.js index 8763c4a..b6101d8 100644 --- a/appasar/development/common/moduleUpdater.js +++ b/appasar/development/common/moduleUpdater.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.events = exports.NO_PENDING_UPDATES = exports.INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE = exports.INSTALLING_MODULES_FINISHED = exports.DOWNLOADED_MODULE = exports.UPDATE_MANUALLY = exports.DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE = exports.UPDATE_CHECK_FINISHED = exports.INSTALLED_MODULE = exports.CHECKING_FOR_UPDATES = undefined; +exports.supportsEventObjects = exports.events = exports.NO_PENDING_UPDATES = exports.INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE = exports.INSTALLING_MODULES_FINISHED = exports.DOWNLOADED_MODULE = exports.UPDATE_MANUALLY = exports.DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE = exports.UPDATE_CHECK_FINISHED = exports.INSTALLED_MODULE = exports.CHECKING_FOR_UPDATES = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // Manages additional module installation and management. // We add the module folder path to require() lookup paths here. @@ -14,6 +14,7 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument exports.initPathsOnly = initPathsOnly; exports.init = init; exports.checkForUpdates = checkForUpdates; +exports.setInBackground = setInBackground; exports.quitAndInstallUpdates = quitAndInstallUpdates; exports.isInstalled = isInstalled; exports.getInstalled = getInstalled; @@ -38,27 +39,65 @@ var _mkdirp = require('mkdirp'); var _mkdirp2 = _interopRequireDefault(_mkdirp); +var _process = require('process'); + var _yauzl = require('yauzl'); var _yauzl2 = _interopRequireDefault(_yauzl); -var _paths = require('./paths'); - -var paths = _interopRequireWildcard(_paths); - var _Backoff = require('./Backoff'); var _Backoff2 = _interopRequireDefault(_Backoff); +var _paths = require('./paths'); + +var paths = _interopRequireWildcard(_paths); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const originalFs = require('original-fs'); +// events +const CHECKING_FOR_UPDATES = exports.CHECKING_FOR_UPDATES = 'checking-for-updates'; +const INSTALLED_MODULE = exports.INSTALLED_MODULE = 'installed-module'; +const UPDATE_CHECK_FINISHED = exports.UPDATE_CHECK_FINISHED = 'update-check-finished'; +const DOWNLOADING_MODULE = exports.DOWNLOADING_MODULE = 'downloading-module'; +const DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE_PROGRESS = 'downloading-module-progress'; +const DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULES_FINISHED = 'downloading-modules-finished'; +const UPDATE_MANUALLY = exports.UPDATE_MANUALLY = 'update-manually'; +const DOWNLOADED_MODULE = exports.DOWNLOADED_MODULE = 'downloaded-module'; +const INSTALLING_MODULES_FINISHED = exports.INSTALLING_MODULES_FINISHED = 'installing-modules-finished'; +const INSTALLING_MODULE = exports.INSTALLING_MODULE = 'installing-module'; +const INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE_PROGRESS = 'installing-module-progress'; +const NO_PENDING_UPDATES = exports.NO_PENDING_UPDATES = 'no-pending-updates'; + +// settings +const ALWAYS_ALLOW_UPDATES = 'ALWAYS_ALLOW_UPDATES'; +const SKIP_HOST_UPDATE = 'SKIP_HOST_UPDATE'; +const SKIP_MODULE_UPDATE = 'SKIP_MODULE_UPDATE'; +const ALWAYS_BOOTSTRAP_MODULES = 'ALWAYS_BOOTSTRAP_MODULES'; +const USE_LOCAL_MODULE_VERSIONS = 'USE_LOCAL_MODULE_VERSIONS'; + class Events extends _events.EventEmitter { - emit(...args) { - process.nextTick(() => super.emit.apply(this, args)); + constructor() { + super(); + this.history = []; + } + + append(evt) { + evt.now = String(_process.hrtime.bigint()); + + if (this._eventIsInteresting(evt)) { + this.history.push(evt); + } + + process.nextTick(() => this.emit(evt.type, evt)); + } + + _eventIsInteresting(evt) { + return evt.type !== DOWNLOADING_MODULE_PROGRESS && evt.type !== INSTALLING_MODULE_PROGRESS; } } @@ -88,31 +127,11 @@ class LogStream { } } -// events -const CHECKING_FOR_UPDATES = exports.CHECKING_FOR_UPDATES = 'checking-for-updates'; -const INSTALLED_MODULE = exports.INSTALLED_MODULE = 'installed-module'; -const UPDATE_CHECK_FINISHED = exports.UPDATE_CHECK_FINISHED = 'update-check-finished'; -const DOWNLOADING_MODULE = exports.DOWNLOADING_MODULE = 'downloading-module'; -const DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE_PROGRESS = 'downloading-module-progress'; -const DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULES_FINISHED = 'downloading-modules-finished'; -const UPDATE_MANUALLY = exports.UPDATE_MANUALLY = 'update-manually'; -const DOWNLOADED_MODULE = exports.DOWNLOADED_MODULE = 'downloaded-module'; -const INSTALLING_MODULES_FINISHED = exports.INSTALLING_MODULES_FINISHED = 'installing-modules-finished'; -const INSTALLING_MODULE = exports.INSTALLING_MODULE = 'installing-module'; -const INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE_PROGRESS = 'installing-module-progress'; -const NO_PENDING_UPDATES = exports.NO_PENDING_UPDATES = 'no-pending-updates'; - -// settings -const ALWAYS_ALLOW_UPDATES = 'ALWAYS_ALLOW_UPDATES'; -const SKIP_HOST_UPDATE = 'SKIP_HOST_UPDATE'; -const SKIP_MODULE_UPDATE = 'SKIP_MODULE_UPDATE'; -const ALWAYS_BOOTSTRAP_MODULES = 'ALWAYS_BOOTSTRAP_MODULES'; -const USE_LOCAL_MODULE_VERSIONS = 'USE_LOCAL_MODULE_VERSIONS'; - const request = require('../app_bootstrap/request'); const REQUEST_TIMEOUT = 15000; const backoff = new _Backoff2.default(1000, 20000); const events = exports.events = new Events(); +const supportsEventObjects = exports.supportsEventObjects = true; let logger; let locallyInstalledModules; @@ -136,6 +155,7 @@ let newInstallInProgress; let localModuleVersionsFilePath; let updatable; let bootstrapManifestFilePath; +let runningInBackground = false; function initPathsOnly(_buildInfo) { if (locallyInstalledModules || moduleInstallPath) { @@ -229,14 +249,16 @@ function init(_endpoint, _settings, _buildInfo) { hostUpdater = require('../app_bootstrap/hostUpdater'); // TODO: hostUpdater constants - hostUpdater.on('checking-for-update', () => events.emit(CHECKING_FOR_UPDATES)); + hostUpdater.on('checking-for-update', () => events.append({ + type: CHECKING_FOR_UPDATES + })); hostUpdater.on('update-available', () => hostOnUpdateAvailable()); hostUpdater.on('update-progress', progress => hostOnUpdateProgress(progress)); hostUpdater.on('update-not-available', () => hostOnUpdateNotAvailable()); hostUpdater.on('update-manually', newVersion => hostOnUpdateManually(newVersion)); hostUpdater.on('update-downloaded', () => hostOnUpdateDownloaded()); hostUpdater.on('error', err => hostOnError(err)); - let setFeedURL = hostUpdater.setFeedURL.bind(hostUpdater); + const setFeedURL = hostUpdater.setFeedURL.bind(hostUpdater); remoteBaseURL = `${endpoint}/modules/${buildInfo.releaseChannel}`; // eslint-disable-next-line camelcase @@ -286,13 +308,28 @@ function cleanDownloadedModules(installedModules) { function hostOnUpdateAvailable() { logger.log(`Host update is available.`); hostUpdateAvailable = true; - events.emit(UPDATE_CHECK_FINISHED, true, 1, false); - events.emit(DOWNLOADING_MODULE, 'host', 1, 1); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: 1, + manualRequired: false + }); + events.append({ + type: DOWNLOADING_MODULE, + name: 'host', + current: 1, + total: 1, + foreground: !runningInBackground + }); } function hostOnUpdateProgress(progress) { logger.log(`Host update progress: ${progress}%`); - events.emit(DOWNLOADING_MODULE_PROGRESS, 'host', progress); + events.append({ + type: DOWNLOADING_MODULE_PROGRESS, + name: 'host', + progress: progress + }); } function hostOnUpdateNotAvailable() { @@ -300,7 +337,12 @@ function hostOnUpdateNotAvailable() { if (!skipModuleUpdate) { checkForModuleUpdates(); } else { - events.emit(UPDATE_CHECK_FINISHED, true, 0, false); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: 0, + manualRequired: false + }); } } @@ -308,15 +350,33 @@ function hostOnUpdateManually(newVersion) { logger.log(`Host update is available. Manual update required!`); hostUpdateAvailable = true; checkingForUpdates = false; - events.emit(UPDATE_MANUALLY, newVersion); - events.emit(UPDATE_CHECK_FINISHED, true, 1, true); + events.append({ + type: UPDATE_MANUALLY, + newVersion: newVersion + }); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: 1, + manualRequired: true + }); } function hostOnUpdateDownloaded() { logger.log(`Host update downloaded.`); checkingForUpdates = false; - events.emit(DOWNLOADED_MODULE, 'host', 1, 1, true); - events.emit(DOWNLOADING_MODULES_FINISHED, 1, 0); + events.append({ + type: DOWNLOADED_MODULE, + name: 'host', + current: 1, + total: 1, + succeeded: true + }); + events.append({ + type: DOWNLOADING_MODULES_FINISHED, + succeeded: 1, + failed: 0 + }); } function hostOnError(err) { @@ -331,10 +391,25 @@ function hostOnError(err) { checkingForUpdates = false; if (!hostUpdateAvailable) { - events.emit(UPDATE_CHECK_FINISHED, false, 0, false); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: false, + updateCount: 0, + manualRequired: false + }); } else { - events.emit(DOWNLOADED_MODULE, 'host', 1, 1, false); - events.emit(DOWNLOADING_MODULES_FINISHED, 0, 1); + events.append({ + type: DOWNLOADED_MODULE, + name: 'host', + current: 1, + total: 1, + succeeded: false + }); + events.append({ + type: DOWNLOADING_MODULES_FINISHED, + succeeded: 0, + failed: 1 + }); } } @@ -344,7 +419,7 @@ function checkForUpdates() { checkingForUpdates = true; hostUpdateAvailable = false; if (skipHostUpdate) { - events.emit(CHECKING_FOR_UPDATES); + events.append({ type: CHECKING_FOR_UPDATES }); hostOnUpdateNotAvailable(); } else { logger.log('Checking for host updates.'); @@ -352,6 +427,14 @@ function checkForUpdates() { } } +// Indicates that the initial update process is complete and that future updates +// are background updates. This merely affects the content of the events sent to +// the app so that analytics can correctly attribute module download/installs +// depending on whether they were ui-blocking or not. +function setInBackground() { + runningInBackground = true; +} + function getRemoteModuleName(name) { if (process.platform === 'win32' && process.arch === 'x64') { return `${name}.x64`; @@ -381,7 +464,12 @@ function checkForModuleUpdates() { if (err) { logger.log(`Failed fetching module versions: ${String(err)}`); - events.emit(UPDATE_CHECK_FINISHED, false, 0, false); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: false, + updateCount: 0, + manualRequired: false + }); return; } @@ -412,7 +500,12 @@ function checkForModuleUpdates() { } } - events.emit(UPDATE_CHECK_FINISHED, true, updatesToDownload.length, false); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: updatesToDownload.length, + manualRequired: false + }); if (updatesToDownload.length === 0) { logger.log(`No module updates available.`); } else { @@ -435,7 +528,13 @@ function processDownloadQueue() { const queuedModule = download.queue[download.next]; download.next += 1; - events.emit(DOWNLOADING_MODULE, queuedModule.name, download.next, download.queue.length); + events.append({ + type: DOWNLOADING_MODULE, + name: queuedModule.name, + current: download.next, + total: download.queue.length, + foreground: !runningInBackground + }); let totalBytes = 1; let receivedBytes = 0; @@ -469,7 +568,7 @@ function processDownloadQueue() { logger.log(`Streaming ${queuedModule.name}@${queuedModule.version} [${totalBytes} bytes] to ${moduleZipPath}`); const stream = _fs2.default.createWriteStream(moduleZipPath); - stream.on('finish', () => finishModuleDownload(queuedModule.name, queuedModule.version, moduleZipPath, response.statusCode === 200)); + stream.on('finish', () => finishModuleDownload(queuedModule.name, queuedModule.version, moduleZipPath, receivedBytes, response.statusCode === 200)); response.on('data', chunk => { receivedBytes += chunk.length; @@ -479,7 +578,11 @@ function processDownloadQueue() { const newProgress = Math.min(Math.floor(100 * fraction), 100); if (progress != newProgress) { progress = newProgress; - events.emit(DOWNLOADING_MODULE_PROGRESS, queuedModule.name, progress); + events.append({ + type: DOWNLOADING_MODULE_PROGRESS, + name: queuedModule.name, + progress: progress + }); } }); @@ -495,7 +598,7 @@ function commitInstalledModules() { _fs2.default.writeFileSync(installedModulesFilePath, data); } -function finishModuleDownload(name, version, zipfile, succeeded) { +function finishModuleDownload(name, version, zipfile, receivedBytes, succeeded) { if (!installedModules[name]) { installedModules[name] = {}; } @@ -508,12 +611,23 @@ function finishModuleDownload(name, version, zipfile, succeeded) { download.failures += 1; } - events.emit(DOWNLOADED_MODULE, name, download.next, download.queue.length, succeeded); + events.append({ + type: DOWNLOADED_MODULE, + name: name, + current: download.next, + total: download.queue.length, + succeeded: succeeded, + receivedBytes: receivedBytes + }); if (download.next >= download.queue.length) { const successes = download.queue.length - download.failures; logger.log(`Finished module downloads. [success: ${successes}] [failure: ${download.failures}]`); - events.emit(DOWNLOADING_MODULES_FINISHED, successes, download.failures); + events.append({ + type: DOWNLOADING_MODULES_FINISHED, + succeeded: successes, + failed: download.failures + }); download.queue = []; download.next = 0; download.failures = 0; @@ -550,9 +664,19 @@ function processUnzipQueue() { unzip.active = true; const queuedModule = unzip.queue[unzip.next]; + const installedModule = installedModules[queuedModule.name]; + const installedVersion = installedModule != null ? installedModule.installedVersion : null; unzip.next += 1; - events.emit(INSTALLING_MODULE, queuedModule.name, unzip.next, unzip.queue.length); + events.append({ + type: INSTALLING_MODULE, + name: queuedModule.name, + current: unzip.next, + total: unzip.queue.length, + foreground: !runningInBackground, + oldVersion: installedVersion, + newVersion: queuedModule.version + }); let hasErrored = false; const onError = (error, zipfile) => { @@ -583,7 +707,11 @@ function processUnzipQueue() { zipfile.on('entry', entry => { processedEntries += 1; const percent = Math.min(Math.floor(processedEntries / totalEntries * 100), 100); - events.emit(INSTALLING_MODULE_PROGRESS, queuedModule.name, percent); + events.append({ + type: INSTALLING_MODULE_PROGRESS, + name: queuedModule.name, + progress: percent + }); // skip directories if (/\/$/.test(entry.fileName)) { @@ -668,7 +796,13 @@ function finishModuleUnzip(unzippedModule, succeeded) { unzip.failures += 1; } - events.emit(INSTALLED_MODULE, unzippedModule.name, unzip.next, unzip.queue.length, succeeded); + events.append({ + type: INSTALLED_MODULE, + name: unzippedModule.name, + current: unzip.next, + total: unzip.queue.length, + succeeded: succeeded + }); if (unzip.next >= unzip.queue.length) { const successes = unzip.queue.length - unzip.failures; @@ -678,7 +812,11 @@ function finishModuleUnzip(unzippedModule, succeeded) { unzip.next = 0; unzip.failures = 0; unzip.active = false; - events.emit(INSTALLING_MODULES_FINISHED, successes, unzip.failures); + events.append({ + type: INSTALLING_MODULES_FINISHED, + succeeded: successes, + failed: unzip.failures + }); return; } @@ -722,7 +860,13 @@ function install(name, defer, options) { let { version, authToken } = options || {}; if (isInstalled(name, version)) { if (!defer) { - events.emit(INSTALLED_MODULE, name, 1, 1, true); + events.append({ + type: INSTALLED_MODULE, + name: name, + current: 1, + total: 1, + succeeded: true + }); } return; } @@ -780,6 +924,8 @@ function installPendingUpdates() { updatesToInstall.forEach(e => addModuleToUnzipQueue(e.moduleName, e.update, e.zipfile)); } else { logger.log('No updates to install'); - events.emit(NO_PENDING_UPDATES); + events.append({ + type: NO_PENDING_UPDATES + }); } } \ No newline at end of file