@milaboratories/pl-deployments 2.4.7 → 2.4.9

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 (98) hide show
  1. package/dist/common/os_and_arch.cjs +39 -0
  2. package/dist/common/os_and_arch.cjs.map +1 -0
  3. package/dist/common/os_and_arch.d.ts +0 -1
  4. package/dist/common/os_and_arch.js +34 -0
  5. package/dist/common/os_and_arch.js.map +1 -0
  6. package/dist/common/pl_binary.cjs +34 -0
  7. package/dist/common/pl_binary.cjs.map +1 -0
  8. package/dist/common/pl_binary.d.ts +0 -1
  9. package/dist/common/pl_binary.js +30 -0
  10. package/dist/common/pl_binary.js.map +1 -0
  11. package/dist/common/pl_binary_download.cjs +172 -0
  12. package/dist/common/pl_binary_download.cjs.map +1 -0
  13. package/dist/common/pl_binary_download.d.ts +0 -1
  14. package/dist/common/pl_binary_download.js +148 -0
  15. package/dist/common/pl_binary_download.js.map +1 -0
  16. package/dist/common/pl_version.cjs +11 -0
  17. package/dist/common/pl_version.cjs.map +1 -0
  18. package/dist/common/pl_version.d.ts +0 -1
  19. package/dist/common/pl_version.js +9 -0
  20. package/dist/common/pl_version.js.map +1 -0
  21. package/dist/index.cjs +26 -0
  22. package/dist/index.cjs.map +1 -0
  23. package/dist/index.d.ts +0 -1
  24. package/dist/index.js +5 -64
  25. package/dist/index.js.map +1 -1
  26. package/dist/local/options.d.ts +0 -1
  27. package/dist/local/pid.cjs +24 -0
  28. package/dist/local/pid.cjs.map +1 -0
  29. package/dist/local/pid.d.ts +0 -1
  30. package/dist/local/pid.js +20 -0
  31. package/dist/local/pid.js.map +1 -0
  32. package/dist/local/pl.cjs +223 -0
  33. package/dist/local/pl.cjs.map +1 -0
  34. package/dist/local/pl.d.ts +0 -1
  35. package/dist/local/pl.js +198 -0
  36. package/dist/local/pl.js.map +1 -0
  37. package/dist/local/process.cjs +77 -0
  38. package/dist/local/process.cjs.map +1 -0
  39. package/dist/local/process.d.ts +1 -2
  40. package/dist/local/process.js +72 -0
  41. package/dist/local/process.js.map +1 -0
  42. package/dist/local/trace.cjs +27 -0
  43. package/dist/local/trace.cjs.map +1 -0
  44. package/dist/local/trace.d.ts +0 -1
  45. package/dist/local/trace.js +23 -0
  46. package/dist/local/trace.js.map +1 -0
  47. package/dist/package.json.cjs +7 -0
  48. package/dist/package.json.cjs.map +1 -0
  49. package/dist/package.json.js +5 -0
  50. package/dist/package.json.js.map +1 -0
  51. package/dist/ssh/__tests__/common-utils.d.ts +0 -1
  52. package/dist/ssh/connection_info.cjs +62 -0
  53. package/dist/ssh/connection_info.cjs.map +1 -0
  54. package/dist/ssh/connection_info.d.ts +0 -1
  55. package/dist/ssh/connection_info.js +55 -0
  56. package/dist/ssh/connection_info.js.map +1 -0
  57. package/dist/ssh/pl.cjs +500 -0
  58. package/dist/ssh/pl.cjs.map +1 -0
  59. package/dist/ssh/pl.d.ts +0 -1
  60. package/dist/ssh/pl.js +497 -0
  61. package/dist/ssh/pl.js.map +1 -0
  62. package/dist/ssh/pl_paths.cjs +67 -0
  63. package/dist/ssh/pl_paths.cjs.map +1 -0
  64. package/dist/ssh/pl_paths.d.ts +0 -1
  65. package/dist/ssh/pl_paths.js +50 -0
  66. package/dist/ssh/pl_paths.js.map +1 -0
  67. package/dist/ssh/ssh.cjs +621 -0
  68. package/dist/ssh/ssh.cjs.map +1 -0
  69. package/dist/ssh/ssh.d.ts +0 -1
  70. package/dist/ssh/ssh.js +619 -0
  71. package/dist/ssh/ssh.js.map +1 -0
  72. package/dist/ssh/supervisord.cjs +149 -0
  73. package/dist/ssh/supervisord.cjs.map +1 -0
  74. package/dist/ssh/supervisord.d.ts +0 -1
  75. package/dist/ssh/supervisord.js +140 -0
  76. package/dist/ssh/supervisord.js.map +1 -0
  77. package/package.json +16 -14
  78. package/src/common/pl_version.ts +3 -2
  79. package/src/local/pl.ts +6 -1
  80. package/src/local/process.ts +40 -3
  81. package/dist/common/os_and_arch.d.ts.map +0 -1
  82. package/dist/common/pl_binary.d.ts.map +0 -1
  83. package/dist/common/pl_binary_download.d.ts.map +0 -1
  84. package/dist/common/pl_version.d.ts.map +0 -1
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/index.mjs +0 -1366
  87. package/dist/index.mjs.map +0 -1
  88. package/dist/local/options.d.ts.map +0 -1
  89. package/dist/local/pid.d.ts.map +0 -1
  90. package/dist/local/pl.d.ts.map +0 -1
  91. package/dist/local/process.d.ts.map +0 -1
  92. package/dist/local/trace.d.ts.map +0 -1
  93. package/dist/ssh/__tests__/common-utils.d.ts.map +0 -1
  94. package/dist/ssh/connection_info.d.ts.map +0 -1
  95. package/dist/ssh/pl.d.ts.map +0 -1
  96. package/dist/ssh/pl_paths.d.ts.map +0 -1
  97. package/dist/ssh/ssh.d.ts.map +0 -1
  98. package/dist/ssh/supervisord.d.ts.map +0 -1
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const OSes = ['linux', 'macos', 'windows'];
4
+ /** @param osName - should be the thing returned from either {@link os.platform())} or `uname -s` */
5
+ function newOs(osName) {
6
+ switch (osName.toLowerCase()) {
7
+ case 'darwin':
8
+ return 'macos';
9
+ case 'linux':
10
+ return 'linux';
11
+ case 'win32':
12
+ return 'windows';
13
+ default:
14
+ throw new Error(`operating system '${osName}' is not currently supported by Platforma ecosystem. The list of OSes supported: `
15
+ + JSON.stringify(OSes));
16
+ }
17
+ }
18
+ const Arches = ['amd64', 'arm64'];
19
+ /** @param arch - should be the thing returned from either {@link os.arch())} or `uname -m` */
20
+ function newArch(arch) {
21
+ switch (arch) {
22
+ case 'aarch64':
23
+ case 'aarch64_be':
24
+ case 'arm64':
25
+ return 'arm64';
26
+ case 'x86_64':
27
+ case 'x64':
28
+ return 'amd64';
29
+ default:
30
+ throw new Error(`processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `
31
+ + JSON.stringify(Arches));
32
+ }
33
+ }
34
+
35
+ exports.Arches = Arches;
36
+ exports.OSes = OSes;
37
+ exports.newArch = newArch;
38
+ exports.newOs = newOs;
39
+ //# sourceMappingURL=os_and_arch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os_and_arch.cjs","sources":["../../src/common/os_and_arch.ts"],"sourcesContent":["export const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\n/** @param osName - should be the thing returned from either {@link os.platform())} or `uname -s` */\nexport function newOs(osName: string): OSType {\n switch (osName.toLowerCase()) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${osName}' is not currently supported by Platforma ecosystem. The list of OSes supported: `\n + JSON.stringify(OSes),\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\n/** @param arch - should be the thing returned from either {@link os.arch())} or `uname -m` */\nexport function newArch(arch: string): ArchType {\n switch (arch) {\n case 'aarch64':\n case 'aarch64_be':\n case 'arm64':\n return 'arm64';\n\n case 'x86_64':\n case 'x64':\n return 'amd64';\n\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `\n + JSON.stringify(Arches),\n );\n }\n}\n"],"names":[],"mappings":";;AAAO,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS;AAGhD;AACM,SAAU,KAAK,CAAC,MAAc,EAAA;AAClC,IAAA,QAAQ,MAAM,CAAC,WAAW,EAAE;AAC1B,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,OAAO;AAChB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,OAAO;AAChB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,SAAS;AAClB,QAAA;AACE,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,kBAAA,EAAqB,MAAM,CAAA,iFAAA;AACzB,kBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACvB;;AAEP;MAEa,MAAM,GAAG,CAAC,OAAO,EAAE,OAAO;AAGvC;AACM,SAAU,OAAO,CAAC,IAAY,EAAA;IAClC,QAAQ,IAAI;AACV,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,YAAY;AACjB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,OAAO;AAEhB,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,OAAO;AAEhB,QAAA;AACE,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,wBAAA,EAA2B,IAAI,CAAA,0FAAA;AAC7B,kBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CACzB;;AAEP;;;;;;;"}
@@ -6,4 +6,3 @@ export declare const Arches: readonly ["amd64", "arm64"];
6
6
  export type ArchType = (typeof Arches)[number];
7
7
  /** @param arch - should be the thing returned from either {@link os.arch())} or `uname -m` */
8
8
  export declare function newArch(arch: string): ArchType;
9
- //# sourceMappingURL=os_and_arch.d.ts.map
@@ -0,0 +1,34 @@
1
+ const OSes = ['linux', 'macos', 'windows'];
2
+ /** @param osName - should be the thing returned from either {@link os.platform())} or `uname -s` */
3
+ function newOs(osName) {
4
+ switch (osName.toLowerCase()) {
5
+ case 'darwin':
6
+ return 'macos';
7
+ case 'linux':
8
+ return 'linux';
9
+ case 'win32':
10
+ return 'windows';
11
+ default:
12
+ throw new Error(`operating system '${osName}' is not currently supported by Platforma ecosystem. The list of OSes supported: `
13
+ + JSON.stringify(OSes));
14
+ }
15
+ }
16
+ const Arches = ['amd64', 'arm64'];
17
+ /** @param arch - should be the thing returned from either {@link os.arch())} or `uname -m` */
18
+ function newArch(arch) {
19
+ switch (arch) {
20
+ case 'aarch64':
21
+ case 'aarch64_be':
22
+ case 'arm64':
23
+ return 'arm64';
24
+ case 'x86_64':
25
+ case 'x64':
26
+ return 'amd64';
27
+ default:
28
+ throw new Error(`processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `
29
+ + JSON.stringify(Arches));
30
+ }
31
+ }
32
+
33
+ export { Arches, OSes, newArch, newOs };
34
+ //# sourceMappingURL=os_and_arch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os_and_arch.js","sources":["../../src/common/os_and_arch.ts"],"sourcesContent":["export const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\n/** @param osName - should be the thing returned from either {@link os.platform())} or `uname -s` */\nexport function newOs(osName: string): OSType {\n switch (osName.toLowerCase()) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${osName}' is not currently supported by Platforma ecosystem. The list of OSes supported: `\n + JSON.stringify(OSes),\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\n/** @param arch - should be the thing returned from either {@link os.arch())} or `uname -m` */\nexport function newArch(arch: string): ArchType {\n switch (arch) {\n case 'aarch64':\n case 'aarch64_be':\n case 'arm64':\n return 'arm64';\n\n case 'x86_64':\n case 'x64':\n return 'amd64';\n\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `\n + JSON.stringify(Arches),\n );\n }\n}\n"],"names":[],"mappings":"AAAO,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS;AAGhD;AACM,SAAU,KAAK,CAAC,MAAc,EAAA;AAClC,IAAA,QAAQ,MAAM,CAAC,WAAW,EAAE;AAC1B,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,OAAO;AAChB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,OAAO;AAChB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,SAAS;AAClB,QAAA;AACE,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,kBAAA,EAAqB,MAAM,CAAA,iFAAA;AACzB,kBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACvB;;AAEP;MAEa,MAAM,GAAG,CAAC,OAAO,EAAE,OAAO;AAGvC;AACM,SAAU,OAAO,CAAC,IAAY,EAAA;IAClC,QAAQ,IAAI;AACV,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,YAAY;AACjB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,OAAO;AAEhB,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,OAAO;AAEhB,QAAA;AACE,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,wBAAA,EAA2B,IAAI,CAAA,0FAAA;AAC7B,kBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CACzB;;AAEP;;;;"}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ var tsHelpers = require('@milaboratories/ts-helpers');
4
+ var pl_binary_download = require('./pl_binary_download.cjs');
5
+ var pl_version = require('./pl_version.cjs');
6
+ var os = require('node:os');
7
+ var upath = require('upath');
8
+ var os_and_arch = require('./os_and_arch.cjs');
9
+
10
+ function newDefaultPlBinarySource() {
11
+ return { type: 'Download', version: pl_version.getDefaultPlVersion() };
12
+ }
13
+ async function resolveLocalPlBinaryPath(logger, downloadDir, src) {
14
+ switch (src.type) {
15
+ case 'Download':
16
+ // eslint-disable-next-line no-case-declarations
17
+ const ops = await pl_binary_download.downloadBinary(logger, downloadDir, 'pl', `pl-${src.version}`, os.arch(), os.platform());
18
+ return upath.join(ops.baseName, 'binaries', osToBinaryName[os_and_arch.newOs(os.platform())]);
19
+ case 'Local':
20
+ return src.path;
21
+ default:
22
+ tsHelpers.assertNever(src);
23
+ }
24
+ }
25
+ const osToBinaryName = {
26
+ linux: 'platforma',
27
+ macos: 'platforma',
28
+ windows: 'platforma.exe',
29
+ };
30
+
31
+ exports.newDefaultPlBinarySource = newDefaultPlBinarySource;
32
+ exports.osToBinaryName = osToBinaryName;
33
+ exports.resolveLocalPlBinaryPath = resolveLocalPlBinaryPath;
34
+ //# sourceMappingURL=pl_binary.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_binary.cjs","sources":["../../src/common/pl_binary.ts"],"sourcesContent":["import type { MiLogger } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { downloadBinary } from './pl_binary_download';\nimport { getDefaultPlVersion } from './pl_version';\nimport os from 'node:os';\nimport upath from 'upath';\nimport type { OSType } from './os_and_arch';\nimport { newOs } from './os_and_arch';\n\n/** Shows how the binary should be got. */\nexport type PlBinarySource = PlBinarySourceDownload | PlBinarySourceLocal;\n\nexport type PlBinarySourceDownload = {\n readonly type: 'Download';\n readonly version: string;\n};\n\nexport type PlBinarySourceLocal = {\n readonly type: 'Local';\n readonly path: string;\n};\n\nexport function newDefaultPlBinarySource(): PlBinarySourceDownload {\n return { type: 'Download', version: getDefaultPlVersion() };\n}\n\nexport async function resolveLocalPlBinaryPath(\n logger: MiLogger,\n downloadDir: string,\n src: PlBinarySource,\n): Promise<string> {\n switch (src.type) {\n case 'Download':\n // eslint-disable-next-line no-case-declarations\n const ops = await downloadBinary(logger, downloadDir, 'pl', `pl-${src.version}`, os.arch(), os.platform());\n return upath.join(ops.baseName, 'binaries', osToBinaryName[newOs(os.platform())]);\n\n case 'Local':\n return src.path;\n\n default:\n assertNever(src);\n }\n}\n\nexport const osToBinaryName: Record<OSType, string> = {\n linux: 'platforma',\n macos: 'platforma',\n windows: 'platforma.exe',\n};\n"],"names":["getDefaultPlVersion","downloadBinary","newOs","assertNever"],"mappings":";;;;;;;;;SAsBgB,wBAAwB,GAAA;IACtC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAEA,8BAAmB,EAAE,EAAE;AAC7D;AAEO,eAAe,wBAAwB,CAC5C,MAAgB,EAChB,WAAmB,EACnB,GAAmB,EAAA;AAEnB,IAAA,QAAQ,GAAG,CAAC,IAAI;AACd,QAAA,KAAK,UAAU;;YAEb,MAAM,GAAG,GAAG,MAAMC,iCAAc,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA,GAAA,EAAM,GAAG,CAAC,OAAO,CAAA,CAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC1G,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAACC,iBAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAEnF,QAAA,KAAK,OAAO;YACV,OAAO,GAAG,CAAC,IAAI;AAEjB,QAAA;YACEC,qBAAW,CAAC,GAAG,CAAC;;AAEtB;AAEO,MAAM,cAAc,GAA2B;AACpD,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,OAAO,EAAE,eAAe;;;;;;;"}
@@ -13,4 +13,3 @@ export type PlBinarySourceLocal = {
13
13
  export declare function newDefaultPlBinarySource(): PlBinarySourceDownload;
14
14
  export declare function resolveLocalPlBinaryPath(logger: MiLogger, downloadDir: string, src: PlBinarySource): Promise<string>;
15
15
  export declare const osToBinaryName: Record<OSType, string>;
16
- //# sourceMappingURL=pl_binary.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { assertNever } from '@milaboratories/ts-helpers';
2
+ import { downloadBinary } from './pl_binary_download.js';
3
+ import { getDefaultPlVersion } from './pl_version.js';
4
+ import os__default from 'node:os';
5
+ import upath from 'upath';
6
+ import { newOs } from './os_and_arch.js';
7
+
8
+ function newDefaultPlBinarySource() {
9
+ return { type: 'Download', version: getDefaultPlVersion() };
10
+ }
11
+ async function resolveLocalPlBinaryPath(logger, downloadDir, src) {
12
+ switch (src.type) {
13
+ case 'Download':
14
+ // eslint-disable-next-line no-case-declarations
15
+ const ops = await downloadBinary(logger, downloadDir, 'pl', `pl-${src.version}`, os__default.arch(), os__default.platform());
16
+ return upath.join(ops.baseName, 'binaries', osToBinaryName[newOs(os__default.platform())]);
17
+ case 'Local':
18
+ return src.path;
19
+ default:
20
+ assertNever(src);
21
+ }
22
+ }
23
+ const osToBinaryName = {
24
+ linux: 'platforma',
25
+ macos: 'platforma',
26
+ windows: 'platforma.exe',
27
+ };
28
+
29
+ export { newDefaultPlBinarySource, osToBinaryName, resolveLocalPlBinaryPath };
30
+ //# sourceMappingURL=pl_binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_binary.js","sources":["../../src/common/pl_binary.ts"],"sourcesContent":["import type { MiLogger } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { downloadBinary } from './pl_binary_download';\nimport { getDefaultPlVersion } from './pl_version';\nimport os from 'node:os';\nimport upath from 'upath';\nimport type { OSType } from './os_and_arch';\nimport { newOs } from './os_and_arch';\n\n/** Shows how the binary should be got. */\nexport type PlBinarySource = PlBinarySourceDownload | PlBinarySourceLocal;\n\nexport type PlBinarySourceDownload = {\n readonly type: 'Download';\n readonly version: string;\n};\n\nexport type PlBinarySourceLocal = {\n readonly type: 'Local';\n readonly path: string;\n};\n\nexport function newDefaultPlBinarySource(): PlBinarySourceDownload {\n return { type: 'Download', version: getDefaultPlVersion() };\n}\n\nexport async function resolveLocalPlBinaryPath(\n logger: MiLogger,\n downloadDir: string,\n src: PlBinarySource,\n): Promise<string> {\n switch (src.type) {\n case 'Download':\n // eslint-disable-next-line no-case-declarations\n const ops = await downloadBinary(logger, downloadDir, 'pl', `pl-${src.version}`, os.arch(), os.platform());\n return upath.join(ops.baseName, 'binaries', osToBinaryName[newOs(os.platform())]);\n\n case 'Local':\n return src.path;\n\n default:\n assertNever(src);\n }\n}\n\nexport const osToBinaryName: Record<OSType, string> = {\n linux: 'platforma',\n macos: 'platforma',\n windows: 'platforma.exe',\n};\n"],"names":["os"],"mappings":";;;;;;;SAsBgB,wBAAwB,GAAA;IACtC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE;AAC7D;AAEO,eAAe,wBAAwB,CAC5C,MAAgB,EAChB,WAAmB,EACnB,GAAmB,EAAA;AAEnB,IAAA,QAAQ,GAAG,CAAC,IAAI;AACd,QAAA,KAAK,UAAU;;YAEb,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA,GAAA,EAAM,GAAG,CAAC,OAAO,CAAA,CAAE,EAAEA,WAAE,CAAC,IAAI,EAAE,EAAEA,WAAE,CAAC,QAAQ,EAAE,CAAC;YAC1G,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,CAACA,WAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAEnF,QAAA,KAAK,OAAO;YACV,OAAO,GAAG,CAAC,IAAI;AAEjB,QAAA;YACE,WAAW,CAAC,GAAG,CAAC;;AAEtB;AAEO,MAAM,cAAc,GAA2B;AACpD,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,OAAO,EAAE,eAAe;;;;;"}
@@ -0,0 +1,172 @@
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);
32
+
33
+ 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
+ const gaCdn = 'https://cdn-ga.pl-open.science/software';
37
+ async function downloadBinaryNoExtract(logger, baseDir, softwareName, tgzName, arch, platform) {
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);
42
+ opts.wasDownloadedFrom = archiveUrl;
43
+ }
44
+ catch (_e) {
45
+ await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);
46
+ opts.wasDownloadedFrom = alternativeArchiveGAUrl;
47
+ }
48
+ return opts;
49
+ }
50
+ async function downloadBinary(logger, baseDir, softwareName, archiveName, arch, platform) {
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);
55
+ opts.wasDownloadedFrom = archiveUrl;
56
+ }
57
+ catch (_e) {
58
+ await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);
59
+ opts.wasDownloadedFrom = alternativeArchiveGAUrl;
60
+ }
61
+ await extractArchive(logger, archivePath, archiveType, targetFolder);
62
+ return opts;
63
+ }
64
+ 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
+ };
81
+ }
82
+ async function downloadArchive(logger, archiveUrl, dstArchiveFile) {
83
+ const state = {};
84
+ state.dstArchive = dstArchiveFile;
85
+ try {
86
+ state.fileExisted = await tsHelpers.fileExists(dstArchiveFile);
87
+ if (state.fileExisted) {
88
+ logger.info(`Platforma Backend archive download skipped: '${dstArchiveFile}' already exists`);
89
+ return state;
90
+ }
91
+ await fsp.mkdir(upath.dirname(dstArchiveFile), { recursive: true });
92
+ state.dirnameCreated = true;
93
+ logger.info(`Downloading archive:\n URL: ${archiveUrl}\n Save to: ${dstArchiveFile}`);
94
+ const { body, statusCode } = await undici.request(archiveUrl);
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 = dstArchiveFile + '.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, dstArchiveFile);
111
+ state.renamed = true;
112
+ state.newExisted = await tsHelpers.fileExists(dstArchiveFile);
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
+ }
120
+ }
121
+ /** Used to prevent mid-way interrupted unarchived folders to be used */
122
+ const MarkerFileName = '.ok';
123
+ 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.`);
161
+ }
162
+ const osToArchiveType = {
163
+ linux: 'tgz',
164
+ macos: 'tgz',
165
+ windows: 'zip',
166
+ };
167
+
168
+ exports.downloadArchive = downloadArchive;
169
+ exports.downloadBinary = downloadBinary;
170
+ exports.downloadBinaryNoExtract = downloadBinaryNoExtract;
171
+ exports.extractArchive = extractArchive;
172
+ //# sourceMappingURL=pl_binary_download.cjs.map
@@ -0,0 +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 { 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: MiLogger,\n baseDir: string,\n softwareName: string,\n tgzName: string,\n arch: string,\n platform: string,\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);\n opts.wasDownloadedFrom = archiveUrl;\n } catch (_e) {\n await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n return opts;\n}\n\nexport async function downloadBinary(\n logger: MiLogger,\n baseDir: string,\n softwareName: string,\n archiveName: string,\n arch: string,\n platform: string,\n): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(softwareName, archiveName, baseDir, newArch(arch), newOs(platform));\n const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;\n\n try {\n await downloadArchive(logger, archiveUrl, archivePath);\n opts.wasDownloadedFrom = archiveUrl;\n } catch (_e) {\n await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);\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 dstArchive?: 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: MiLogger, archiveUrl: string, dstArchiveFile: string,\n): Promise<DownloadInfo> {\n const state: DownloadInfo = {};\n state.dstArchive = dstArchiveFile;\n\n try {\n state.fileExisted = await fileExists(dstArchiveFile);\n if (state.fileExisted) {\n logger.info(`Platforma Backend archive download skipped: '${dstArchiveFile}' already exists`);\n return state;\n }\n\n await fsp.mkdir(upath.dirname(dstArchiveFile), { recursive: true });\n state.dirnameCreated = true;\n\n logger.info(`Downloading archive:\\n URL: ${archiveUrl}\\n Save to: ${dstArchiveFile}`);\n\n const { body, statusCode } = await request(archiveUrl);\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 = dstArchiveFile + '.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, dstArchiveFile);\n state.renamed = true;\n state.newExisted = await fileExists(dstArchiveFile);\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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"}
@@ -25,4 +25,3 @@ export type DownloadInfo = {
25
25
  export declare function downloadArchive(logger: MiLogger, archiveUrl: string, dstArchiveFile: string): Promise<DownloadInfo>;
26
26
  export declare function extractArchive(logger: MiLogger, archivePath: string, archiveType: ArchiveType, dstFolder: string): Promise<void>;
27
27
  export type ArchiveType = 'tgz' | 'zip';
28
- //# sourceMappingURL=pl_binary_download.d.ts.map
@@ -0,0 +1,148 @@
1
+ import fs from 'node:fs';
2
+ import fsp from 'node:fs/promises';
3
+ import upath from 'upath';
4
+ import { request } from 'undici';
5
+ import { Readable, Writable } from 'node:stream';
6
+ import { text } from 'node:stream/consumers';
7
+ import * as tar from 'tar';
8
+ import { fileExists, assertNever } from '@milaboratories/ts-helpers';
9
+ import decompress from 'decompress';
10
+ import { newOs, newArch } from './os_and_arch.js';
11
+
12
+ const cdn = 'https://cdn.platforma.bio/software';
13
+ // We'll download things from Global Access if downloading from CDN has failed
14
+ // (it might be that it's blocked from the company's network.)
15
+ const gaCdn = 'https://cdn-ga.pl-open.science/software';
16
+ async function downloadBinaryNoExtract(logger, baseDir, softwareName, tgzName, arch, platform) {
17
+ const opts = getPathsForDownload(softwareName, tgzName, baseDir, newArch(arch), newOs(platform));
18
+ const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;
19
+ try {
20
+ await downloadArchive(logger, archiveUrl, archivePath);
21
+ opts.wasDownloadedFrom = archiveUrl;
22
+ }
23
+ catch (_e) {
24
+ await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);
25
+ opts.wasDownloadedFrom = alternativeArchiveGAUrl;
26
+ }
27
+ return opts;
28
+ }
29
+ async function downloadBinary(logger, baseDir, softwareName, archiveName, arch, platform) {
30
+ const opts = getPathsForDownload(softwareName, archiveName, baseDir, newArch(arch), newOs(platform));
31
+ const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;
32
+ try {
33
+ await downloadArchive(logger, archiveUrl, archivePath);
34
+ opts.wasDownloadedFrom = archiveUrl;
35
+ }
36
+ catch (_e) {
37
+ await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);
38
+ opts.wasDownloadedFrom = alternativeArchiveGAUrl;
39
+ }
40
+ await extractArchive(logger, archivePath, archiveType, targetFolder);
41
+ return opts;
42
+ }
43
+ function getPathsForDownload(softwareName, archiveName, baseDir, arch, os) {
44
+ const baseName = `${archiveName}-${arch}`;
45
+ const archiveType = osToArchiveType[os];
46
+ const archiveFileName = `${baseName}.${archiveType}`;
47
+ const archiveUrl = `${cdn}/${softwareName}/${os}/${archiveFileName}`;
48
+ const alternativeArchiveGAUrl = `${gaCdn}/${softwareName}/${os}/${archiveFileName}`;
49
+ const archivePath = upath.join(baseDir, archiveFileName);
50
+ // folder where binary distribution of pl will be unpacked
51
+ const targetFolder = upath.join(baseDir, baseName);
52
+ return {
53
+ archiveUrl,
54
+ alternativeArchiveGAUrl,
55
+ archivePath,
56
+ archiveType,
57
+ targetFolder,
58
+ baseName,
59
+ };
60
+ }
61
+ async function downloadArchive(logger, archiveUrl, dstArchiveFile) {
62
+ const state = {};
63
+ state.dstArchive = dstArchiveFile;
64
+ try {
65
+ state.fileExisted = await fileExists(dstArchiveFile);
66
+ if (state.fileExisted) {
67
+ logger.info(`Platforma Backend archive download skipped: '${dstArchiveFile}' already exists`);
68
+ return state;
69
+ }
70
+ await fsp.mkdir(upath.dirname(dstArchiveFile), { recursive: true });
71
+ state.dirnameCreated = true;
72
+ logger.info(`Downloading archive:\n URL: ${archiveUrl}\n Save to: ${dstArchiveFile}`);
73
+ const { body, statusCode } = await request(archiveUrl);
74
+ state.statusCode = statusCode;
75
+ if (statusCode != 200) {
76
+ // completely draining the stream to prevent leaving open connections
77
+ const textBody = await text(body);
78
+ state.errorMsg = `failed to download archive: ${statusCode}, response: ${textBody.slice(0, 1000)}`;
79
+ logger.error(state.errorMsg);
80
+ throw new Error(state.errorMsg);
81
+ }
82
+ // to prevent incomplete downloads we first write in a temp file
83
+ state.tmpPath = dstArchiveFile + '.tmp';
84
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
85
+ await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));
86
+ state.wroteTmp = true;
87
+ state.tmpExisted = await fileExists(state.tmpPath);
88
+ // and then atomically rename it
89
+ await fsp.rename(state.tmpPath, dstArchiveFile);
90
+ state.renamed = true;
91
+ state.newExisted = await fileExists(dstArchiveFile);
92
+ return state;
93
+ }
94
+ catch (e) {
95
+ const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;
96
+ logger.error(msg);
97
+ throw new Error(msg);
98
+ }
99
+ }
100
+ /** Used to prevent mid-way interrupted unarchived folders to be used */
101
+ const MarkerFileName = '.ok';
102
+ async function extractArchive(logger, archivePath, archiveType, dstFolder) {
103
+ logger.info('extracting archive...');
104
+ logger.info(` archive path: '${archivePath}'`);
105
+ logger.info(` target dir: '${dstFolder}'`);
106
+ if (!(await fileExists(archivePath))) {
107
+ const msg = `Platforma Backend binary archive not found at '${archivePath}'`;
108
+ logger.error(msg);
109
+ throw new Error(msg);
110
+ }
111
+ const markerFilePath = upath.join(dstFolder, MarkerFileName);
112
+ if (await fileExists(markerFilePath)) {
113
+ logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);
114
+ return;
115
+ }
116
+ if (await fileExists(dstFolder)) {
117
+ logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);
118
+ await fsp.rm(dstFolder, { recursive: true });
119
+ }
120
+ logger.info(` creating target dir '${dstFolder}'`);
121
+ await fsp.mkdir(dstFolder, { recursive: true });
122
+ logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${dstFolder}`);
123
+ switch (archiveType) {
124
+ case 'tgz':
125
+ await tar.x({
126
+ file: archivePath,
127
+ cwd: dstFolder,
128
+ gzip: true,
129
+ });
130
+ break;
131
+ case 'zip':
132
+ await decompress(archivePath, dstFolder);
133
+ break;
134
+ default:
135
+ assertNever(archiveType);
136
+ }
137
+ // writing marker file, to be able in the future detect that we completely unarchived the tar file
138
+ await fsp.writeFile(markerFilePath, 'ok');
139
+ logger.info(` ... unpack done.`);
140
+ }
141
+ const osToArchiveType = {
142
+ linux: 'tgz',
143
+ macos: 'tgz',
144
+ windows: 'zip',
145
+ };
146
+
147
+ export { downloadArchive, downloadBinary, downloadBinaryNoExtract, extractArchive };
148
+ //# sourceMappingURL=pl_binary_download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_binary_download.js","sources":["../../src/common/pl_binary_download.ts"],"sourcesContent":["import fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport upath from 'upath';\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: MiLogger,\n baseDir: string,\n softwareName: string,\n tgzName: string,\n arch: string,\n platform: string,\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);\n opts.wasDownloadedFrom = archiveUrl;\n } catch (_e) {\n await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n return opts;\n}\n\nexport async function downloadBinary(\n logger: MiLogger,\n baseDir: string,\n softwareName: string,\n archiveName: string,\n arch: string,\n platform: string,\n): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(softwareName, archiveName, baseDir, newArch(arch), newOs(platform));\n const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;\n\n try {\n await downloadArchive(logger, archiveUrl, archivePath);\n opts.wasDownloadedFrom = archiveUrl;\n } catch (_e) {\n await downloadArchive(logger, alternativeArchiveGAUrl, archivePath);\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 dstArchive?: 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: MiLogger, archiveUrl: string, dstArchiveFile: string,\n): Promise<DownloadInfo> {\n const state: DownloadInfo = {};\n state.dstArchive = dstArchiveFile;\n\n try {\n state.fileExisted = await fileExists(dstArchiveFile);\n if (state.fileExisted) {\n logger.info(`Platforma Backend archive download skipped: '${dstArchiveFile}' already exists`);\n return state;\n }\n\n await fsp.mkdir(upath.dirname(dstArchiveFile), { recursive: true });\n state.dirnameCreated = true;\n\n logger.info(`Downloading archive:\\n URL: ${archiveUrl}\\n Save to: ${dstArchiveFile}`);\n\n const { body, statusCode } = await request(archiveUrl);\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 = dstArchiveFile + '.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, dstArchiveFile);\n state.renamed = true;\n state.newExisted = await fileExists(dstArchiveFile);\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":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var _package = require('../package.json.cjs');
4
+
5
+ function getDefaultPlVersion() {
6
+ // drop build error if pl-version is not defined
7
+ return _package['pl-version'];
8
+ }
9
+
10
+ exports.getDefaultPlVersion = getDefaultPlVersion;
11
+ //# sourceMappingURL=pl_version.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_version.cjs","sources":["../../src/common/pl_version.ts"],"sourcesContent":["import packageJson from '../../package.json';\n\nexport function getDefaultPlVersion(): string {\n // drop build error if pl-version is not defined\n return packageJson['pl-version'];\n}\n"],"names":["packageJson"],"mappings":";;;;SAEgB,mBAAmB,GAAA;;AAEjC,IAAA,OAAOA,QAAW,CAAC,YAAY,CAAC;AAClC;;;;"}
@@ -1,2 +1 @@
1
1
  export declare function getDefaultPlVersion(): string;
2
- //# sourceMappingURL=pl_version.d.ts.map
@@ -0,0 +1,9 @@
1
+ import packageJson from '../package.json.js';
2
+
3
+ function getDefaultPlVersion() {
4
+ // drop build error if pl-version is not defined
5
+ return packageJson['pl-version'];
6
+ }
7
+
8
+ export { getDefaultPlVersion };
9
+ //# sourceMappingURL=pl_version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_version.js","sources":["../../src/common/pl_version.ts"],"sourcesContent":["import packageJson from '../../package.json';\n\nexport function getDefaultPlVersion(): string {\n // drop build error if pl-version is not defined\n return packageJson['pl-version'];\n}\n"],"names":[],"mappings":";;SAEgB,mBAAmB,GAAA;;AAEjC,IAAA,OAAO,WAAW,CAAC,YAAY,CAAC;AAClC;;;;"}
package/dist/index.cjs ADDED
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var pl = require('./local/pl.cjs');
4
+ var pl_version = require('./common/pl_version.cjs');
5
+ var ssh = require('./ssh/ssh.cjs');
6
+ var pl$1 = require('./ssh/pl.cjs');
7
+ var connection_info = require('./ssh/connection_info.cjs');
8
+
9
+
10
+
11
+ exports.LocalConfigYaml = pl.LocalConfigYaml;
12
+ exports.LocalPl = pl.LocalPl;
13
+ exports.localPlatformaInit = pl.localPlatformaInit;
14
+ exports.mergeDefaultOps = pl.mergeDefaultOps;
15
+ exports.plProcessOps = pl.plProcessOps;
16
+ exports.getDefaultPlVersion = pl_version.getDefaultPlVersion;
17
+ exports.SshClient = ssh.SshClient;
18
+ exports.SshPl = pl$1.SshPl;
19
+ exports.parseGlibcVersion = pl$1.parseGlibcVersion;
20
+ exports.ConnectionInfo = connection_info.ConnectionInfo;
21
+ exports.PortPair = connection_info.PortPair;
22
+ exports.SshPlPorts = connection_info.SshPlPorts;
23
+ exports.newConnectionInfo = connection_info.newConnectionInfo;
24
+ exports.parseConnectionInfo = connection_info.parseConnectionInfo;
25
+ exports.stringifyConnectionInfo = connection_info.stringifyConnectionInfo;
26
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -3,4 +3,3 @@ export * from './common/pl_version';
3
3
  export * from './ssh/ssh';
4
4
  export * from './ssh/pl';
5
5
  export * from './ssh/connection_info';
6
- //# sourceMappingURL=index.d.ts.map