107 lines
5.2 KiB
JavaScript
107 lines
5.2 KiB
JavaScript
"use strict";
|
|
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ConsoleReporter = exports.SilentReporter = exports.ProgressReportStage = void 0;
|
|
/** Stages of progress while downloading VS Code */
|
|
var ProgressReportStage;
|
|
(function (ProgressReportStage) {
|
|
/** Initial fetch of the latest version if not explicitly given */
|
|
ProgressReportStage["FetchingVersion"] = "fetchingVersion";
|
|
/** Always fired when the version is determined. */
|
|
ProgressReportStage["ResolvedVersion"] = "resolvedVersion";
|
|
/** Fired before fetching info about the latest Insiders version, when requesting insiders builds */
|
|
ProgressReportStage["FetchingInsidersMetadata"] = "fetchingInsidersMetadata";
|
|
/** Fired if the current Insiders is out of date */
|
|
ProgressReportStage["ReplacingOldInsiders"] = "replacingOldInsiders";
|
|
/** Fired when an existing install is found which does not require a download */
|
|
ProgressReportStage["FoundMatchingInstall"] = "foundMatchingInstall";
|
|
/** Fired before the URL to the download zip or tarball is looked up */
|
|
ProgressReportStage["ResolvingCDNLocation"] = "resolvingCDNLocation";
|
|
/** Fired continuously while a download happens */
|
|
ProgressReportStage["Downloading"] = "downloading";
|
|
/** Fired when the command is issued to do a synchronous extraction. May not fire depending on the platform and options. */
|
|
ProgressReportStage["ExtractingSynchonrously"] = "extractingSynchonrously";
|
|
/** Fired when the download fails and a retry will be attempted */
|
|
ProgressReportStage["Retrying"] = "retrying";
|
|
/** Fired after folder is downloaded and unzipped */
|
|
ProgressReportStage["NewInstallComplete"] = "newInstallComplete";
|
|
})(ProgressReportStage = exports.ProgressReportStage || (exports.ProgressReportStage = {}));
|
|
/** Silent progress reporter */
|
|
class SilentReporter {
|
|
report() {
|
|
// no-op
|
|
}
|
|
error() {
|
|
// no-op
|
|
}
|
|
}
|
|
exports.SilentReporter = SilentReporter;
|
|
/** Default progress reporter that logs VS Code download progress to console */
|
|
class ConsoleReporter {
|
|
constructor(showDownloadProgress) {
|
|
this.showDownloadProgress = showDownloadProgress;
|
|
}
|
|
report(report) {
|
|
switch (report.stage) {
|
|
case ProgressReportStage.ResolvedVersion:
|
|
this.version = report.version;
|
|
break;
|
|
case ProgressReportStage.ReplacingOldInsiders:
|
|
console.log(`Removing outdated Insiders at ${report.downloadedPath} and re-downloading.`);
|
|
console.log(`Old: ${report.oldHash} | ${report.oldDate.toISOString()}`);
|
|
console.log(`New: ${report.newHash} | ${report.newDate.toISOString()}`);
|
|
break;
|
|
case ProgressReportStage.FoundMatchingInstall:
|
|
console.log(`Found existing install in ${report.downloadedPath}. Skipping download`);
|
|
break;
|
|
case ProgressReportStage.ResolvingCDNLocation:
|
|
console.log(`Downloading VS Code ${this.version} from ${report.url}`);
|
|
break;
|
|
case ProgressReportStage.Downloading:
|
|
if (!this.showDownloadProgress && report.bytesSoFar === 0) {
|
|
console.log(`Downloading VS Code (${report.totalBytes}B)`);
|
|
}
|
|
else if (!this.downloadReport) {
|
|
this.downloadReport = { timeout: setTimeout(() => this.reportDownload(), 100), report };
|
|
}
|
|
else {
|
|
this.downloadReport.report = report;
|
|
}
|
|
break;
|
|
case ProgressReportStage.Retrying:
|
|
this.flushDownloadReport();
|
|
console.log(`Error downloading, retrying (attempt ${report.attempt} of ${report.totalAttempts}): ${report.error.message}`);
|
|
break;
|
|
case ProgressReportStage.NewInstallComplete:
|
|
this.flushDownloadReport();
|
|
console.log(`Downloaded VS Code into ${report.downloadedPath}`);
|
|
break;
|
|
}
|
|
}
|
|
error(err) {
|
|
console.error(err);
|
|
}
|
|
flushDownloadReport() {
|
|
if (this.showDownloadProgress) {
|
|
this.reportDownload();
|
|
console.log('');
|
|
}
|
|
}
|
|
reportDownload() {
|
|
if (!this.downloadReport) {
|
|
return;
|
|
}
|
|
const { totalBytes, bytesSoFar } = this.downloadReport.report;
|
|
this.downloadReport = undefined;
|
|
const percent = Math.max(0, Math.min(1, bytesSoFar / totalBytes));
|
|
const progressBarSize = 30;
|
|
const barTicks = Math.floor(percent * progressBarSize);
|
|
const progressBar = '='.repeat(barTicks) + '-'.repeat(progressBarSize - barTicks);
|
|
process.stdout.write(`\x1b[G\x1b[0KDownloading VS Code [${progressBar}] ${(percent * 100).toFixed()}%`);
|
|
}
|
|
}
|
|
exports.ConsoleReporter = ConsoleReporter;
|