Changes of Linux development v0.0.79
This commit is contained in:
parent
06d416c21a
commit
747890c6ad
3 changed files with 249 additions and 83 deletions
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue