@milaboratories/pl-deployments 2.15.17 → 2.15.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/common/os_and_arch.cjs +22 -28
  3. package/dist/common/os_and_arch.cjs.map +1 -1
  4. package/dist/common/os_and_arch.js +23 -26
  5. package/dist/common/os_and_arch.js.map +1 -1
  6. package/dist/common/pl_binary.cjs +35 -33
  7. package/dist/common/pl_binary.cjs.map +1 -1
  8. package/dist/common/pl_binary.d.ts +13 -18
  9. package/dist/common/pl_binary.js +33 -31
  10. package/dist/common/pl_binary.js.map +1 -1
  11. package/dist/common/pl_binary_download.cjs +143 -155
  12. package/dist/common/pl_binary_download.cjs.map +1 -1
  13. package/dist/common/pl_binary_download.d.ts +15 -48
  14. package/dist/common/pl_binary_download.js +138 -133
  15. package/dist/common/pl_binary_download.js.map +1 -1
  16. package/dist/common/pl_version.cjs +5 -6
  17. package/dist/common/pl_version.cjs.map +1 -1
  18. package/dist/common/pl_version.d.ts +4 -1
  19. package/dist/common/pl_version.js +5 -4
  20. package/dist/common/pl_version.js.map +1 -1
  21. package/dist/index.cjs +21 -25
  22. package/dist/index.d.ts +6 -6
  23. package/dist/index.js +7 -6
  24. package/dist/local/pid.cjs +14 -13
  25. package/dist/local/pid.cjs.map +1 -1
  26. package/dist/local/pid.js +11 -11
  27. package/dist/local/pid.js.map +1 -1
  28. package/dist/local/pl.cjs +194 -223
  29. package/dist/local/pl.cjs.map +1 -1
  30. package/dist/local/pl.d.ts +65 -65
  31. package/dist/local/pl.js +190 -202
  32. package/dist/local/pl.js.map +1 -1
  33. package/dist/local/process.cjs +37 -59
  34. package/dist/local/process.cjs.map +1 -1
  35. package/dist/local/process.d.ts +10 -10
  36. package/dist/local/process.js +36 -57
  37. package/dist/local/process.js.map +1 -1
  38. package/dist/local/trace.cjs +14 -17
  39. package/dist/local/trace.cjs.map +1 -1
  40. package/dist/local/trace.d.ts +6 -7
  41. package/dist/local/trace.js +15 -15
  42. package/dist/local/trace.js.map +1 -1
  43. package/dist/package.cjs +12 -0
  44. package/dist/package.cjs.map +1 -0
  45. package/dist/package.js +6 -0
  46. package/dist/package.js.map +1 -0
  47. package/dist/ssh/connection_info.cjs +36 -53
  48. package/dist/ssh/connection_info.cjs.map +1 -1
  49. package/dist/ssh/connection_info.d.ts +691 -713
  50. package/dist/ssh/connection_info.js +35 -51
  51. package/dist/ssh/connection_info.js.map +1 -1
  52. package/dist/ssh/pl.cjs +551 -638
  53. package/dist/ssh/pl.cjs.map +1 -1
  54. package/dist/ssh/pl.d.ts +120 -117
  55. package/dist/ssh/pl.js +548 -636
  56. package/dist/ssh/pl.js.map +1 -1
  57. package/dist/ssh/pl_paths.cjs +22 -24
  58. package/dist/ssh/pl_paths.cjs.map +1 -1
  59. package/dist/ssh/pl_paths.js +21 -19
  60. package/dist/ssh/pl_paths.js.map +1 -1
  61. package/dist/ssh/ssh.cjs +554 -618
  62. package/dist/ssh/ssh.cjs.map +1 -1
  63. package/dist/ssh/ssh.d.ts +139 -136
  64. package/dist/ssh/ssh.js +548 -616
  65. package/dist/ssh/ssh.js.map +1 -1
  66. package/dist/ssh/ssh_errors.cjs +45 -60
  67. package/dist/ssh/ssh_errors.cjs.map +1 -1
  68. package/dist/ssh/ssh_errors.js +45 -58
  69. package/dist/ssh/ssh_errors.js.map +1 -1
  70. package/dist/ssh/supervisord.cjs +50 -68
  71. package/dist/ssh/supervisord.cjs.map +1 -1
  72. package/dist/ssh/supervisord.d.ts +11 -21
  73. package/dist/ssh/supervisord.js +50 -66
  74. package/dist/ssh/supervisord.js.map +1 -1
  75. package/package.json +10 -10
  76. package/dist/common/os_and_arch.d.ts +0 -9
  77. package/dist/common/os_and_arch.d.ts.map +0 -1
  78. package/dist/common/pl_binary.d.ts.map +0 -1
  79. package/dist/common/pl_binary_download.d.ts.map +0 -1
  80. package/dist/common/pl_version.d.ts.map +0 -1
  81. package/dist/index.cjs.map +0 -1
  82. package/dist/index.d.ts.map +0 -1
  83. package/dist/index.js.map +0 -1
  84. package/dist/local/options.d.ts +0 -31
  85. package/dist/local/options.d.ts.map +0 -1
  86. package/dist/local/pid.d.ts +0 -4
  87. package/dist/local/pid.d.ts.map +0 -1
  88. package/dist/local/pl.d.ts.map +0 -1
  89. package/dist/local/process.d.ts.map +0 -1
  90. package/dist/local/trace.d.ts.map +0 -1
  91. package/dist/package.json.cjs +0 -8
  92. package/dist/package.json.cjs.map +0 -1
  93. package/dist/package.json.js +0 -6
  94. package/dist/package.json.js.map +0 -1
  95. package/dist/ssh/__tests__/common-utils.d.ts +0 -12
  96. package/dist/ssh/__tests__/common-utils.d.ts.map +0 -1
  97. package/dist/ssh/connection_info.d.ts.map +0 -1
  98. package/dist/ssh/pl.d.ts.map +0 -1
  99. package/dist/ssh/pl_paths.d.ts +0 -20
  100. package/dist/ssh/pl_paths.d.ts.map +0 -1
  101. package/dist/ssh/ssh.d.ts.map +0 -1
  102. package/dist/ssh/ssh_errors.d.ts +0 -29
  103. package/dist/ssh/ssh_errors.d.ts.map +0 -1
  104. package/dist/ssh/supervisord.d.ts.map +0 -1
@@ -1,172 +1,160 @@
1
- 'use strict';
2
-
3
- var fs = require('node:fs');
4
- var fsp = require('node:fs/promises');
5
- var upath = require('upath');
6
- var undici = require('undici');
7
- var node_stream = require('node:stream');
8
- var consumers = require('node:stream/consumers');
9
- var tar = require('tar');
10
- var tsHelpers = require('@milaboratories/ts-helpers');
11
- var decompress = require('decompress');
12
- var os_and_arch = require('./os_and_arch.cjs');
13
-
14
- function _interopNamespaceDefault(e) {
15
- var n = Object.create(null);
16
- if (e) {
17
- Object.keys(e).forEach(function (k) {
18
- if (k !== 'default') {
19
- var d = Object.getOwnPropertyDescriptor(e, k);
20
- Object.defineProperty(n, k, d.get ? d : {
21
- enumerable: true,
22
- get: function () { return e[k]; }
23
- });
24
- }
25
- });
26
- }
27
- n.default = e;
28
- return Object.freeze(n);
29
- }
30
-
31
- var tar__namespace = /*#__PURE__*/_interopNamespaceDefault(tar);
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ const require_os_and_arch = require('./os_and_arch.cjs');
3
+ let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
4
+ let node_fs = require("node:fs");
5
+ node_fs = require_runtime.__toESM(node_fs);
6
+ let node_fs_promises = require("node:fs/promises");
7
+ node_fs_promises = require_runtime.__toESM(node_fs_promises);
8
+ let upath = require("upath");
9
+ upath = require_runtime.__toESM(upath);
10
+ let undici = require("undici");
11
+ let node_stream = require("node:stream");
12
+ let node_stream_consumers = require("node:stream/consumers");
13
+ let tar = require("tar");
14
+ tar = require_runtime.__toESM(tar);
15
+ let decompress = require("decompress");
16
+ decompress = require_runtime.__toESM(decompress);
32
17
 
18
+ //#region src/common/pl_binary_download.ts
33
19
  const cdn = "https://cdn.platforma.bio/software";
34
- // We'll download things from Global Access if downloading from CDN has failed
35
- // (it might be that it's blocked from the company's network.)
36
20
  const gaCdn = "https://cdn-ga.pl-open.science/software";
37
- async function downloadBinaryNoExtract({ logger, baseDir, softwareName, tgzName, arch, platform, dispatcher, }) {
38
- const opts = getPathsForDownload(softwareName, tgzName, baseDir, os_and_arch.newArch(arch), os_and_arch.newOs(platform));
39
- const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;
40
- try {
41
- await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });
42
- opts.wasDownloadedFrom = archiveUrl;
43
- }
44
- catch {
45
- await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });
46
- opts.wasDownloadedFrom = alternativeArchiveGAUrl;
47
- }
48
- return opts;
21
+ async function downloadBinaryNoExtract({ logger, baseDir, softwareName, tgzName, arch, platform, dispatcher }) {
22
+ const opts = getPathsForDownload(softwareName, tgzName, baseDir, require_os_and_arch.newArch(arch), require_os_and_arch.newOs(platform));
23
+ const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;
24
+ try {
25
+ await downloadArchive({
26
+ logger,
27
+ archiveUrl,
28
+ archivePath,
29
+ dispatcher
30
+ });
31
+ opts.wasDownloadedFrom = archiveUrl;
32
+ } catch {
33
+ await downloadArchive({
34
+ logger,
35
+ archiveUrl: alternativeArchiveGAUrl,
36
+ archivePath,
37
+ dispatcher
38
+ });
39
+ opts.wasDownloadedFrom = alternativeArchiveGAUrl;
40
+ }
41
+ return opts;
49
42
  }
50
- async function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher, }) {
51
- const opts = getPathsForDownload(softwareName, archiveName, baseDir, os_and_arch.newArch(arch), os_and_arch.newOs(platform));
52
- const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;
53
- try {
54
- await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });
55
- opts.wasDownloadedFrom = archiveUrl;
56
- }
57
- catch {
58
- await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });
59
- opts.wasDownloadedFrom = alternativeArchiveGAUrl;
60
- }
61
- await extractArchive(logger, archivePath, archiveType, targetFolder);
62
- return opts;
43
+ async function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher }) {
44
+ const opts = getPathsForDownload(softwareName, archiveName, baseDir, require_os_and_arch.newArch(arch), require_os_and_arch.newOs(platform));
45
+ const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;
46
+ try {
47
+ await downloadArchive({
48
+ logger,
49
+ archiveUrl,
50
+ archivePath,
51
+ dispatcher
52
+ });
53
+ opts.wasDownloadedFrom = archiveUrl;
54
+ } catch {
55
+ await downloadArchive({
56
+ logger,
57
+ archiveUrl: alternativeArchiveGAUrl,
58
+ archivePath,
59
+ dispatcher
60
+ });
61
+ opts.wasDownloadedFrom = alternativeArchiveGAUrl;
62
+ }
63
+ await extractArchive(logger, archivePath, archiveType, targetFolder);
64
+ return opts;
63
65
  }
64
66
  function getPathsForDownload(softwareName, archiveName, baseDir, arch, os) {
65
- const baseName = `${archiveName}-${arch}`;
66
- const archiveType = osToArchiveType[os];
67
- const archiveFileName = `${baseName}.${archiveType}`;
68
- const archiveUrl = `${cdn}/${softwareName}/${os}/${archiveFileName}`;
69
- const alternativeArchiveGAUrl = `${gaCdn}/${softwareName}/${os}/${archiveFileName}`;
70
- const archivePath = upath.join(baseDir, archiveFileName);
71
- // folder where binary distribution of pl will be unpacked
72
- const targetFolder = upath.join(baseDir, baseName);
73
- return {
74
- archiveUrl,
75
- alternativeArchiveGAUrl,
76
- archivePath,
77
- archiveType,
78
- targetFolder,
79
- baseName,
80
- };
67
+ const baseName = `${archiveName}-${arch}`;
68
+ const archiveType = osToArchiveType[os];
69
+ const archiveFileName = `${baseName}.${archiveType}`;
70
+ return {
71
+ archiveUrl: `${cdn}/${softwareName}/${os}/${archiveFileName}`,
72
+ alternativeArchiveGAUrl: `${gaCdn}/${softwareName}/${os}/${archiveFileName}`,
73
+ archivePath: upath.default.join(baseDir, archiveFileName),
74
+ archiveType,
75
+ targetFolder: upath.default.join(baseDir, baseName),
76
+ baseName
77
+ };
81
78
  }
82
- async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher, }) {
83
- const state = {};
84
- state.archivePath = archivePath;
85
- try {
86
- state.fileExisted = await tsHelpers.fileExists(archivePath);
87
- if (state.fileExisted) {
88
- logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);
89
- return state;
90
- }
91
- await fsp.mkdir(upath.dirname(archivePath), { recursive: true });
92
- state.dirnameCreated = true;
93
- logger.info(`Downloading archive:\n URL: ${archiveUrl}\n Save to: ${archivePath}`);
94
- const { body, statusCode } = await undici.request(archiveUrl, { dispatcher });
95
- state.statusCode = statusCode;
96
- if (statusCode != 200) {
97
- // completely draining the stream to prevent leaving open connections
98
- const textBody = await consumers.text(body);
99
- state.errorMsg = `failed to download archive: ${statusCode}, response: ${textBody.slice(0, 1000)}`;
100
- logger.error(state.errorMsg);
101
- throw new Error(state.errorMsg);
102
- }
103
- // to prevent incomplete downloads we first write in a temp file
104
- state.tmpPath = archivePath + ".tmp";
105
- // eslint-disable-next-line n/no-unsupported-features/node-builtins
106
- await node_stream.Readable.toWeb(body).pipeTo(node_stream.Writable.toWeb(fs.createWriteStream(state.tmpPath)));
107
- state.wroteTmp = true;
108
- state.tmpExisted = await tsHelpers.fileExists(state.tmpPath);
109
- // and then atomically rename it
110
- await fsp.rename(state.tmpPath, archivePath);
111
- state.renamed = true;
112
- state.newExisted = await tsHelpers.fileExists(archivePath);
113
- return state;
114
- }
115
- catch (e) {
116
- const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;
117
- logger.error(msg);
118
- throw new Error(msg);
119
- }
79
+ async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher }) {
80
+ const state = {};
81
+ state.archivePath = archivePath;
82
+ try {
83
+ state.fileExisted = await (0, _milaboratories_ts_helpers.fileExists)(archivePath);
84
+ if (state.fileExisted) {
85
+ logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);
86
+ return state;
87
+ }
88
+ await node_fs_promises.default.mkdir(upath.default.dirname(archivePath), { recursive: true });
89
+ state.dirnameCreated = true;
90
+ logger.info(`Downloading archive:\n URL: ${archiveUrl}\n Save to: ${archivePath}`);
91
+ const { body, statusCode } = await (0, undici.request)(archiveUrl, { dispatcher });
92
+ state.statusCode = statusCode;
93
+ if (statusCode != 200) {
94
+ state.errorMsg = `failed to download archive: ${statusCode}, response: ${(await (0, node_stream_consumers.text)(body)).slice(0, 1e3)}`;
95
+ logger.error(state.errorMsg);
96
+ throw new Error(state.errorMsg);
97
+ }
98
+ state.tmpPath = archivePath + ".tmp";
99
+ await node_stream.Readable.toWeb(body).pipeTo(node_stream.Writable.toWeb(node_fs.default.createWriteStream(state.tmpPath)));
100
+ state.wroteTmp = true;
101
+ state.tmpExisted = await (0, _milaboratories_ts_helpers.fileExists)(state.tmpPath);
102
+ await node_fs_promises.default.rename(state.tmpPath, archivePath);
103
+ state.renamed = true;
104
+ state.newExisted = await (0, _milaboratories_ts_helpers.fileExists)(archivePath);
105
+ return state;
106
+ } catch (e) {
107
+ const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;
108
+ logger.error(msg);
109
+ throw new Error(msg);
110
+ }
120
111
  }
121
112
  /** Used to prevent mid-way interrupted unarchived folders to be used */
122
113
  const MarkerFileName = ".ok";
123
114
  async function extractArchive(logger, archivePath, archiveType, dstFolder) {
124
- logger.info("extracting archive...");
125
- logger.info(` archive path: '${archivePath}'`);
126
- logger.info(` target dir: '${dstFolder}'`);
127
- if (!(await tsHelpers.fileExists(archivePath))) {
128
- const msg = `Platforma Backend binary archive not found at '${archivePath}'`;
129
- logger.error(msg);
130
- throw new Error(msg);
131
- }
132
- const markerFilePath = upath.join(dstFolder, MarkerFileName);
133
- if (await tsHelpers.fileExists(markerFilePath)) {
134
- logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);
135
- return;
136
- }
137
- if (await tsHelpers.fileExists(dstFolder)) {
138
- logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);
139
- await fsp.rm(dstFolder, { recursive: true });
140
- }
141
- logger.info(` creating target dir '${dstFolder}'`);
142
- await fsp.mkdir(dstFolder, { recursive: true });
143
- logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${dstFolder}`);
144
- switch (archiveType) {
145
- case "tgz":
146
- await tar__namespace.x({
147
- file: archivePath,
148
- cwd: dstFolder,
149
- gzip: true,
150
- });
151
- break;
152
- case "zip":
153
- await decompress(archivePath, dstFolder);
154
- break;
155
- default:
156
- tsHelpers.assertNever(archiveType);
157
- }
158
- // writing marker file, to be able in the future detect that we completely unarchived the tar file
159
- await fsp.writeFile(markerFilePath, "ok");
160
- logger.info(` ... unpack done.`);
115
+ logger.info("extracting archive...");
116
+ logger.info(` archive path: '${archivePath}'`);
117
+ logger.info(` target dir: '${dstFolder}'`);
118
+ if (!await (0, _milaboratories_ts_helpers.fileExists)(archivePath)) {
119
+ const msg = `Platforma Backend binary archive not found at '${archivePath}'`;
120
+ logger.error(msg);
121
+ throw new Error(msg);
122
+ }
123
+ const markerFilePath = upath.default.join(dstFolder, MarkerFileName);
124
+ if (await (0, _milaboratories_ts_helpers.fileExists)(markerFilePath)) {
125
+ logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);
126
+ return;
127
+ }
128
+ if (await (0, _milaboratories_ts_helpers.fileExists)(dstFolder)) {
129
+ logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);
130
+ await node_fs_promises.default.rm(dstFolder, { recursive: true });
131
+ }
132
+ logger.info(` creating target dir '${dstFolder}'`);
133
+ await node_fs_promises.default.mkdir(dstFolder, { recursive: true });
134
+ logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${dstFolder}`);
135
+ switch (archiveType) {
136
+ case "tgz":
137
+ await tar.x({
138
+ file: archivePath,
139
+ cwd: dstFolder,
140
+ gzip: true
141
+ });
142
+ break;
143
+ case "zip":
144
+ await (0, decompress.default)(archivePath, dstFolder);
145
+ break;
146
+ default: (0, _milaboratories_ts_helpers.assertNever)(archiveType);
147
+ }
148
+ await node_fs_promises.default.writeFile(markerFilePath, "ok");
149
+ logger.info(` ... unpack done.`);
161
150
  }
162
151
  const osToArchiveType = {
163
- linux: "tgz",
164
- macos: "tgz",
165
- windows: "zip",
152
+ linux: "tgz",
153
+ macos: "tgz",
154
+ windows: "zip"
166
155
  };
167
156
 
168
- exports.downloadArchive = downloadArchive;
157
+ //#endregion
169
158
  exports.downloadBinary = downloadBinary;
170
159
  exports.downloadBinaryNoExtract = downloadBinaryNoExtract;
171
- exports.extractArchive = extractArchive;
172
- //# sourceMappingURL=pl_binary_download.cjs.map
160
+ //# sourceMappingURL=pl_binary_download.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl_binary_download.cjs","sources":["../../src/common/pl_binary_download.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport upath from \"upath\";\nimport type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { Writable, Readable } from \"node:stream\";\nimport { text } from \"node:stream/consumers\";\nimport * as tar from \"tar\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { assertNever, fileExists } from \"@milaboratories/ts-helpers\";\nimport decompress from \"decompress\";\nimport type { ArchType, OSType } from \"./os_and_arch\";\nimport { newOs, newArch } from \"./os_and_arch\";\n\nconst cdn = \"https://cdn.platforma.bio/software\";\n// We'll download things from Global Access if downloading from CDN has failed\n// (it might be that it's blocked from the company's network.)\nconst gaCdn = \"https://cdn-ga.pl-open.science/software\";\n\nexport type DownloadBinaryResult = {\n archiveUrl: string;\n alternativeArchiveGAUrl: string;\n wasDownloadedFrom?: string;\n archivePath: string;\n archiveType: ArchiveType;\n targetFolder: string;\n baseName: string;\n};\n\nexport async function downloadBinaryNoExtract({\n logger,\n baseDir,\n softwareName,\n tgzName,\n arch,\n platform,\n dispatcher,\n}: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n tgzName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(softwareName, tgzName, baseDir, newArch(arch), newOs(platform));\n const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;\n\n try {\n await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch {\n await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n return opts;\n}\n\nexport async function downloadBinary({\n logger,\n baseDir,\n softwareName,\n archiveName,\n arch,\n platform,\n dispatcher,\n}: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n archiveName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(\n softwareName,\n archiveName,\n baseDir,\n newArch(arch),\n newOs(platform),\n );\n const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;\n\n try {\n await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch {\n await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n await extractArchive(logger, archivePath, archiveType, targetFolder);\n\n return opts;\n}\n\nfunction getPathsForDownload(\n softwareName: string,\n archiveName: string,\n baseDir: string,\n arch: ArchType,\n os: OSType,\n): DownloadBinaryResult {\n const baseName = `${archiveName}-${arch}`;\n const archiveType = osToArchiveType[os];\n\n const archiveFileName = `${baseName}.${archiveType}`;\n const archiveUrl = `${cdn}/${softwareName}/${os}/${archiveFileName}`;\n const alternativeArchiveGAUrl = `${gaCdn}/${softwareName}/${os}/${archiveFileName}`;\n const archivePath = upath.join(baseDir, archiveFileName);\n // folder where binary distribution of pl will be unpacked\n const targetFolder = upath.join(baseDir, baseName);\n\n return {\n archiveUrl,\n alternativeArchiveGAUrl,\n archivePath,\n archiveType,\n targetFolder,\n baseName,\n };\n}\n\nexport type DownloadInfo = {\n archivePath?: string;\n fileExisted?: boolean;\n dirnameCreated?: boolean;\n statusCode?: number;\n errorMsg?: string;\n tmpPath?: string;\n wroteTmp?: boolean;\n tmpExisted?: boolean;\n renamed?: boolean;\n newExisted?: boolean;\n};\n\nexport async function downloadArchive({\n logger,\n archiveUrl,\n archivePath,\n dispatcher,\n}: {\n logger: MiLogger;\n archiveUrl: string;\n archivePath: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadInfo> {\n const state: DownloadInfo = {};\n state.archivePath = archivePath;\n\n try {\n state.fileExisted = await fileExists(archivePath);\n if (state.fileExisted) {\n logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);\n return state;\n }\n\n await fsp.mkdir(upath.dirname(archivePath), { recursive: true });\n state.dirnameCreated = true;\n\n logger.info(`Downloading archive:\\n URL: ${archiveUrl}\\n Save to: ${archivePath}`);\n\n const { body, statusCode } = await request(archiveUrl, { dispatcher });\n state.statusCode = statusCode;\n if (statusCode != 200) {\n // completely draining the stream to prevent leaving open connections\n const textBody = await text(body);\n state.errorMsg = `failed to download archive: ${statusCode}, response: ${textBody.slice(0, 1000)}`;\n logger.error(state.errorMsg);\n throw new Error(state.errorMsg);\n }\n\n // to prevent incomplete downloads we first write in a temp file\n state.tmpPath = archivePath + \".tmp\";\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));\n state.wroteTmp = true;\n state.tmpExisted = await fileExists(state.tmpPath);\n\n // and then atomically rename it\n await fsp.rename(state.tmpPath, archivePath);\n state.renamed = true;\n state.newExisted = await fileExists(archivePath);\n\n return state;\n } catch (e: unknown) {\n const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;\n logger.error(msg);\n throw new Error(msg);\n }\n}\n\n/** Used to prevent mid-way interrupted unarchived folders to be used */\nconst MarkerFileName = \".ok\";\n\nexport async function extractArchive(\n logger: MiLogger,\n archivePath: string,\n archiveType: ArchiveType,\n dstFolder: string,\n) {\n logger.info(\"extracting archive...\");\n logger.info(` archive path: '${archivePath}'`);\n logger.info(` target dir: '${dstFolder}'`);\n\n if (!(await fileExists(archivePath))) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n const markerFilePath = upath.join(dstFolder, MarkerFileName);\n\n if (await fileExists(markerFilePath)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);\n return;\n }\n\n if (await fileExists(dstFolder)) {\n logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);\n await fsp.rm(dstFolder, { recursive: true });\n }\n\n logger.info(` creating target dir '${dstFolder}'`);\n await fsp.mkdir(dstFolder, { recursive: true });\n\n logger.info(\n `Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${dstFolder}`,\n );\n\n switch (archiveType) {\n case \"tgz\":\n await tar.x({\n file: archivePath,\n cwd: dstFolder,\n gzip: true,\n });\n break;\n\n case \"zip\":\n await decompress(archivePath, dstFolder);\n break;\n\n default:\n assertNever(archiveType);\n }\n\n // writing marker file, to be able in the future detect that we completely unarchived the tar file\n await fsp.writeFile(markerFilePath, \"ok\");\n\n logger.info(` ... unpack done.`);\n}\n\nexport type ArchiveType = \"tgz\" | \"zip\";\n\nconst osToArchiveType: Record<OSType, ArchiveType> = {\n linux: \"tgz\",\n macos: \"tgz\",\n windows: \"zip\",\n};\n"],"names":["newArch","newOs","fileExists","request","text","Readable","Writable","tar","assertNever"],"mappings":"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"}
1
+ {"version":3,"file":"pl_binary_download.cjs","names":["newArch","newOs","fsp","Readable","Writable","fs"],"sources":["../../src/common/pl_binary_download.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport upath from \"upath\";\nimport type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { Writable, Readable } from \"node:stream\";\nimport { text } from \"node:stream/consumers\";\nimport * as tar from \"tar\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { assertNever, fileExists } from \"@milaboratories/ts-helpers\";\nimport decompress from \"decompress\";\nimport type { ArchType, OSType } from \"./os_and_arch\";\nimport { newOs, newArch } from \"./os_and_arch\";\n\nconst cdn = \"https://cdn.platforma.bio/software\";\n// We'll download things from Global Access if downloading from CDN has failed\n// (it might be that it's blocked from the company's network.)\nconst gaCdn = \"https://cdn-ga.pl-open.science/software\";\n\nexport type DownloadBinaryResult = {\n archiveUrl: string;\n alternativeArchiveGAUrl: string;\n wasDownloadedFrom?: string;\n archivePath: string;\n archiveType: ArchiveType;\n targetFolder: string;\n baseName: string;\n};\n\nexport async function downloadBinaryNoExtract({\n logger,\n baseDir,\n softwareName,\n tgzName,\n arch,\n platform,\n dispatcher,\n}: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n tgzName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(softwareName, tgzName, baseDir, newArch(arch), newOs(platform));\n const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;\n\n try {\n await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch {\n await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n return opts;\n}\n\nexport async function downloadBinary({\n logger,\n baseDir,\n softwareName,\n archiveName,\n arch,\n platform,\n dispatcher,\n}: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n archiveName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(\n softwareName,\n archiveName,\n baseDir,\n newArch(arch),\n newOs(platform),\n );\n const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;\n\n try {\n await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch {\n await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n await extractArchive(logger, archivePath, archiveType, targetFolder);\n\n return opts;\n}\n\nfunction getPathsForDownload(\n softwareName: string,\n archiveName: string,\n baseDir: string,\n arch: ArchType,\n os: OSType,\n): DownloadBinaryResult {\n const baseName = `${archiveName}-${arch}`;\n const archiveType = osToArchiveType[os];\n\n const archiveFileName = `${baseName}.${archiveType}`;\n const archiveUrl = `${cdn}/${softwareName}/${os}/${archiveFileName}`;\n const alternativeArchiveGAUrl = `${gaCdn}/${softwareName}/${os}/${archiveFileName}`;\n const archivePath = upath.join(baseDir, archiveFileName);\n // folder where binary distribution of pl will be unpacked\n const targetFolder = upath.join(baseDir, baseName);\n\n return {\n archiveUrl,\n alternativeArchiveGAUrl,\n archivePath,\n archiveType,\n targetFolder,\n baseName,\n };\n}\n\nexport type DownloadInfo = {\n archivePath?: string;\n fileExisted?: boolean;\n dirnameCreated?: boolean;\n statusCode?: number;\n errorMsg?: string;\n tmpPath?: string;\n wroteTmp?: boolean;\n tmpExisted?: boolean;\n renamed?: boolean;\n newExisted?: boolean;\n};\n\nexport async function downloadArchive({\n logger,\n archiveUrl,\n archivePath,\n dispatcher,\n}: {\n logger: MiLogger;\n archiveUrl: string;\n archivePath: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadInfo> {\n const state: DownloadInfo = {};\n state.archivePath = archivePath;\n\n try {\n state.fileExisted = await fileExists(archivePath);\n if (state.fileExisted) {\n logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);\n return state;\n }\n\n await fsp.mkdir(upath.dirname(archivePath), { recursive: true });\n state.dirnameCreated = true;\n\n logger.info(`Downloading archive:\\n URL: ${archiveUrl}\\n Save to: ${archivePath}`);\n\n const { body, statusCode } = await request(archiveUrl, { dispatcher });\n state.statusCode = statusCode;\n if (statusCode != 200) {\n // completely draining the stream to prevent leaving open connections\n const textBody = await text(body);\n state.errorMsg = `failed to download archive: ${statusCode}, response: ${textBody.slice(0, 1000)}`;\n logger.error(state.errorMsg);\n throw new Error(state.errorMsg);\n }\n\n // to prevent incomplete downloads we first write in a temp file\n state.tmpPath = archivePath + \".tmp\";\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));\n state.wroteTmp = true;\n state.tmpExisted = await fileExists(state.tmpPath);\n\n // and then atomically rename it\n await fsp.rename(state.tmpPath, archivePath);\n state.renamed = true;\n state.newExisted = await fileExists(archivePath);\n\n return state;\n } catch (e: unknown) {\n const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;\n logger.error(msg);\n throw new Error(msg);\n }\n}\n\n/** Used to prevent mid-way interrupted unarchived folders to be used */\nconst MarkerFileName = \".ok\";\n\nexport async function extractArchive(\n logger: MiLogger,\n archivePath: string,\n archiveType: ArchiveType,\n dstFolder: string,\n) {\n logger.info(\"extracting archive...\");\n logger.info(` archive path: '${archivePath}'`);\n logger.info(` target dir: '${dstFolder}'`);\n\n if (!(await fileExists(archivePath))) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n const markerFilePath = upath.join(dstFolder, MarkerFileName);\n\n if (await fileExists(markerFilePath)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);\n return;\n }\n\n if (await fileExists(dstFolder)) {\n logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);\n await fsp.rm(dstFolder, { recursive: true });\n }\n\n logger.info(` creating target dir '${dstFolder}'`);\n await fsp.mkdir(dstFolder, { recursive: true });\n\n logger.info(\n `Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${dstFolder}`,\n );\n\n switch (archiveType) {\n case \"tgz\":\n await tar.x({\n file: archivePath,\n cwd: dstFolder,\n gzip: true,\n });\n break;\n\n case \"zip\":\n await decompress(archivePath, dstFolder);\n break;\n\n default:\n assertNever(archiveType);\n }\n\n // writing marker file, to be able in the future detect that we completely unarchived the tar file\n await fsp.writeFile(markerFilePath, \"ok\");\n\n logger.info(` ... unpack done.`);\n}\n\nexport type ArchiveType = \"tgz\" | \"zip\";\n\nconst osToArchiveType: Record<OSType, ArchiveType> = {\n linux: \"tgz\",\n macos: \"tgz\",\n windows: \"zip\",\n};\n"],"mappings":"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"}
@@ -1,50 +1,17 @@
1
- import type { Dispatcher } from "undici";
2
- import type { MiLogger } from "@milaboratories/ts-helpers";
3
- export type DownloadBinaryResult = {
4
- archiveUrl: string;
5
- alternativeArchiveGAUrl: string;
6
- wasDownloadedFrom?: string;
7
- archivePath: string;
8
- archiveType: ArchiveType;
9
- targetFolder: string;
10
- baseName: string;
1
+ import { MiLogger } from "@milaboratories/ts-helpers";
2
+ import { Dispatcher } from "undici";
3
+
4
+ //#region src/common/pl_binary_download.d.ts
5
+ type DownloadBinaryResult = {
6
+ archiveUrl: string;
7
+ alternativeArchiveGAUrl: string;
8
+ wasDownloadedFrom?: string;
9
+ archivePath: string;
10
+ archiveType: ArchiveType;
11
+ targetFolder: string;
12
+ baseName: string;
11
13
  };
12
- export declare function downloadBinaryNoExtract({ logger, baseDir, softwareName, tgzName, arch, platform, dispatcher, }: {
13
- logger: MiLogger;
14
- baseDir: string;
15
- softwareName: string;
16
- tgzName: string;
17
- arch: string;
18
- platform: string;
19
- dispatcher?: Dispatcher;
20
- }): Promise<DownloadBinaryResult>;
21
- export declare function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher, }: {
22
- logger: MiLogger;
23
- baseDir: string;
24
- softwareName: string;
25
- archiveName: string;
26
- arch: string;
27
- platform: string;
28
- dispatcher?: Dispatcher;
29
- }): Promise<DownloadBinaryResult>;
30
- export type DownloadInfo = {
31
- archivePath?: string;
32
- fileExisted?: boolean;
33
- dirnameCreated?: boolean;
34
- statusCode?: number;
35
- errorMsg?: string;
36
- tmpPath?: string;
37
- wroteTmp?: boolean;
38
- tmpExisted?: boolean;
39
- renamed?: boolean;
40
- newExisted?: boolean;
41
- };
42
- export declare function downloadArchive({ logger, archiveUrl, archivePath, dispatcher, }: {
43
- logger: MiLogger;
44
- archiveUrl: string;
45
- archivePath: string;
46
- dispatcher?: Dispatcher;
47
- }): Promise<DownloadInfo>;
48
- export declare function extractArchive(logger: MiLogger, archivePath: string, archiveType: ArchiveType, dstFolder: string): Promise<void>;
49
- export type ArchiveType = "tgz" | "zip";
14
+ type ArchiveType = "tgz" | "zip";
15
+ //#endregion
16
+ export { DownloadBinaryResult };
50
17
  //# sourceMappingURL=pl_binary_download.d.ts.map