progress.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. "use strict";
  2. /*---------------------------------------------------------------------------------------------
  3. * Copyright (c) Microsoft Corporation. All rights reserved.
  4. * Licensed under the MIT License. See License.txt in the project root for license information.
  5. *--------------------------------------------------------------------------------------------*/
  6. Object.defineProperty(exports, "__esModule", { value: true });
  7. exports.makeConsoleReporter = exports.SilentReporter = exports.ProgressReportStage = void 0;
  8. /** Stages of progress while downloading VS Code */
  9. var ProgressReportStage;
  10. (function (ProgressReportStage) {
  11. /** Initial fetch of the latest version if not explicitly given */
  12. ProgressReportStage["FetchingVersion"] = "fetchingVersion";
  13. /** Always fired when the version is determined. */
  14. ProgressReportStage["ResolvedVersion"] = "resolvedVersion";
  15. /** Fired before fetching info about the latest Insiders version, when requesting insiders builds */
  16. ProgressReportStage["FetchingInsidersMetadata"] = "fetchingInsidersMetadata";
  17. /** Fired if the current Insiders is out of date */
  18. ProgressReportStage["ReplacingOldInsiders"] = "replacingOldInsiders";
  19. /** Fired when an existing install is found which does not require a download */
  20. ProgressReportStage["FoundMatchingInstall"] = "foundMatchingInstall";
  21. /** Fired before the URL to the download zip or tarball is looked up */
  22. ProgressReportStage["ResolvingCDNLocation"] = "resolvingCDNLocation";
  23. /** Fired continuously while a download happens */
  24. ProgressReportStage["Downloading"] = "downloading";
  25. /** Fired when the command is issued to do a synchronous extraction. May not fire depending on the platform and options. */
  26. ProgressReportStage["ExtractingSynchonrously"] = "extractingSynchonrously";
  27. /** Fired when the download fails and a retry will be attempted */
  28. ProgressReportStage["Retrying"] = "retrying";
  29. /** Fired after folder is downloaded and unzipped */
  30. ProgressReportStage["NewInstallComplete"] = "newInstallComplete";
  31. })(ProgressReportStage || (exports.ProgressReportStage = ProgressReportStage = {}));
  32. /** Silent progress reporter */
  33. class SilentReporter {
  34. report() {
  35. // no-op
  36. }
  37. error() {
  38. // no-op
  39. }
  40. }
  41. exports.SilentReporter = SilentReporter;
  42. /** Default progress reporter that logs VS Code download progress to console */
  43. const makeConsoleReporter = async () => {
  44. // needs to be async targeting Node 16 because ora is an es module that cannot be required
  45. const { default: ora } = await import('ora');
  46. let version;
  47. let spinner = ora('Resolving version...').start();
  48. function toMB(bytes) {
  49. return (bytes / 1024 / 1024).toFixed(2);
  50. }
  51. return {
  52. error(err) {
  53. if (spinner) {
  54. spinner?.fail(`Error: ${err}`);
  55. spinner = undefined;
  56. }
  57. else {
  58. console.error(err);
  59. }
  60. },
  61. report(report) {
  62. switch (report.stage) {
  63. case ProgressReportStage.ResolvedVersion:
  64. version = report.version;
  65. spinner?.succeed(`Validated version: ${version}`);
  66. spinner = undefined;
  67. break;
  68. case ProgressReportStage.ReplacingOldInsiders:
  69. spinner?.succeed();
  70. spinner = ora(`Updating Insiders ${report.oldHash} (${report.oldDate.toISOString()}) -> ${report.newHash}`).start();
  71. break;
  72. case ProgressReportStage.FoundMatchingInstall:
  73. spinner?.succeed();
  74. spinner = undefined;
  75. ora(`Found existing install in ${report.downloadedPath}`).succeed();
  76. break;
  77. case ProgressReportStage.ResolvingCDNLocation:
  78. spinner?.succeed();
  79. spinner = ora(`Found at ${report.url}`).start();
  80. break;
  81. case ProgressReportStage.Downloading:
  82. if (report.bytesSoFar === 0) {
  83. spinner?.succeed();
  84. spinner = ora(`Downloading (${toMB(report.totalBytes)} MB)`).start();
  85. }
  86. else if (spinner) {
  87. if (report.bytesSoFar === report.totalBytes) {
  88. spinner.text = 'Extracting...';
  89. }
  90. else {
  91. const percent = Math.max(0, Math.min(1, report.bytesSoFar / report.totalBytes));
  92. const size = `${toMB(report.bytesSoFar)}/${toMB(report.totalBytes)}MB`;
  93. spinner.text = `Downloading VS Code: ${size} (${(percent * 100).toFixed()}%)`;
  94. }
  95. }
  96. break;
  97. case ProgressReportStage.Retrying:
  98. spinner?.fail(`Error downloading, retrying (attempt ${report.attempt} of ${report.totalAttempts}): ${report.error.message}`);
  99. spinner = undefined;
  100. break;
  101. case ProgressReportStage.NewInstallComplete:
  102. spinner?.succeed(`Downloaded VS Code into ${report.downloadedPath}`);
  103. spinner = undefined;
  104. break;
  105. }
  106. },
  107. };
  108. };
  109. exports.makeConsoleReporter = makeConsoleReporter;