@milaboratories/pl-deployments 2.16.4 → 2.16.6

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 (70) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +7 -13
  2. package/dist/common/os_and_arch.cjs +1 -2
  3. package/dist/common/os_and_arch.cjs.map +1 -1
  4. package/dist/common/os_and_arch.js +1 -1
  5. package/dist/common/pl_binary.cjs +5 -6
  6. package/dist/common/pl_binary.cjs.map +1 -1
  7. package/dist/common/pl_binary.d.ts.map +1 -0
  8. package/dist/common/pl_binary.js +1 -2
  9. package/dist/common/pl_binary.js.map +1 -1
  10. package/dist/common/pl_binary_download.cjs +3 -4
  11. package/dist/common/pl_binary_download.cjs.map +1 -1
  12. package/dist/common/pl_binary_download.d.ts.map +1 -0
  13. package/dist/common/pl_binary_download.js +1 -2
  14. package/dist/common/pl_binary_download.js.map +1 -1
  15. package/dist/common/pl_version.cjs +2 -3
  16. package/dist/common/pl_version.cjs.map +1 -1
  17. package/dist/common/pl_version.d.ts.map +1 -0
  18. package/dist/common/pl_version.js +1 -2
  19. package/dist/common/pl_version.js.map +1 -1
  20. package/dist/index.cjs +7 -8
  21. package/dist/index.js +1 -2
  22. package/dist/local/pid.cjs +2 -3
  23. package/dist/local/pid.cjs.map +1 -1
  24. package/dist/local/pid.js +1 -2
  25. package/dist/local/pid.js.map +1 -1
  26. package/dist/local/pl.cjs +6 -7
  27. package/dist/local/pl.cjs.map +1 -1
  28. package/dist/local/pl.d.ts.map +1 -0
  29. package/dist/local/pl.js +1 -2
  30. package/dist/local/pl.js.map +1 -1
  31. package/dist/local/process.cjs +2 -3
  32. package/dist/local/process.cjs.map +1 -1
  33. package/dist/local/process.d.ts.map +1 -0
  34. package/dist/local/process.js +1 -2
  35. package/dist/local/process.js.map +1 -1
  36. package/dist/local/trace.cjs +1 -2
  37. package/dist/local/trace.cjs.map +1 -1
  38. package/dist/local/trace.d.ts.map +1 -0
  39. package/dist/local/trace.js +1 -1
  40. package/dist/package.cjs +6 -7
  41. package/dist/package.js +1 -1
  42. package/dist/ssh/connection_info.cjs +2 -3
  43. package/dist/ssh/connection_info.cjs.map +1 -1
  44. package/dist/ssh/connection_info.d.ts.map +1 -0
  45. package/dist/ssh/connection_info.js +1 -2
  46. package/dist/ssh/connection_info.js.map +1 -1
  47. package/dist/ssh/pl.cjs +8 -9
  48. package/dist/ssh/pl.cjs.map +1 -1
  49. package/dist/ssh/pl.d.ts.map +1 -0
  50. package/dist/ssh/pl.js +1 -2
  51. package/dist/ssh/pl.js.map +1 -1
  52. package/dist/ssh/pl_paths.cjs +4 -5
  53. package/dist/ssh/pl_paths.cjs.map +1 -1
  54. package/dist/ssh/pl_paths.js +1 -2
  55. package/dist/ssh/pl_paths.js.map +1 -1
  56. package/dist/ssh/ssh.cjs +3 -4
  57. package/dist/ssh/ssh.cjs.map +1 -1
  58. package/dist/ssh/ssh.d.ts.map +1 -0
  59. package/dist/ssh/ssh.js +1 -2
  60. package/dist/ssh/ssh.js.map +1 -1
  61. package/dist/ssh/ssh_errors.cjs +2 -3
  62. package/dist/ssh/ssh_errors.cjs.map +1 -1
  63. package/dist/ssh/ssh_errors.js +1 -2
  64. package/dist/ssh/ssh_errors.js.map +1 -1
  65. package/dist/ssh/supervisord.cjs +3 -4
  66. package/dist/ssh/supervisord.cjs.map +1 -1
  67. package/dist/ssh/supervisord.d.ts.map +1 -0
  68. package/dist/ssh/supervisord.js +1 -2
  69. package/dist/ssh/supervisord.js.map +1 -1
  70. package/package.json +10 -10
@@ -6,16 +6,12 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
- key = keys[i];
12
- if (!__hasOwnProp.call(to, key) && key !== except) {
13
- __defProp(to, key, {
14
- get: ((k) => from[k]).bind(null, key),
15
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
- });
17
- }
18
- }
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
19
15
  }
20
16
  return to;
21
17
  };
@@ -23,7 +19,5 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
19
  value: mod,
24
20
  enumerable: true
25
21
  }) : target, mod));
26
-
27
22
  //#endregion
28
-
29
- exports.__toESM = __toESM;
23
+ exports.__toESM = __toESM;
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/common/os_and_arch.ts
3
2
  const OSes = [
4
3
  "linux",
@@ -26,8 +25,8 @@ function newArch(arch) {
26
25
  default: throw new Error(`processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: ` + JSON.stringify(Arches));
27
26
  }
28
27
  }
29
-
30
28
  //#endregion
31
29
  exports.newArch = newArch;
32
30
  exports.newOs = newOs;
31
+
33
32
  //# sourceMappingURL=os_and_arch.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"os_and_arch.cjs","names":[],"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"],"mappings":";;AAAA,MAAa,OAAO;CAAC;CAAS;CAAS;CAAU;;AAIjD,SAAgB,MAAM,QAAwB;AAC5C,SAAQ,OAAO,aAAa,EAA5B;EACE,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,QACE,OAAM,IAAI,MACR,qBAAqB,OAAO,qFAC1B,KAAK,UAAU,KAAK,CACvB;;;AAIP,MAAa,SAAS,CAAC,SAAS,QAAQ;;AAIxC,SAAgB,QAAQ,MAAwB;AAC9C,SAAQ,MAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,QACH,QAAO;EAET,KAAK;EACL,KAAK,MACH,QAAO;EAET,QACE,OAAM,IAAI,MACR,2BAA2B,KAAK,8FAC9B,KAAK,UAAU,OAAO,CACzB"}
1
+ {"version":3,"file":"os_and_arch.cjs","names":[],"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"],"mappings":";AAAA,MAAa,OAAO;CAAC;CAAS;CAAS;CAAU;;AAIjD,SAAgB,MAAM,QAAwB;AAC5C,SAAQ,OAAO,aAAa,EAA5B;EACE,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,QACE,OAAM,IAAI,MACR,qBAAqB,OAAO,qFAC1B,KAAK,UAAU,KAAK,CACvB;;;AAIP,MAAa,SAAS,CAAC,SAAS,QAAQ;;AAIxC,SAAgB,QAAQ,MAAwB;AAC9C,SAAQ,MAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,QACH,QAAO;EAET,KAAK;EACL,KAAK,MACH,QAAO;EAET,QACE,OAAM,IAAI,MACR,2BAA2B,KAAK,8FAC9B,KAAK,UAAU,OAAO,CACzB"}
@@ -25,7 +25,7 @@ function newArch(arch) {
25
25
  default: throw new Error(`processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: ` + JSON.stringify(Arches));
26
26
  }
27
27
  }
28
-
29
28
  //#endregion
30
29
  export { newArch, newOs };
30
+
31
31
  //# sourceMappingURL=os_and_arch.js.map
@@ -1,13 +1,12 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_os_and_arch = require('./os_and_arch.cjs');
3
- const require_pl_binary_download = require('./pl_binary_download.cjs');
4
- const require_pl_version = require('./pl_version.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_os_and_arch = require("./os_and_arch.cjs");
3
+ const require_pl_binary_download = require("./pl_binary_download.cjs");
4
+ const require_pl_version = require("./pl_version.cjs");
5
5
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
6
6
  let upath = require("upath");
7
7
  upath = require_runtime.__toESM(upath);
8
8
  let node_os = require("node:os");
9
9
  node_os = require_runtime.__toESM(node_os);
10
-
11
10
  //#region src/common/pl_binary.ts
12
11
  function newDefaultPlBinarySource() {
13
12
  return {
@@ -37,8 +36,8 @@ const osToBinaryName = {
37
36
  macos: "platforma",
38
37
  windows: "platforma.exe"
39
38
  };
40
-
41
39
  //#endregion
42
40
  exports.newDefaultPlBinarySource = newDefaultPlBinarySource;
43
41
  exports.resolveLocalPlBinaryPath = resolveLocalPlBinaryPath;
42
+
44
43
  //# sourceMappingURL=pl_binary.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl_binary.cjs","names":["getDefaultPlVersion","downloadBinary","os","newOs"],"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\";\nimport type { Dispatcher } from \"undici\";\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,\n downloadDir,\n src,\n dispatcher,\n}: {\n logger: MiLogger;\n downloadDir: string;\n src: PlBinarySource;\n dispatcher?: Dispatcher;\n}): Promise<string> {\n switch (src.type) {\n case \"Download\":\n // eslint-disable-next-line no-case-declarations\n const ops = await downloadBinary({\n logger,\n baseDir: downloadDir,\n softwareName: \"pl\",\n archiveName: `pl-${src.version}`,\n arch: os.arch(),\n platform: os.platform(),\n dispatcher,\n });\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"],"mappings":";;;;;;;;;;;AAuBA,SAAgB,2BAAmD;AACjE,QAAO;EAAE,MAAM;EAAY,SAASA,wCAAqB;EAAE;;AAG7D,eAAsB,yBAAyB,EAC7C,QACA,aACA,KACA,cAMkB;AAClB,SAAQ,IAAI,MAAZ;EACE,KAAK;GAEH,MAAM,MAAM,MAAMC,0CAAe;IAC/B;IACA,SAAS;IACT,cAAc;IACd,aAAa,MAAM,IAAI;IACvB,MAAMC,gBAAG,MAAM;IACf,UAAUA,gBAAG,UAAU;IACvB;IACD,CAAC;AACF,UAAO,cAAM,KAAK,IAAI,UAAU,YAAY,eAAeC,0BAAMD,gBAAG,UAAU,CAAC,EAAE;EAEnF,KAAK,QACH,QAAO,IAAI;EAEb,QACE,6CAAY,IAAI;;;AAItB,MAAa,iBAAyC;CACpD,OAAO;CACP,OAAO;CACP,SAAS;CACV"}
1
+ {"version":3,"file":"pl_binary.cjs","names":["getDefaultPlVersion","downloadBinary","os","newOs"],"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\";\nimport type { Dispatcher } from \"undici\";\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,\n downloadDir,\n src,\n dispatcher,\n}: {\n logger: MiLogger;\n downloadDir: string;\n src: PlBinarySource;\n dispatcher?: Dispatcher;\n}): Promise<string> {\n switch (src.type) {\n case \"Download\":\n // eslint-disable-next-line no-case-declarations\n const ops = await downloadBinary({\n logger,\n baseDir: downloadDir,\n softwareName: \"pl\",\n archiveName: `pl-${src.version}`,\n arch: os.arch(),\n platform: os.platform(),\n dispatcher,\n });\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"],"mappings":";;;;;;;;;;AAuBA,SAAgB,2BAAmD;AACjE,QAAO;EAAE,MAAM;EAAY,SAASA,mBAAAA,qBAAqB;EAAE;;AAG7D,eAAsB,yBAAyB,EAC7C,QACA,aACA,KACA,cAMkB;AAClB,SAAQ,IAAI,MAAZ;EACE,KAAK;GAEH,MAAM,MAAM,MAAMC,2BAAAA,eAAe;IAC/B;IACA,SAAS;IACT,cAAc;IACd,aAAa,MAAM,IAAI;IACvB,MAAMC,QAAAA,QAAG,MAAM;IACf,UAAUA,QAAAA,QAAG,UAAU;IACvB;IACD,CAAC;AACF,UAAO,MAAA,QAAM,KAAK,IAAI,UAAU,YAAY,eAAeC,oBAAAA,MAAMD,QAAAA,QAAG,UAAU,CAAC,EAAE;EAEnF,KAAK,QACH,QAAO,IAAI;EAEb,QACE,EAAA,GAAA,2BAAA,aAAY,IAAI;;;AAItB,MAAa,iBAAyC;CACpD,OAAO;CACP,OAAO;CACP,SAAS;CACV"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_binary.d.ts","names":[],"sources":["../../src/common/pl_binary.ts"],"mappings":";;;;;KAWY,cAAA,GAAiB,sBAAA,GAAyB,mBAAA;AAAA,KAE1C,sBAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA;AAAA;AAAA,KAGC,mBAAA;EAAA,SACD,IAAA;EAAA,SACA,IAAA;AAAA"}
@@ -4,7 +4,6 @@ import { getDefaultPlVersion } from "./pl_version.js";
4
4
  import { assertNever } from "@milaboratories/ts-helpers";
5
5
  import upath from "upath";
6
6
  import os from "node:os";
7
-
8
7
  //#region src/common/pl_binary.ts
9
8
  function newDefaultPlBinarySource() {
10
9
  return {
@@ -34,7 +33,7 @@ const osToBinaryName = {
34
33
  macos: "platforma",
35
34
  windows: "platforma.exe"
36
35
  };
37
-
38
36
  //#endregion
39
37
  export { newDefaultPlBinarySource, resolveLocalPlBinaryPath };
38
+
40
39
  //# sourceMappingURL=pl_binary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl_binary.js","names":[],"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\";\nimport type { Dispatcher } from \"undici\";\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,\n downloadDir,\n src,\n dispatcher,\n}: {\n logger: MiLogger;\n downloadDir: string;\n src: PlBinarySource;\n dispatcher?: Dispatcher;\n}): Promise<string> {\n switch (src.type) {\n case \"Download\":\n // eslint-disable-next-line no-case-declarations\n const ops = await downloadBinary({\n logger,\n baseDir: downloadDir,\n softwareName: \"pl\",\n archiveName: `pl-${src.version}`,\n arch: os.arch(),\n platform: os.platform(),\n dispatcher,\n });\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"],"mappings":";;;;;;;;AAuBA,SAAgB,2BAAmD;AACjE,QAAO;EAAE,MAAM;EAAY,SAAS,qBAAqB;EAAE;;AAG7D,eAAsB,yBAAyB,EAC7C,QACA,aACA,KACA,cAMkB;AAClB,SAAQ,IAAI,MAAZ;EACE,KAAK;GAEH,MAAM,MAAM,MAAM,eAAe;IAC/B;IACA,SAAS;IACT,cAAc;IACd,aAAa,MAAM,IAAI;IACvB,MAAM,GAAG,MAAM;IACf,UAAU,GAAG,UAAU;IACvB;IACD,CAAC;AACF,UAAO,MAAM,KAAK,IAAI,UAAU,YAAY,eAAe,MAAM,GAAG,UAAU,CAAC,EAAE;EAEnF,KAAK,QACH,QAAO,IAAI;EAEb,QACE,aAAY,IAAI;;;AAItB,MAAa,iBAAyC;CACpD,OAAO;CACP,OAAO;CACP,SAAS;CACV"}
1
+ {"version":3,"file":"pl_binary.js","names":[],"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\";\nimport type { Dispatcher } from \"undici\";\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,\n downloadDir,\n src,\n dispatcher,\n}: {\n logger: MiLogger;\n downloadDir: string;\n src: PlBinarySource;\n dispatcher?: Dispatcher;\n}): Promise<string> {\n switch (src.type) {\n case \"Download\":\n // eslint-disable-next-line no-case-declarations\n const ops = await downloadBinary({\n logger,\n baseDir: downloadDir,\n softwareName: \"pl\",\n archiveName: `pl-${src.version}`,\n arch: os.arch(),\n platform: os.platform(),\n dispatcher,\n });\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"],"mappings":";;;;;;;AAuBA,SAAgB,2BAAmD;AACjE,QAAO;EAAE,MAAM;EAAY,SAAS,qBAAqB;EAAE;;AAG7D,eAAsB,yBAAyB,EAC7C,QACA,aACA,KACA,cAMkB;AAClB,SAAQ,IAAI,MAAZ;EACE,KAAK;GAEH,MAAM,MAAM,MAAM,eAAe;IAC/B;IACA,SAAS;IACT,cAAc;IACd,aAAa,MAAM,IAAI;IACvB,MAAM,GAAG,MAAM;IACf,UAAU,GAAG,UAAU;IACvB;IACD,CAAC;AACF,UAAO,MAAM,KAAK,IAAI,UAAU,YAAY,eAAe,MAAM,GAAG,UAAU,CAAC,EAAE;EAEnF,KAAK,QACH,QAAO,IAAI;EAEb,QACE,aAAY,IAAI;;;AAItB,MAAa,iBAAyC;CACpD,OAAO;CACP,OAAO;CACP,SAAS;CACV"}
@@ -1,5 +1,5 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_os_and_arch = require('./os_and_arch.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_os_and_arch = require("./os_and_arch.cjs");
3
3
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_runtime.__toESM(node_fs);
@@ -14,7 +14,6 @@ let tar = require("tar");
14
14
  tar = require_runtime.__toESM(tar);
15
15
  let decompress = require("decompress");
16
16
  decompress = require_runtime.__toESM(decompress);
17
-
18
17
  //#region src/common/pl_binary_download.ts
19
18
  const cdn = "https://cdn.platforma.bio/software";
20
19
  const gaCdn = "https://cdn-ga.pl-open.science/software";
@@ -153,8 +152,8 @@ const osToArchiveType = {
153
152
  macos: "tgz",
154
153
  windows: "zip"
155
154
  };
156
-
157
155
  //#endregion
158
156
  exports.downloadBinary = downloadBinary;
159
157
  exports.downloadBinaryNoExtract = downloadBinaryNoExtract;
158
+
160
159
  //# sourceMappingURL=pl_binary_download.cjs.map
@@ -1 +1 @@
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
+ {"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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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_binary_download.d.ts","names":[],"sources":["../../src/common/pl_binary_download.ts"],"mappings":";;;;KAmBY,oBAAA;EACV,UAAA;EACA,uBAAA;EACA,iBAAA;EACA,WAAA;EACA,WAAA,EAAa,WAAA;EACb,YAAA;EACA,QAAA;AAAA;AAAA,KAsOU,WAAA"}
@@ -8,7 +8,6 @@ import { Readable, Writable } from "node:stream";
8
8
  import { text } from "node:stream/consumers";
9
9
  import * as tar from "tar";
10
10
  import decompress from "decompress";
11
-
12
11
  //#region src/common/pl_binary_download.ts
13
12
  const cdn = "https://cdn.platforma.bio/software";
14
13
  const gaCdn = "https://cdn-ga.pl-open.science/software";
@@ -147,7 +146,7 @@ const osToArchiveType = {
147
146
  macos: "tgz",
148
147
  windows: "zip"
149
148
  };
150
-
151
149
  //#endregion
152
150
  export { downloadBinary, downloadBinaryNoExtract };
151
+
153
152
  //# sourceMappingURL=pl_binary_download.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl_binary_download.js","names":[],"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
+ {"version":3,"file":"pl_binary_download.js","names":[],"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,10 +1,9 @@
1
- const require_package = require('../package.cjs');
2
-
1
+ const require_package = require("../package.cjs");
3
2
  //#region src/common/pl_version.ts
4
3
  function getDefaultPlVersion() {
5
4
  return require_package.pl_version;
6
5
  }
7
-
8
6
  //#endregion
9
7
  exports.getDefaultPlVersion = getDefaultPlVersion;
8
+
10
9
  //# sourceMappingURL=pl_version.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl_version.cjs","names":[],"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"],"mappings":";;;AAEA,SAAgB,sBAA8B;AAE5C"}
1
+ {"version":3,"file":"pl_version.cjs","names":[],"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"],"mappings":";;AAEA,SAAgB,sBAA8B;AAE5C,QAAA,gBAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl_version.d.ts","names":[],"sources":["../../src/common/pl_version.ts"],"mappings":";iBAEgB,mBAAA,CAAA"}
@@ -1,10 +1,9 @@
1
1
  import { pl_version } from "../package.js";
2
-
3
2
  //#region src/common/pl_version.ts
4
3
  function getDefaultPlVersion() {
5
4
  return pl_version;
6
5
  }
7
-
8
6
  //#endregion
9
7
  export { getDefaultPlVersion };
8
+
10
9
  //# sourceMappingURL=pl_version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl_version.js","names":["packageJson[\"pl-version\"]"],"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"],"mappings":";;;AAEA,SAAgB,sBAA8B;AAE5C,QAAOA"}
1
+ {"version":3,"file":"pl_version.js","names":["packageJson[\"pl-version\"]"],"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"],"mappings":";;AAEA,SAAgB,sBAA8B;AAE5C,QAAOA"}
package/dist/index.cjs CHANGED
@@ -1,10 +1,9 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_pl_version = require('./common/pl_version.cjs');
3
- const require_pl = require('./local/pl.cjs');
4
- const require_ssh = require('./ssh/ssh.cjs');
5
- const require_connection_info = require('./ssh/connection_info.cjs');
6
- const require_pl$1 = require('./ssh/pl.cjs');
7
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_pl_version = require("./common/pl_version.cjs");
3
+ const require_pl = require("./local/pl.cjs");
4
+ const require_ssh = require("./ssh/ssh.cjs");
5
+ const require_connection_info = require("./ssh/connection_info.cjs");
6
+ const require_pl$1 = require("./ssh/pl.cjs");
8
7
  exports.ConnectionInfo = require_connection_info.ConnectionInfo;
9
8
  exports.LocalConfigYaml = require_pl.LocalConfigYaml;
10
9
  exports.LocalPl = require_pl.LocalPl;
@@ -19,4 +18,4 @@ exports.newConnectionInfo = require_connection_info.newConnectionInfo;
19
18
  exports.parseConnectionInfo = require_connection_info.parseConnectionInfo;
20
19
  exports.parseGlibcVersion = require_pl$1.parseGlibcVersion;
21
20
  exports.plProcessOps = require_pl.plProcessOps;
22
- exports.stringifyConnectionInfo = require_connection_info.stringifyConnectionInfo;
21
+ exports.stringifyConnectionInfo = require_connection_info.stringifyConnectionInfo;
package/dist/index.js CHANGED
@@ -3,5 +3,4 @@ import { LocalConfigYaml, LocalPl, localPlatformaInit, mergeDefaultOps, plProces
3
3
  import { SshClient } from "./ssh/ssh.js";
4
4
  import { ConnectionInfo, PortPair, SshPlPorts, newConnectionInfo, parseConnectionInfo, stringifyConnectionInfo } from "./ssh/connection_info.js";
5
5
  import { SshPl, parseGlibcVersion } from "./ssh/pl.js";
6
-
7
- export { ConnectionInfo, LocalConfigYaml, LocalPl, PortPair, SshClient, SshPl, SshPlPorts, getDefaultPlVersion, localPlatformaInit, mergeDefaultOps, newConnectionInfo, parseConnectionInfo, parseGlibcVersion, plProcessOps, stringifyConnectionInfo };
6
+ export { ConnectionInfo, LocalConfigYaml, LocalPl, PortPair, SshClient, SshPl, SshPlPorts, getDefaultPlVersion, localPlatformaInit, mergeDefaultOps, newConnectionInfo, parseConnectionInfo, parseGlibcVersion, plProcessOps, stringifyConnectionInfo };
@@ -1,10 +1,9 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
2
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
3
3
  let node_fs_promises = require("node:fs/promises");
4
4
  node_fs_promises = require_runtime.__toESM(node_fs_promises);
5
5
  let upath = require("upath");
6
6
  upath = require_runtime.__toESM(upath);
7
-
8
7
  //#region src/local/pid.ts
9
8
  function filePid(dir) {
10
9
  return upath.default.join(dir, "pl_pid");
@@ -17,9 +16,9 @@ async function readPid(filePath) {
17
16
  async function writePid(filePath, pid) {
18
17
  await node_fs_promises.default.writeFile(filePath, JSON.stringify(pid));
19
18
  }
20
-
21
19
  //#endregion
22
20
  exports.filePid = filePid;
23
21
  exports.readPid = readPid;
24
22
  exports.writePid = writePid;
23
+
25
24
  //# sourceMappingURL=pid.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pid.cjs","names":["fs"],"sources":["../../src/local/pid.ts"],"sourcesContent":["import { fileExists } from \"@milaboratories/ts-helpers\";\nimport fs from \"node:fs/promises\";\nimport upath from \"upath\";\n\nexport function filePid(dir: string) {\n return upath.join(dir, \"pl_pid\");\n}\n\nexport async function readPid(filePath: string): Promise<number | undefined> {\n if (!(await fileExists(filePath))) {\n return undefined;\n }\n\n const text = await fs.readFile(filePath);\n\n return Number(text.toString());\n}\n\nexport async function writePid(filePath: string, pid: number) {\n await fs.writeFile(filePath, JSON.stringify(pid));\n}\n"],"mappings":";;;;;;;;AAIA,SAAgB,QAAQ,KAAa;AACnC,QAAO,cAAM,KAAK,KAAK,SAAS;;AAGlC,eAAsB,QAAQ,UAA+C;AAC3E,KAAI,CAAE,iDAAiB,SAAS,CAC9B;CAGF,MAAM,OAAO,MAAMA,yBAAG,SAAS,SAAS;AAExC,QAAO,OAAO,KAAK,UAAU,CAAC;;AAGhC,eAAsB,SAAS,UAAkB,KAAa;AAC5D,OAAMA,yBAAG,UAAU,UAAU,KAAK,UAAU,IAAI,CAAC"}
1
+ {"version":3,"file":"pid.cjs","names":["fs"],"sources":["../../src/local/pid.ts"],"sourcesContent":["import { fileExists } from \"@milaboratories/ts-helpers\";\nimport fs from \"node:fs/promises\";\nimport upath from \"upath\";\n\nexport function filePid(dir: string) {\n return upath.join(dir, \"pl_pid\");\n}\n\nexport async function readPid(filePath: string): Promise<number | undefined> {\n if (!(await fileExists(filePath))) {\n return undefined;\n }\n\n const text = await fs.readFile(filePath);\n\n return Number(text.toString());\n}\n\nexport async function writePid(filePath: string, pid: number) {\n await fs.writeFile(filePath, JSON.stringify(pid));\n}\n"],"mappings":";;;;;;;AAIA,SAAgB,QAAQ,KAAa;AACnC,QAAO,MAAA,QAAM,KAAK,KAAK,SAAS;;AAGlC,eAAsB,QAAQ,UAA+C;AAC3E,KAAI,CAAE,OAAA,GAAA,2BAAA,YAAiB,SAAS,CAC9B;CAGF,MAAM,OAAO,MAAMA,iBAAAA,QAAG,SAAS,SAAS;AAExC,QAAO,OAAO,KAAK,UAAU,CAAC;;AAGhC,eAAsB,SAAS,UAAkB,KAAa;AAC5D,OAAMA,iBAAAA,QAAG,UAAU,UAAU,KAAK,UAAU,IAAI,CAAC"}
package/dist/local/pid.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { fileExists } from "@milaboratories/ts-helpers";
2
2
  import fsp from "node:fs/promises";
3
3
  import upath from "upath";
4
-
5
4
  //#region src/local/pid.ts
6
5
  function filePid(dir) {
7
6
  return upath.join(dir, "pl_pid");
@@ -14,7 +13,7 @@ async function readPid(filePath) {
14
13
  async function writePid(filePath, pid) {
15
14
  await fsp.writeFile(filePath, JSON.stringify(pid));
16
15
  }
17
-
18
16
  //#endregion
19
17
  export { filePid, readPid, writePid };
18
+
20
19
  //# sourceMappingURL=pid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pid.js","names":["fs"],"sources":["../../src/local/pid.ts"],"sourcesContent":["import { fileExists } from \"@milaboratories/ts-helpers\";\nimport fs from \"node:fs/promises\";\nimport upath from \"upath\";\n\nexport function filePid(dir: string) {\n return upath.join(dir, \"pl_pid\");\n}\n\nexport async function readPid(filePath: string): Promise<number | undefined> {\n if (!(await fileExists(filePath))) {\n return undefined;\n }\n\n const text = await fs.readFile(filePath);\n\n return Number(text.toString());\n}\n\nexport async function writePid(filePath: string, pid: number) {\n await fs.writeFile(filePath, JSON.stringify(pid));\n}\n"],"mappings":";;;;;AAIA,SAAgB,QAAQ,KAAa;AACnC,QAAO,MAAM,KAAK,KAAK,SAAS;;AAGlC,eAAsB,QAAQ,UAA+C;AAC3E,KAAI,CAAE,MAAM,WAAW,SAAS,CAC9B;CAGF,MAAM,OAAO,MAAMA,IAAG,SAAS,SAAS;AAExC,QAAO,OAAO,KAAK,UAAU,CAAC;;AAGhC,eAAsB,SAAS,UAAkB,KAAa;AAC5D,OAAMA,IAAG,UAAU,UAAU,KAAK,UAAU,IAAI,CAAC"}
1
+ {"version":3,"file":"pid.js","names":["fs"],"sources":["../../src/local/pid.ts"],"sourcesContent":["import { fileExists } from \"@milaboratories/ts-helpers\";\nimport fs from \"node:fs/promises\";\nimport upath from \"upath\";\n\nexport function filePid(dir: string) {\n return upath.join(dir, \"pl_pid\");\n}\n\nexport async function readPid(filePath: string): Promise<number | undefined> {\n if (!(await fileExists(filePath))) {\n return undefined;\n }\n\n const text = await fs.readFile(filePath);\n\n return Number(text.toString());\n}\n\nexport async function writePid(filePath: string, pid: number) {\n await fs.writeFile(filePath, JSON.stringify(pid));\n}\n"],"mappings":";;;;AAIA,SAAgB,QAAQ,KAAa;AACnC,QAAO,MAAM,KAAK,KAAK,SAAS;;AAGlC,eAAsB,QAAQ,UAA+C;AAC3E,KAAI,CAAE,MAAM,WAAW,SAAS,CAC9B;CAGF,MAAM,OAAO,MAAMA,IAAG,SAAS,SAAS;AAExC,QAAO,OAAO,KAAK,UAAU,CAAC;;AAGhC,eAAsB,SAAS,UAAkB,KAAa;AAC5D,OAAMA,IAAG,UAAU,UAAU,KAAK,UAAU,IAAI,CAAC"}
package/dist/local/pl.cjs CHANGED
@@ -1,8 +1,8 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_process = require('./process.cjs');
3
- const require_pl_binary = require('../common/pl_binary.cjs');
4
- const require_pid = require('./pid.cjs');
5
- const require_trace = require('./trace.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_process = require("./process.cjs");
3
+ const require_pl_binary = require("../common/pl_binary.cjs");
4
+ const require_pid = require("./pid.cjs");
5
+ const require_trace = require("./trace.cjs");
6
6
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
7
7
  let node_fs_promises = require("node:fs/promises");
8
8
  node_fs_promises = require_runtime.__toESM(node_fs_promises);
@@ -12,7 +12,6 @@ let node_os = require("node:os");
12
12
  node_os = require_runtime.__toESM(node_os);
13
13
  let _milaboratories_pl_http = require("@milaboratories/pl-http");
14
14
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
15
-
16
15
  //#region src/local/pl.ts
17
16
  const LocalConfigYaml = "config-local.yaml";
18
17
  /**
@@ -207,11 +206,11 @@ function plProcessOps(binaryPath, configPath, ops, workDir, defaultEnv) {
207
206
  };
208
207
  return result;
209
208
  }
210
-
211
209
  //#endregion
212
210
  exports.LocalConfigYaml = LocalConfigYaml;
213
211
  exports.LocalPl = LocalPl;
214
212
  exports.localPlatformaInit = localPlatformaInit;
215
213
  exports.mergeDefaultOps = mergeDefaultOps;
216
214
  exports.plProcessOps = plProcessOps;
215
+
217
216
  //# sourceMappingURL=pl.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pl.cjs","names":["withTrace","processRun","filePid","writePid","processWaitStopped","isProcessAlive","os","fsp","resolveLocalPlBinaryPath","readPid","processStop","newDefaultPlBinarySource"],"sources":["../../src/local/pl.ts"],"sourcesContent":["import type { ProcessOptions } from \"./process\";\nimport { isProcessAlive, processStop, processWaitStopped, processRun } from \"./process\";\nimport type { PlBinarySource } from \"../common/pl_binary\";\nimport { newDefaultPlBinarySource, resolveLocalPlBinaryPath } from \"../common/pl_binary\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { ChildProcess, SpawnOptions } from \"node:child_process\";\nimport { filePid, readPid, writePid } from \"./pid\";\nimport type { Trace } from \"./trace\";\nimport { withTrace } from \"./trace\";\nimport upath from \"upath\";\nimport fsp from \"node:fs/promises\";\nimport type { Required } from \"utility-types\";\nimport * as os from \"node:os\";\nimport type { ProxySettings } from \"@milaboratories/pl-http\";\nimport { defaultHttpDispatcher } from \"@milaboratories/pl-http\";\nimport { parseHttpAuth } from \"@milaboratories/pl-model-common\";\n\nexport const LocalConfigYaml = \"config-local.yaml\";\n\n/**\n * Represents a local running pl-core,\n * and has methods to start, check if it's running, stop and wait for stopping it.\n * Also, a hook on pl-core closed can be provided.\n */\nexport class LocalPl {\n private instance?: ChildProcess;\n public pid?: number;\n private nRuns: number = 0;\n private lastRunHistory: Trace = {};\n private wasStopped = false;\n\n constructor(\n private readonly logger: MiLogger,\n private readonly workingDir: string,\n private readonly startOptions: ProcessOptions,\n private readonly initialStartHistory: Trace,\n private readonly onClose?: (pl: LocalPl) => Promise<void>,\n private readonly onError?: (pl: LocalPl) => Promise<void>,\n private readonly onCloseAndError?: (pl: LocalPl) => Promise<void>,\n private readonly onCloseAndErrorNoStop?: (pl: LocalPl) => Promise<void>,\n ) {}\n\n async start() {\n await withTrace(this.logger, async (trace, t) => {\n this.wasStopped = false;\n const instance = processRun(this.logger, this.startOptions);\n instance.on(\"error\", (e: any) => {\n this.logger.error(\n `error '${e}', while running platforma, started opts: ${JSON.stringify(this.debugInfo())}`,\n );\n\n // keep in mind there are no awaits here, it will be asynchronous\n if (this.onError !== undefined) void this.onError(this);\n if (this.onCloseAndError !== undefined) void this.onCloseAndError(this);\n if (this.onCloseAndErrorNoStop !== undefined && !this.wasStopped)\n void this.onCloseAndErrorNoStop(this);\n });\n instance.on(\"close\", () => {\n this.logger.warn(`platforma was closed, started opts: ${JSON.stringify(this.debugInfo())}`);\n\n // keep in mind there are no awaits here, it will be asynchronous\n if (this.onClose !== undefined) void this.onClose(this);\n if (this.onCloseAndError !== undefined) void this.onCloseAndError(this);\n if (this.onCloseAndErrorNoStop !== undefined && !this.wasStopped)\n void this.onCloseAndErrorNoStop(this);\n });\n\n trace(\"started\", true);\n\n const pidFile = trace(\"pidFile\", filePid(this.workingDir));\n trace(\"pid\", notEmpty(instance.pid));\n trace(\"pidWritten\", await writePid(pidFile, notEmpty(instance.pid)));\n\n this.nRuns++;\n this.instance = instance;\n this.pid = instance.pid;\n this.lastRunHistory = t;\n });\n }\n\n stop() {\n // TODO use this.instance to stop the process\n this.wasStopped = true;\n processStop(notEmpty(this.pid));\n }\n\n async waitStopped() {\n await processWaitStopped(notEmpty(this.pid), 15000);\n }\n\n stopped() {\n return this.wasStopped;\n }\n\n async isAlive(): Promise<boolean> {\n return await isProcessAlive(notEmpty(this.pid));\n }\n\n debugInfo() {\n return {\n lastRunHistory: this.lastRunHistory,\n nRuns: this.nRuns,\n pid: this.pid,\n workingDir: this.workingDir,\n initialStartHistory: this.initialStartHistory,\n wasStopped: this.wasStopped,\n };\n }\n}\n\n/** Options to start a local pl-core. */\nexport type LocalPlOptions = {\n /** From what directory start a process. */\n readonly workingDir: string;\n /** A string representation of yaml config. */\n readonly config: string;\n /** How to get a binary, download it or get an existing one (default: download latest version) */\n readonly plBinary?: PlBinarySource;\n /** Additional options for a process, environments, stdout, stderr etc. */\n readonly spawnOptions?: SpawnOptions;\n /**\n * If the previous pl-core was started from the same directory,\n * we can check if it's still running and then stop it before starting a new one.\n * (default: true)\n */\n readonly closeOld?: boolean;\n /**\n * Proxy settings to use to fetch the binary and pass it down\n * as a HTTPS_PROXY/HTTP_PROXY environment variable;\n * Backend only supports Basic auth.\n */\n readonly proxy?: ProxySettings;\n\n readonly onClose?: (pl: LocalPl) => Promise<void>;\n readonly onError?: (pl: LocalPl) => Promise<void>;\n readonly onCloseAndError?: (pl: LocalPl) => Promise<void>;\n readonly onCloseAndErrorNoStop?: (pl: LocalPl) => Promise<void>;\n};\n\nexport type LocalPlOptionsFull = Required<LocalPlOptions, \"plBinary\" | \"spawnOptions\" | \"closeOld\">;\n\n/**\n * Starts pl-core, if the option was provided downloads a binary, reads license environments etc.\n */\nexport async function localPlatformaInit(logger: MiLogger, _ops: LocalPlOptions): Promise<LocalPl> {\n // filling-in default values\n\n // Backend could consume a lot of CPU power,\n // we want to keep at least a couple for UI and other apps to work.\n const numCpu = Math.max(os.cpus().length - 2, 1);\n const ops = mergeDefaultOps(_ops, numCpu);\n\n return await withTrace(logger, async (trace, t) => {\n trace(\"startOptions\", { ...ops, config: \"too wordy\" });\n\n const workDir = upath.resolve(ops.workingDir);\n\n if (ops.closeOld) {\n trace(\"closeOld\", await localPlatformaReadPidAndStop(logger, workDir));\n }\n\n const configPath = upath.join(workDir, LocalConfigYaml);\n\n logger.info(`writing configuration '${configPath}'...`);\n await fsp.writeFile(configPath, ops.config);\n\n const plBinPath = upath.join(workDir, \"binaries\");\n const baseBinaryPath = await resolveLocalPlBinaryPath({\n logger,\n downloadDir: plBinPath,\n src: ops.plBinary,\n dispatcher: defaultHttpDispatcher(ops.proxy),\n });\n const binaryPath = trace(\"binaryPath\", upath.join(\"binaries\", baseBinaryPath));\n\n const env = { ...process.env };\n\n if (ops.proxy?.url) {\n const url = new URL(ops.proxy.url);\n if (ops.proxy.auth) {\n const parsed = parseHttpAuth(ops.proxy.auth);\n if (parsed.scheme !== \"Basic\") {\n throw new Error(`\\\nUnsupported auth scheme: ${parsed.scheme}. \\\nOnly Basic auth is supported by the backend.`);\n }\n url.username = parsed.username;\n url.password = parsed.password;\n }\n env.http_proxy = url.toString();\n env.https_proxy = url.toString();\n }\n\n const processOpts = plProcessOps(binaryPath, configPath, ops, workDir, env);\n trace(\"processOpts\", {\n cmd: processOpts.cmd,\n args: processOpts.args,\n cwd: processOpts.opts.cwd,\n });\n\n const pl = new LocalPl(\n logger,\n ops.workingDir,\n processOpts,\n t,\n ops.onClose,\n ops.onError,\n ops.onCloseAndError,\n ops.onCloseAndErrorNoStop,\n );\n await pl.start();\n\n return pl;\n });\n}\n\n/** Reads a pid of the old pl-core if it was started in the same working directory,\n * and closes it. */\nasync function localPlatformaReadPidAndStop(\n logger: MiLogger,\n workingDir: string,\n): Promise<Record<string, any>> {\n return await withTrace(logger, async (trace, t) => {\n const file = trace(\"pidFilePath\", filePid(workingDir));\n\n const oldPid = trace(\"pid\", await readPid(file));\n const alive = trace(\"wasAlive\", await isProcessAlive(oldPid));\n\n if (oldPid !== undefined && alive) {\n trace(\"stopped\", processStop(oldPid));\n try {\n trace(\"waitStopped\", await processWaitStopped(oldPid, 15_000)); // larger, that 10s we provide to backend in config.\n } catch {\n trace(\"forceStopped\", processStop(oldPid, true));\n trace(\"waitForceStopped\", await processWaitStopped(oldPid, 5_000));\n }\n }\n\n return t;\n });\n}\n\n/** Gets default options for the whole init process\n * and overrides them with the provided options. */\nexport function mergeDefaultOps(ops: LocalPlOptions, numCpu: number): LocalPlOptionsFull {\n const result: {\n plBinary: PlBinarySource;\n spawnOptions: SpawnOptions;\n closeOld: boolean;\n } = {\n plBinary: newDefaultPlBinarySource(),\n spawnOptions: {\n env: {\n GOMAXPROCS: String(numCpu),\n },\n },\n closeOld: true,\n };\n\n if (ops.spawnOptions?.env) {\n result.spawnOptions.env = { ...result.spawnOptions.env, ...ops.spawnOptions.env };\n }\n\n if (ops.spawnOptions) {\n const withoutEnv = { ...ops.spawnOptions };\n delete withoutEnv[\"env\"];\n result.spawnOptions = { ...result.spawnOptions, ...withoutEnv };\n }\n\n const withoutSpawnOps = { ...ops };\n delete withoutSpawnOps[\"spawnOptions\"];\n\n return { ...result, ...withoutSpawnOps };\n}\n\n/** Gets default options for a platforma local binary\n * and overrides them with the provided options. */\nexport function plProcessOps(\n binaryPath: any,\n configPath: string,\n ops: LocalPlOptionsFull,\n workDir: string,\n defaultEnv: Record<string, string | undefined>,\n): ProcessOptions {\n const result: ProcessOptions = {\n cmd: binaryPath,\n args: [\"--config\", configPath],\n opts: {\n env: { ...defaultEnv },\n cwd: workDir,\n stdio: [\"pipe\", \"ignore\", \"inherit\"],\n windowsHide: true, // hide a terminal on Windows\n },\n };\n\n if (ops.spawnOptions?.env) {\n result.opts.env = { ...result.opts.env, ...ops.spawnOptions.env };\n }\n\n const withoutEnv = { ...ops.spawnOptions };\n delete withoutEnv[\"env\"];\n result.opts = { ...result.opts, ...withoutEnv };\n\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pl.cjs","names":["withTrace","processRun","filePid","writePid","processWaitStopped","isProcessAlive","os","fsp","resolveLocalPlBinaryPath","readPid","processStop","newDefaultPlBinarySource"],"sources":["../../src/local/pl.ts"],"sourcesContent":["import type { ProcessOptions } from \"./process\";\nimport { isProcessAlive, processStop, processWaitStopped, processRun } from \"./process\";\nimport type { PlBinarySource } from \"../common/pl_binary\";\nimport { newDefaultPlBinarySource, resolveLocalPlBinaryPath } from \"../common/pl_binary\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { ChildProcess, SpawnOptions } from \"node:child_process\";\nimport { filePid, readPid, writePid } from \"./pid\";\nimport type { Trace } from \"./trace\";\nimport { withTrace } from \"./trace\";\nimport upath from \"upath\";\nimport fsp from \"node:fs/promises\";\nimport type { Required } from \"utility-types\";\nimport * as os from \"node:os\";\nimport type { ProxySettings } from \"@milaboratories/pl-http\";\nimport { defaultHttpDispatcher } from \"@milaboratories/pl-http\";\nimport { parseHttpAuth } from \"@milaboratories/pl-model-common\";\n\nexport const LocalConfigYaml = \"config-local.yaml\";\n\n/**\n * Represents a local running pl-core,\n * and has methods to start, check if it's running, stop and wait for stopping it.\n * Also, a hook on pl-core closed can be provided.\n */\nexport class LocalPl {\n private instance?: ChildProcess;\n public pid?: number;\n private nRuns: number = 0;\n private lastRunHistory: Trace = {};\n private wasStopped = false;\n\n constructor(\n private readonly logger: MiLogger,\n private readonly workingDir: string,\n private readonly startOptions: ProcessOptions,\n private readonly initialStartHistory: Trace,\n private readonly onClose?: (pl: LocalPl) => Promise<void>,\n private readonly onError?: (pl: LocalPl) => Promise<void>,\n private readonly onCloseAndError?: (pl: LocalPl) => Promise<void>,\n private readonly onCloseAndErrorNoStop?: (pl: LocalPl) => Promise<void>,\n ) {}\n\n async start() {\n await withTrace(this.logger, async (trace, t) => {\n this.wasStopped = false;\n const instance = processRun(this.logger, this.startOptions);\n instance.on(\"error\", (e: any) => {\n this.logger.error(\n `error '${e}', while running platforma, started opts: ${JSON.stringify(this.debugInfo())}`,\n );\n\n // keep in mind there are no awaits here, it will be asynchronous\n if (this.onError !== undefined) void this.onError(this);\n if (this.onCloseAndError !== undefined) void this.onCloseAndError(this);\n if (this.onCloseAndErrorNoStop !== undefined && !this.wasStopped)\n void this.onCloseAndErrorNoStop(this);\n });\n instance.on(\"close\", () => {\n this.logger.warn(`platforma was closed, started opts: ${JSON.stringify(this.debugInfo())}`);\n\n // keep in mind there are no awaits here, it will be asynchronous\n if (this.onClose !== undefined) void this.onClose(this);\n if (this.onCloseAndError !== undefined) void this.onCloseAndError(this);\n if (this.onCloseAndErrorNoStop !== undefined && !this.wasStopped)\n void this.onCloseAndErrorNoStop(this);\n });\n\n trace(\"started\", true);\n\n const pidFile = trace(\"pidFile\", filePid(this.workingDir));\n trace(\"pid\", notEmpty(instance.pid));\n trace(\"pidWritten\", await writePid(pidFile, notEmpty(instance.pid)));\n\n this.nRuns++;\n this.instance = instance;\n this.pid = instance.pid;\n this.lastRunHistory = t;\n });\n }\n\n stop() {\n // TODO use this.instance to stop the process\n this.wasStopped = true;\n processStop(notEmpty(this.pid));\n }\n\n async waitStopped() {\n await processWaitStopped(notEmpty(this.pid), 15000);\n }\n\n stopped() {\n return this.wasStopped;\n }\n\n async isAlive(): Promise<boolean> {\n return await isProcessAlive(notEmpty(this.pid));\n }\n\n debugInfo() {\n return {\n lastRunHistory: this.lastRunHistory,\n nRuns: this.nRuns,\n pid: this.pid,\n workingDir: this.workingDir,\n initialStartHistory: this.initialStartHistory,\n wasStopped: this.wasStopped,\n };\n }\n}\n\n/** Options to start a local pl-core. */\nexport type LocalPlOptions = {\n /** From what directory start a process. */\n readonly workingDir: string;\n /** A string representation of yaml config. */\n readonly config: string;\n /** How to get a binary, download it or get an existing one (default: download latest version) */\n readonly plBinary?: PlBinarySource;\n /** Additional options for a process, environments, stdout, stderr etc. */\n readonly spawnOptions?: SpawnOptions;\n /**\n * If the previous pl-core was started from the same directory,\n * we can check if it's still running and then stop it before starting a new one.\n * (default: true)\n */\n readonly closeOld?: boolean;\n /**\n * Proxy settings to use to fetch the binary and pass it down\n * as a HTTPS_PROXY/HTTP_PROXY environment variable;\n * Backend only supports Basic auth.\n */\n readonly proxy?: ProxySettings;\n\n readonly onClose?: (pl: LocalPl) => Promise<void>;\n readonly onError?: (pl: LocalPl) => Promise<void>;\n readonly onCloseAndError?: (pl: LocalPl) => Promise<void>;\n readonly onCloseAndErrorNoStop?: (pl: LocalPl) => Promise<void>;\n};\n\nexport type LocalPlOptionsFull = Required<LocalPlOptions, \"plBinary\" | \"spawnOptions\" | \"closeOld\">;\n\n/**\n * Starts pl-core, if the option was provided downloads a binary, reads license environments etc.\n */\nexport async function localPlatformaInit(logger: MiLogger, _ops: LocalPlOptions): Promise<LocalPl> {\n // filling-in default values\n\n // Backend could consume a lot of CPU power,\n // we want to keep at least a couple for UI and other apps to work.\n const numCpu = Math.max(os.cpus().length - 2, 1);\n const ops = mergeDefaultOps(_ops, numCpu);\n\n return await withTrace(logger, async (trace, t) => {\n trace(\"startOptions\", { ...ops, config: \"too wordy\" });\n\n const workDir = upath.resolve(ops.workingDir);\n\n if (ops.closeOld) {\n trace(\"closeOld\", await localPlatformaReadPidAndStop(logger, workDir));\n }\n\n const configPath = upath.join(workDir, LocalConfigYaml);\n\n logger.info(`writing configuration '${configPath}'...`);\n await fsp.writeFile(configPath, ops.config);\n\n const plBinPath = upath.join(workDir, \"binaries\");\n const baseBinaryPath = await resolveLocalPlBinaryPath({\n logger,\n downloadDir: plBinPath,\n src: ops.plBinary,\n dispatcher: defaultHttpDispatcher(ops.proxy),\n });\n const binaryPath = trace(\"binaryPath\", upath.join(\"binaries\", baseBinaryPath));\n\n const env = { ...process.env };\n\n if (ops.proxy?.url) {\n const url = new URL(ops.proxy.url);\n if (ops.proxy.auth) {\n const parsed = parseHttpAuth(ops.proxy.auth);\n if (parsed.scheme !== \"Basic\") {\n throw new Error(`\\\nUnsupported auth scheme: ${parsed.scheme}. \\\nOnly Basic auth is supported by the backend.`);\n }\n url.username = parsed.username;\n url.password = parsed.password;\n }\n env.http_proxy = url.toString();\n env.https_proxy = url.toString();\n }\n\n const processOpts = plProcessOps(binaryPath, configPath, ops, workDir, env);\n trace(\"processOpts\", {\n cmd: processOpts.cmd,\n args: processOpts.args,\n cwd: processOpts.opts.cwd,\n });\n\n const pl = new LocalPl(\n logger,\n ops.workingDir,\n processOpts,\n t,\n ops.onClose,\n ops.onError,\n ops.onCloseAndError,\n ops.onCloseAndErrorNoStop,\n );\n await pl.start();\n\n return pl;\n });\n}\n\n/** Reads a pid of the old pl-core if it was started in the same working directory,\n * and closes it. */\nasync function localPlatformaReadPidAndStop(\n logger: MiLogger,\n workingDir: string,\n): Promise<Record<string, any>> {\n return await withTrace(logger, async (trace, t) => {\n const file = trace(\"pidFilePath\", filePid(workingDir));\n\n const oldPid = trace(\"pid\", await readPid(file));\n const alive = trace(\"wasAlive\", await isProcessAlive(oldPid));\n\n if (oldPid !== undefined && alive) {\n trace(\"stopped\", processStop(oldPid));\n try {\n trace(\"waitStopped\", await processWaitStopped(oldPid, 15_000)); // larger, that 10s we provide to backend in config.\n } catch {\n trace(\"forceStopped\", processStop(oldPid, true));\n trace(\"waitForceStopped\", await processWaitStopped(oldPid, 5_000));\n }\n }\n\n return t;\n });\n}\n\n/** Gets default options for the whole init process\n * and overrides them with the provided options. */\nexport function mergeDefaultOps(ops: LocalPlOptions, numCpu: number): LocalPlOptionsFull {\n const result: {\n plBinary: PlBinarySource;\n spawnOptions: SpawnOptions;\n closeOld: boolean;\n } = {\n plBinary: newDefaultPlBinarySource(),\n spawnOptions: {\n env: {\n GOMAXPROCS: String(numCpu),\n },\n },\n closeOld: true,\n };\n\n if (ops.spawnOptions?.env) {\n result.spawnOptions.env = { ...result.spawnOptions.env, ...ops.spawnOptions.env };\n }\n\n if (ops.spawnOptions) {\n const withoutEnv = { ...ops.spawnOptions };\n delete withoutEnv[\"env\"];\n result.spawnOptions = { ...result.spawnOptions, ...withoutEnv };\n }\n\n const withoutSpawnOps = { ...ops };\n delete withoutSpawnOps[\"spawnOptions\"];\n\n return { ...result, ...withoutSpawnOps };\n}\n\n/** Gets default options for a platforma local binary\n * and overrides them with the provided options. */\nexport function plProcessOps(\n binaryPath: any,\n configPath: string,\n ops: LocalPlOptionsFull,\n workDir: string,\n defaultEnv: Record<string, string | undefined>,\n): ProcessOptions {\n const result: ProcessOptions = {\n cmd: binaryPath,\n args: [\"--config\", configPath],\n opts: {\n env: { ...defaultEnv },\n cwd: workDir,\n stdio: [\"pipe\", \"ignore\", \"inherit\"],\n windowsHide: true, // hide a terminal on Windows\n },\n };\n\n if (ops.spawnOptions?.env) {\n result.opts.env = { ...result.opts.env, ...ops.spawnOptions.env };\n }\n\n const withoutEnv = { ...ops.spawnOptions };\n delete withoutEnv[\"env\"];\n result.opts = { ...result.opts, ...withoutEnv };\n\n return result;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl.d.ts","names":[],"sources":["../../src/local/pl.ts"],"mappings":";;;;;;;;;cAkBa,eAAA;;AAAb;;;;cAOa,OAAA;EAAA,iBAQQ,MAAA;EAAA,iBACA,UAAA;EAAA,iBACA,YAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,OAAA;EAAA,iBACA,OAAA;EAAA,iBACA,eAAA;EAAA,iBACA,qBAAA;EAAA,QAdX,QAAA;EACD,GAAA;EAAA,QACC,KAAA;EAAA,QACA,cAAA;EAAA,QACA,UAAA;cAGW,MAAA,EAAQ,QAAA,EACR,UAAA,UACA,YAAA,EAAc,cAAA,EACd,mBAAA,EAAqB,KAAA,EACrB,OAAA,KAAW,EAAA,EAAI,OAAA,KAAY,OAAA,qBAC3B,OAAA,KAAW,EAAA,EAAI,OAAA,KAAY,OAAA,qBAC3B,eAAA,KAAmB,EAAA,EAAI,OAAA,KAAY,OAAA,qBACnC,qBAAA,KAAyB,EAAA,EAAI,OAAA,KAAY,OAAA;EAGtD,KAAA,CAAA,GAAK,OAAA;EAsCX,IAAA,CAAA;EAMM,WAAA,CAAA,GAAW,OAAA;EAIjB,OAAA,CAAA;EAIM,OAAA,CAAA,GAAW,OAAA;EAIjB,SAAA,CAAA;;;;;;;;;;KAaU,cAAA;EArFH,oDAuFE,UAAA,UArFD;EAAA,SAuFC,MAAA;WAEA,QAAA,GAAW,cAAA,EArFD;EAAA,SAuFV,YAAA,GAAe,YAAA;EArFS;;;;;EAAA,SA2FxB,QAAA;EAzFqC;;;;;EAAA,SA+FrC,KAAA,GAAQ,aAAA;EAAA,SAER,OAAA,IAAW,EAAA,EAAI,OAAA,KAAY,OAAA;EAAA,SAC3B,OAAA,IAAW,EAAA,EAAI,OAAA,KAAY,OAAA;EAAA,SAC3B,eAAA,IAAmB,EAAA,EAAI,OAAA,KAAY,OAAA;EAAA,SACnC,qBAAA,IAAyB,EAAA,EAAI,OAAA,KAAY,OAAA;AAAA;AAAA,KAGxC,kBAAA,GAAqB,QAAA,CAAS,cAAA;;;;iBAKpB,kBAAA,CAAmB,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA;;;iBAoG1E,eAAA,CAAgB,GAAA,EAAK,cAAA,EAAgB,MAAA,WAAiB,kBAAA;;;iBAiCtD,YAAA,CACd,UAAA,OACA,UAAA,UACA,GAAA,EAAK,kBAAA,EACL,OAAA,UACA,UAAA,EAAY,MAAA,+BACX,cAAA"}
package/dist/local/pl.js CHANGED
@@ -8,7 +8,6 @@ import upath from "upath";
8
8
  import * as os$1 from "node:os";
9
9
  import { defaultHttpDispatcher } from "@milaboratories/pl-http";
10
10
  import { parseHttpAuth } from "@milaboratories/pl-model-common";
11
-
12
11
  //#region src/local/pl.ts
13
12
  const LocalConfigYaml = "config-local.yaml";
14
13
  /**
@@ -203,7 +202,7 @@ function plProcessOps(binaryPath, configPath, ops, workDir, defaultEnv) {
203
202
  };
204
203
  return result;
205
204
  }
206
-
207
205
  //#endregion
208
206
  export { LocalConfigYaml, LocalPl, localPlatformaInit, mergeDefaultOps, plProcessOps };
207
+
209
208
  //# sourceMappingURL=pl.js.map