@milaboratories/pl-deployments 2.15.7 → 2.15.8

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 (106) hide show
  1. package/README.md +18 -5
  2. package/dist/common/os_and_arch.cjs +19 -19
  3. package/dist/common/os_and_arch.cjs.map +1 -1
  4. package/dist/common/os_and_arch.js +19 -19
  5. package/dist/common/os_and_arch.js.map +1 -1
  6. package/dist/common/pl_binary.cjs +9 -9
  7. package/dist/common/pl_binary.cjs.map +1 -1
  8. package/dist/common/pl_binary.d.ts +6 -6
  9. package/dist/common/pl_binary.d.ts.map +1 -1
  10. package/dist/common/pl_binary.js +9 -9
  11. package/dist/common/pl_binary.js.map +1 -1
  12. package/dist/common/pl_binary_download.cjs +16 -16
  13. package/dist/common/pl_binary_download.cjs.map +1 -1
  14. package/dist/common/pl_binary_download.d.ts +6 -6
  15. package/dist/common/pl_binary_download.d.ts.map +1 -1
  16. package/dist/common/pl_binary_download.js +16 -16
  17. package/dist/common/pl_binary_download.js.map +1 -1
  18. package/dist/common/pl_version.cjs +1 -1
  19. package/dist/common/pl_version.cjs.map +1 -1
  20. package/dist/common/pl_version.js +1 -1
  21. package/dist/common/pl_version.js.map +1 -1
  22. package/dist/index.d.ts +5 -5
  23. package/dist/local/options.d.ts +4 -4
  24. package/dist/local/pid.cjs +1 -1
  25. package/dist/local/pid.cjs.map +1 -1
  26. package/dist/local/pid.js +1 -1
  27. package/dist/local/pid.js.map +1 -1
  28. package/dist/local/pl.cjs +26 -26
  29. package/dist/local/pl.cjs.map +1 -1
  30. package/dist/local/pl.d.ts +8 -8
  31. package/dist/local/pl.d.ts.map +1 -1
  32. package/dist/local/pl.js +26 -26
  33. package/dist/local/pl.js.map +1 -1
  34. package/dist/local/process.cjs +16 -16
  35. package/dist/local/process.cjs.map +1 -1
  36. package/dist/local/process.d.ts +2 -2
  37. package/dist/local/process.js +16 -16
  38. package/dist/local/process.js.map +1 -1
  39. package/dist/local/trace.cjs.map +1 -1
  40. package/dist/local/trace.d.ts +1 -1
  41. package/dist/local/trace.js.map +1 -1
  42. package/dist/package.json.cjs +2 -1
  43. package/dist/package.json.cjs.map +1 -1
  44. package/dist/package.json.js +2 -1
  45. package/dist/package.json.js.map +1 -1
  46. package/dist/ssh/__tests__/common-utils.d.ts +2 -2
  47. package/dist/ssh/__tests__/common-utils.d.ts.map +1 -1
  48. package/dist/ssh/connection_info.cjs +13 -7
  49. package/dist/ssh/connection_info.cjs.map +1 -1
  50. package/dist/ssh/connection_info.d.ts +1 -1
  51. package/dist/ssh/connection_info.d.ts.map +1 -1
  52. package/dist/ssh/connection_info.js +13 -7
  53. package/dist/ssh/connection_info.js.map +1 -1
  54. package/dist/ssh/pl.cjs +79 -76
  55. package/dist/ssh/pl.cjs.map +1 -1
  56. package/dist/ssh/pl.d.ts +18 -18
  57. package/dist/ssh/pl.d.ts.map +1 -1
  58. package/dist/ssh/pl.js +79 -76
  59. package/dist/ssh/pl.js.map +1 -1
  60. package/dist/ssh/pl_paths.cjs +13 -13
  61. package/dist/ssh/pl_paths.cjs.map +1 -1
  62. package/dist/ssh/pl_paths.d.ts.map +1 -1
  63. package/dist/ssh/pl_paths.js +13 -13
  64. package/dist/ssh/pl_paths.js.map +1 -1
  65. package/dist/ssh/ssh.cjs +43 -40
  66. package/dist/ssh/ssh.cjs.map +1 -1
  67. package/dist/ssh/ssh.d.ts +9 -9
  68. package/dist/ssh/ssh.d.ts.map +1 -1
  69. package/dist/ssh/ssh.js +43 -40
  70. package/dist/ssh/ssh.js.map +1 -1
  71. package/dist/ssh/ssh_errors.cjs +7 -5
  72. package/dist/ssh/ssh_errors.cjs.map +1 -1
  73. package/dist/ssh/ssh_errors.d.ts.map +1 -1
  74. package/dist/ssh/ssh_errors.js +7 -5
  75. package/dist/ssh/ssh_errors.js.map +1 -1
  76. package/dist/ssh/supervisord.cjs +15 -13
  77. package/dist/ssh/supervisord.cjs.map +1 -1
  78. package/dist/ssh/supervisord.d.ts +2 -2
  79. package/dist/ssh/supervisord.d.ts.map +1 -1
  80. package/dist/ssh/supervisord.js +15 -13
  81. package/dist/ssh/supervisord.js.map +1 -1
  82. package/package.json +37 -36
  83. package/src/common/os_and_arch.ts +19 -19
  84. package/src/common/pl_binary.ts +30 -27
  85. package/src/common/pl_binary_download.ts +80 -59
  86. package/src/common/pl_version.ts +2 -2
  87. package/src/index.ts +5 -5
  88. package/src/local/config.test.yaml +19 -19
  89. package/src/local/options.ts +4 -4
  90. package/src/local/pid.ts +4 -4
  91. package/src/local/pl.test.ts +245 -253
  92. package/src/local/pl.ts +45 -50
  93. package/src/local/process.ts +21 -21
  94. package/src/local/trace.ts +1 -1
  95. package/src/ssh/__tests__/common-utils.ts +21 -19
  96. package/src/ssh/__tests__/pl-docker.test.ts +68 -59
  97. package/src/ssh/__tests__/ssh-docker.test.ts +152 -90
  98. package/src/ssh/__tests__/ssh-upload.test.ts +42 -31
  99. package/src/ssh/connection_info.ts +33 -27
  100. package/src/ssh/pl.test.ts +15 -13
  101. package/src/ssh/pl.ts +228 -143
  102. package/src/ssh/pl_paths.ts +22 -18
  103. package/src/ssh/ssh.ts +151 -74
  104. package/src/ssh/ssh_errors.test.ts +39 -39
  105. package/src/ssh/ssh_errors.ts +8 -6
  106. package/src/ssh/supervisord.ts +28 -28
@@ -9,31 +9,31 @@ import { fileExists, assertNever } from '@milaboratories/ts-helpers';
9
9
  import decompress from 'decompress';
10
10
  import { newOs, newArch } from './os_and_arch.js';
11
11
 
12
- const cdn = 'https://cdn.platforma.bio/software';
12
+ const cdn = "https://cdn.platforma.bio/software";
13
13
  // We'll download things from Global Access if downloading from CDN has failed
14
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, dispatcher }) {
15
+ const gaCdn = "https://cdn-ga.pl-open.science/software";
16
+ async function downloadBinaryNoExtract({ logger, baseDir, softwareName, tgzName, arch, platform, dispatcher, }) {
17
17
  const opts = getPathsForDownload(softwareName, tgzName, baseDir, newArch(arch), newOs(platform));
18
18
  const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;
19
19
  try {
20
20
  await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });
21
21
  opts.wasDownloadedFrom = archiveUrl;
22
22
  }
23
- catch (_e) {
23
+ catch {
24
24
  await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });
25
25
  opts.wasDownloadedFrom = alternativeArchiveGAUrl;
26
26
  }
27
27
  return opts;
28
28
  }
29
- async function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher }) {
29
+ async function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher, }) {
30
30
  const opts = getPathsForDownload(softwareName, archiveName, baseDir, newArch(arch), newOs(platform));
31
31
  const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;
32
32
  try {
33
33
  await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });
34
34
  opts.wasDownloadedFrom = archiveUrl;
35
35
  }
36
- catch (_e) {
36
+ catch {
37
37
  await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });
38
38
  opts.wasDownloadedFrom = alternativeArchiveGAUrl;
39
39
  }
@@ -58,7 +58,7 @@ function getPathsForDownload(softwareName, archiveName, baseDir, arch, os) {
58
58
  baseName,
59
59
  };
60
60
  }
61
- async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher }) {
61
+ async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher, }) {
62
62
  const state = {};
63
63
  state.archivePath = archivePath;
64
64
  try {
@@ -80,7 +80,7 @@ async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher })
80
80
  throw new Error(state.errorMsg);
81
81
  }
82
82
  // to prevent incomplete downloads we first write in a temp file
83
- state.tmpPath = archivePath + '.tmp';
83
+ state.tmpPath = archivePath + ".tmp";
84
84
  // eslint-disable-next-line n/no-unsupported-features/node-builtins
85
85
  await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));
86
86
  state.wroteTmp = true;
@@ -98,9 +98,9 @@ async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher })
98
98
  }
99
99
  }
100
100
  /** Used to prevent mid-way interrupted unarchived folders to be used */
101
- const MarkerFileName = '.ok';
101
+ const MarkerFileName = ".ok";
102
102
  async function extractArchive(logger, archivePath, archiveType, dstFolder) {
103
- logger.info('extracting archive...');
103
+ logger.info("extracting archive...");
104
104
  logger.info(` archive path: '${archivePath}'`);
105
105
  logger.info(` target dir: '${dstFolder}'`);
106
106
  if (!(await fileExists(archivePath))) {
@@ -121,27 +121,27 @@ async function extractArchive(logger, archivePath, archiveType, dstFolder) {
121
121
  await fsp.mkdir(dstFolder, { recursive: true });
122
122
  logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${dstFolder}`);
123
123
  switch (archiveType) {
124
- case 'tgz':
124
+ case "tgz":
125
125
  await tar.x({
126
126
  file: archivePath,
127
127
  cwd: dstFolder,
128
128
  gzip: true,
129
129
  });
130
130
  break;
131
- case 'zip':
131
+ case "zip":
132
132
  await decompress(archivePath, dstFolder);
133
133
  break;
134
134
  default:
135
135
  assertNever(archiveType);
136
136
  }
137
137
  // writing marker file, to be able in the future detect that we completely unarchived the tar file
138
- await fsp.writeFile(markerFilePath, 'ok');
138
+ await fsp.writeFile(markerFilePath, "ok");
139
139
  logger.info(` ... unpack done.`);
140
140
  }
141
141
  const osToArchiveType = {
142
- linux: 'tgz',
143
- macos: 'tgz',
144
- windows: 'zip',
142
+ linux: "tgz",
143
+ macos: "tgz",
144
+ windows: "zip",
145
145
  };
146
146
 
147
147
  export { downloadArchive, downloadBinary, downloadBinaryNoExtract, extractArchive };
@@ -1 +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 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, baseDir, softwareName, tgzName, arch, platform, dispatcher }: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n tgzName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n },\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 (_e) {\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, baseDir, softwareName, archiveName, arch, platform, dispatcher }: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n archiveName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n },\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, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch (_e) {\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, archiveUrl, archivePath, dispatcher }: {\n logger: MiLogger;\n archiveUrl: string;\n archivePath: string;\n dispatcher?: Dispatcher;\n },\n): Promise<DownloadInfo> {\n const state: DownloadInfo = {};\n state.archivePath = archivePath;\n\n try {\n state.fileExisted = await fileExists(archivePath);\n if (state.fileExisted) {\n logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);\n return state;\n }\n\n await fsp.mkdir(upath.dirname(archivePath), { recursive: true });\n state.dirnameCreated = true;\n\n logger.info(`Downloading archive:\\n URL: ${archiveUrl}\\n Save to: ${archivePath}`);\n\n const { body, statusCode } = await request(archiveUrl, { dispatcher });\n state.statusCode = statusCode;\n if (statusCode != 200) {\n // completely draining the stream to prevent leaving open connections\n const textBody = await text(body);\n state.errorMsg = `failed to download archive: ${statusCode}, response: ${textBody.slice(0, 1000)}`;\n logger.error(state.errorMsg);\n throw new Error(state.errorMsg);\n }\n\n // to prevent incomplete downloads we first write in a temp file\n state.tmpPath = archivePath + '.tmp';\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));\n state.wroteTmp = true;\n state.tmpExisted = await fileExists(state.tmpPath);\n\n // and then atomically rename it\n await fsp.rename(state.tmpPath, archivePath);\n state.renamed = true;\n state.newExisted = await fileExists(archivePath);\n\n return state;\n } catch (e: unknown) {\n const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;\n logger.error(msg);\n throw new Error(msg);\n }\n}\n\n/** Used to prevent mid-way interrupted unarchived folders to be used */\nconst MarkerFileName = '.ok';\n\nexport async function extractArchive(\n logger: MiLogger,\n archivePath: string,\n archiveType: ArchiveType,\n dstFolder: string,\n) {\n logger.info('extracting archive...');\n logger.info(` archive path: '${archivePath}'`);\n logger.info(` target dir: '${dstFolder}'`);\n\n if (!(await fileExists(archivePath))) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n const markerFilePath = upath.join(dstFolder, MarkerFileName);\n\n if (await fileExists(markerFilePath)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);\n return;\n }\n\n if (await fileExists(dstFolder)) {\n logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);\n await fsp.rm(dstFolder, { recursive: true });\n }\n\n logger.info(` creating target dir '${dstFolder}'`);\n await fsp.mkdir(dstFolder, { recursive: true });\n\n logger.info(\n `Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${dstFolder}`,\n );\n\n switch (archiveType) {\n case 'tgz':\n await tar.x({\n file: archivePath,\n cwd: dstFolder,\n gzip: true,\n });\n break;\n\n case 'zip':\n await decompress(archivePath, dstFolder);\n break;\n\n default:\n assertNever(archiveType);\n }\n\n // writing marker file, to be able in the future detect that we completely unarchived the tar file\n await fsp.writeFile(markerFilePath, 'ok');\n\n logger.info(` ... unpack done.`);\n}\n\nexport type ArchiveType = 'tgz' | 'zip';\n\nconst osToArchiveType: Record<OSType, ArchiveType> = {\n linux: 'tgz',\n macos: 'tgz',\n windows: 'zip',\n};\n"],"names":[],"mappings":"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"}
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 type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { Writable, Readable } from \"node:stream\";\nimport { text } from \"node:stream/consumers\";\nimport * as tar from \"tar\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { assertNever, fileExists } from \"@milaboratories/ts-helpers\";\nimport decompress from \"decompress\";\nimport type { ArchType, OSType } from \"./os_and_arch\";\nimport { newOs, newArch } from \"./os_and_arch\";\n\nconst cdn = \"https://cdn.platforma.bio/software\";\n// We'll download things from Global Access if downloading from CDN has failed\n// (it might be that it's blocked from the company's network.)\nconst gaCdn = \"https://cdn-ga.pl-open.science/software\";\n\nexport type DownloadBinaryResult = {\n archiveUrl: string;\n alternativeArchiveGAUrl: string;\n wasDownloadedFrom?: string;\n archivePath: string;\n archiveType: ArchiveType;\n targetFolder: string;\n baseName: string;\n};\n\nexport async function downloadBinaryNoExtract({\n logger,\n baseDir,\n softwareName,\n tgzName,\n arch,\n platform,\n dispatcher,\n}: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n tgzName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(softwareName, tgzName, baseDir, newArch(arch), newOs(platform));\n const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;\n\n try {\n await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch {\n await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n return opts;\n}\n\nexport async function downloadBinary({\n logger,\n baseDir,\n softwareName,\n archiveName,\n arch,\n platform,\n dispatcher,\n}: {\n logger: MiLogger;\n baseDir: string;\n softwareName: string;\n archiveName: string;\n arch: string;\n platform: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadBinaryResult> {\n const opts = getPathsForDownload(\n softwareName,\n archiveName,\n baseDir,\n newArch(arch),\n newOs(platform),\n );\n const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;\n\n try {\n await downloadArchive({ logger, archiveUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = archiveUrl;\n } catch {\n await downloadArchive({ logger, archiveUrl: alternativeArchiveGAUrl, archivePath, dispatcher });\n opts.wasDownloadedFrom = alternativeArchiveGAUrl;\n }\n\n await extractArchive(logger, archivePath, archiveType, targetFolder);\n\n return opts;\n}\n\nfunction getPathsForDownload(\n softwareName: string,\n archiveName: string,\n baseDir: string,\n arch: ArchType,\n os: OSType,\n): DownloadBinaryResult {\n const baseName = `${archiveName}-${arch}`;\n const archiveType = osToArchiveType[os];\n\n const archiveFileName = `${baseName}.${archiveType}`;\n const archiveUrl = `${cdn}/${softwareName}/${os}/${archiveFileName}`;\n const alternativeArchiveGAUrl = `${gaCdn}/${softwareName}/${os}/${archiveFileName}`;\n const archivePath = upath.join(baseDir, archiveFileName);\n // folder where binary distribution of pl will be unpacked\n const targetFolder = upath.join(baseDir, baseName);\n\n return {\n archiveUrl,\n alternativeArchiveGAUrl,\n archivePath,\n archiveType,\n targetFolder,\n baseName,\n };\n}\n\nexport type DownloadInfo = {\n archivePath?: string;\n fileExisted?: boolean;\n dirnameCreated?: boolean;\n statusCode?: number;\n errorMsg?: string;\n tmpPath?: string;\n wroteTmp?: boolean;\n tmpExisted?: boolean;\n renamed?: boolean;\n newExisted?: boolean;\n};\n\nexport async function downloadArchive({\n logger,\n archiveUrl,\n archivePath,\n dispatcher,\n}: {\n logger: MiLogger;\n archiveUrl: string;\n archivePath: string;\n dispatcher?: Dispatcher;\n}): Promise<DownloadInfo> {\n const state: DownloadInfo = {};\n state.archivePath = archivePath;\n\n try {\n state.fileExisted = await fileExists(archivePath);\n if (state.fileExisted) {\n logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);\n return state;\n }\n\n await fsp.mkdir(upath.dirname(archivePath), { recursive: true });\n state.dirnameCreated = true;\n\n logger.info(`Downloading archive:\\n URL: ${archiveUrl}\\n Save to: ${archivePath}`);\n\n const { body, statusCode } = await request(archiveUrl, { dispatcher });\n state.statusCode = statusCode;\n if (statusCode != 200) {\n // completely draining the stream to prevent leaving open connections\n const textBody = await text(body);\n state.errorMsg = `failed to download archive: ${statusCode}, response: ${textBody.slice(0, 1000)}`;\n logger.error(state.errorMsg);\n throw new Error(state.errorMsg);\n }\n\n // to prevent incomplete downloads we first write in a temp file\n state.tmpPath = archivePath + \".tmp\";\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));\n state.wroteTmp = true;\n state.tmpExisted = await fileExists(state.tmpPath);\n\n // and then atomically rename it\n await fsp.rename(state.tmpPath, archivePath);\n state.renamed = true;\n state.newExisted = await fileExists(archivePath);\n\n return state;\n } catch (e: unknown) {\n const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;\n logger.error(msg);\n throw new Error(msg);\n }\n}\n\n/** Used to prevent mid-way interrupted unarchived folders to be used */\nconst MarkerFileName = \".ok\";\n\nexport async function extractArchive(\n logger: MiLogger,\n archivePath: string,\n archiveType: ArchiveType,\n dstFolder: string,\n) {\n logger.info(\"extracting archive...\");\n logger.info(` archive path: '${archivePath}'`);\n logger.info(` target dir: '${dstFolder}'`);\n\n if (!(await fileExists(archivePath))) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n const markerFilePath = upath.join(dstFolder, MarkerFileName);\n\n if (await fileExists(markerFilePath)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);\n return;\n }\n\n if (await fileExists(dstFolder)) {\n logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);\n await fsp.rm(dstFolder, { recursive: true });\n }\n\n logger.info(` creating target dir '${dstFolder}'`);\n await fsp.mkdir(dstFolder, { recursive: true });\n\n logger.info(\n `Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${dstFolder}`,\n );\n\n switch (archiveType) {\n case \"tgz\":\n await tar.x({\n file: archivePath,\n cwd: dstFolder,\n gzip: true,\n });\n break;\n\n case \"zip\":\n await decompress(archivePath, dstFolder);\n break;\n\n default:\n assertNever(archiveType);\n }\n\n // writing marker file, to be able in the future detect that we completely unarchived the tar file\n await fsp.writeFile(markerFilePath, \"ok\");\n\n logger.info(` ... unpack done.`);\n}\n\nexport type ArchiveType = \"tgz\" | \"zip\";\n\nconst osToArchiveType: Record<OSType, ArchiveType> = {\n linux: \"tgz\",\n macos: \"tgz\",\n windows: \"zip\",\n};\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ var _package = require('../package.json.cjs');
4
4
 
5
5
  function getDefaultPlVersion() {
6
6
  // drop build error if pl-version is not defined
7
- return _package['pl-version'];
7
+ return _package["pl-version"];
8
8
  }
9
9
 
10
10
  exports.getDefaultPlVersion = getDefaultPlVersion;
@@ -1 +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
+ {"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;;;;"}
@@ -2,7 +2,7 @@ import packageJson from '../package.json.js';
2
2
 
3
3
  function getDefaultPlVersion() {
4
4
  // drop build error if pl-version is not defined
5
- return packageJson['pl-version'];
5
+ return packageJson["pl-version"];
6
6
  }
7
7
 
8
8
  export { getDefaultPlVersion };
@@ -1 +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;;;;"}
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.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export * from './local/pl';
2
- export * from './common/pl_version';
3
- export * from './ssh/ssh';
4
- export * from './ssh/pl';
5
- export * from './ssh/connection_info';
1
+ export * from "./local/pl";
2
+ export * from "./common/pl_version";
3
+ export * from "./ssh/ssh";
4
+ export * from "./ssh/pl";
5
+ export * from "./ssh/connection_info";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
- import type { SpawnOptions } from 'node:child_process';
2
- import type { PlBinarySource } from '../common/pl_binary';
1
+ import type { SpawnOptions } from "node:child_process";
2
+ import type { PlBinarySource } from "../common/pl_binary";
3
3
  /** Options to start a local pl-core. */
4
4
  export type LocalPlOptions = {
5
5
  /** From what directory start a process. */
@@ -21,11 +21,11 @@ export type LocalPlOptions = {
21
21
  export type LocalPlRestart = LocalPlRestartSilent | LocalPlRestartHook;
22
22
  /** Do nothing if the error happened or a process exited. */
23
23
  export type LocalPlRestartSilent = {
24
- type: 'silent';
24
+ type: "silent";
25
25
  };
26
26
  /** Run a hook if the error happened or a process exited. */
27
27
  export type LocalPlRestartHook = {
28
- type: 'hook';
28
+ type: "hook";
29
29
  hook(pl: any): void;
30
30
  };
31
31
  //# sourceMappingURL=options.d.ts.map
@@ -5,7 +5,7 @@ var fsp = require('node:fs/promises');
5
5
  var upath = require('upath');
6
6
 
7
7
  function filePid(dir) {
8
- return upath.join(dir, 'pl_pid');
8
+ return upath.join(dir, "pl_pid");
9
9
  }
10
10
  async function readPid(filePath) {
11
11
  if (!(await tsHelpers.fileExists(filePath))) {
@@ -1 +1 @@
1
- {"version":3,"file":"pid.cjs","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"],"names":["fileExists","fs"],"mappings":";;;;;;AAIM,SAAU,OAAO,CAAC,GAAW,EAAA;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;AAClC;AAEO,eAAe,OAAO,CAAC,QAAgB,EAAA;IAC5C,IAAI,EAAE,MAAMA,oBAAU,CAAC,QAAQ,CAAC,CAAC,EAAE;AACjC,QAAA,OAAO,SAAS;IAClB;IAEA,MAAM,IAAI,GAAG,MAAMC,GAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAExC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChC;AAEO,eAAe,QAAQ,CAAC,QAAgB,EAAE,GAAW,EAAA;AAC1D,IAAA,MAAMA,GAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACnD;;;;;;"}
1
+ {"version":3,"file":"pid.cjs","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"],"names":["fileExists","fs"],"mappings":";;;;;;AAIM,SAAU,OAAO,CAAC,GAAW,EAAA;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;AAClC;AAEO,eAAe,OAAO,CAAC,QAAgB,EAAA;IAC5C,IAAI,EAAE,MAAMA,oBAAU,CAAC,QAAQ,CAAC,CAAC,EAAE;AACjC,QAAA,OAAO,SAAS;IAClB;IAEA,MAAM,IAAI,GAAG,MAAMC,GAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAExC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChC;AAEO,eAAe,QAAQ,CAAC,QAAgB,EAAE,GAAW,EAAA;AAC1D,IAAA,MAAMA,GAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACnD;;;;;;"}
package/dist/local/pid.js CHANGED
@@ -3,7 +3,7 @@ import fsp from 'node:fs/promises';
3
3
  import upath from 'upath';
4
4
 
5
5
  function filePid(dir) {
6
- return upath.join(dir, 'pl_pid');
6
+ return upath.join(dir, "pl_pid");
7
7
  }
8
8
  async function readPid(filePath) {
9
9
  if (!(await fileExists(filePath))) {
@@ -1 +1 @@
1
- {"version":3,"file":"pid.js","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"],"names":["fs"],"mappings":";;;;AAIM,SAAU,OAAO,CAAC,GAAW,EAAA;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;AAClC;AAEO,eAAe,OAAO,CAAC,QAAgB,EAAA;IAC5C,IAAI,EAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE;AACjC,QAAA,OAAO,SAAS;IAClB;IAEA,MAAM,IAAI,GAAG,MAAMA,GAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAExC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChC;AAEO,eAAe,QAAQ,CAAC,QAAgB,EAAE,GAAW,EAAA;AAC1D,IAAA,MAAMA,GAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACnD;;;;"}
1
+ {"version":3,"file":"pid.js","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"],"names":["fs"],"mappings":";;;;AAIM,SAAU,OAAO,CAAC,GAAW,EAAA;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;AAClC;AAEO,eAAe,OAAO,CAAC,QAAgB,EAAA;IAC5C,IAAI,EAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE;AACjC,QAAA,OAAO,SAAS;IAClB;IAEA,MAAM,IAAI,GAAG,MAAMA,GAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAExC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChC;AAEO,eAAe,QAAQ,CAAC,QAAgB,EAAE,GAAW,EAAA;AAC1D,IAAA,MAAMA,GAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACnD;;;;"}
package/dist/local/pl.cjs CHANGED
@@ -30,7 +30,7 @@ function _interopNamespaceDefault(e) {
30
30
 
31
31
  var os__namespace = /*#__PURE__*/_interopNamespaceDefault(os);
32
32
 
33
- const LocalConfigYaml = 'config-local.yaml';
33
+ const LocalConfigYaml = "config-local.yaml";
34
34
  /**
35
35
  * Represents a local running pl-core,
36
36
  * and has methods to start, check if it's running, stop and wait for stopping it.
@@ -64,7 +64,7 @@ class LocalPl {
64
64
  await trace.withTrace(this.logger, async (trace, t) => {
65
65
  this.wasStopped = false;
66
66
  const instance = process$1.processRun(this.logger, this.startOptions);
67
- instance.on('error', (e) => {
67
+ instance.on("error", (e) => {
68
68
  this.logger.error(`error '${e}', while running platforma, started opts: ${JSON.stringify(this.debugInfo())}`);
69
69
  // keep in mind there are no awaits here, it will be asynchronous
70
70
  if (this.onError !== undefined)
@@ -74,7 +74,7 @@ class LocalPl {
74
74
  if (this.onCloseAndErrorNoStop !== undefined && !this.wasStopped)
75
75
  void this.onCloseAndErrorNoStop(this);
76
76
  });
77
- instance.on('close', () => {
77
+ instance.on("close", () => {
78
78
  this.logger.warn(`platforma was closed, started opts: ${JSON.stringify(this.debugInfo())}`);
79
79
  // keep in mind there are no awaits here, it will be asynchronous
80
80
  if (this.onClose !== undefined)
@@ -84,10 +84,10 @@ class LocalPl {
84
84
  if (this.onCloseAndErrorNoStop !== undefined && !this.wasStopped)
85
85
  void this.onCloseAndErrorNoStop(this);
86
86
  });
87
- trace('started', true);
88
- const pidFile = trace('pidFile', pid.filePid(this.workingDir));
89
- trace('pid', tsHelpers.notEmpty(instance.pid));
90
- trace('pidWritten', await pid.writePid(pidFile, tsHelpers.notEmpty(instance.pid)));
87
+ trace("started", true);
88
+ const pidFile = trace("pidFile", pid.filePid(this.workingDir));
89
+ trace("pid", tsHelpers.notEmpty(instance.pid));
90
+ trace("pidWritten", await pid.writePid(pidFile, tsHelpers.notEmpty(instance.pid)));
91
91
  this.nRuns++;
92
92
  this.instance = instance;
93
93
  this.pid = instance.pid;
@@ -129,28 +129,28 @@ async function localPlatformaInit(logger, _ops) {
129
129
  const numCpu = Math.max(os__namespace.cpus().length - 2, 1);
130
130
  const ops = mergeDefaultOps(_ops, numCpu);
131
131
  return await trace.withTrace(logger, async (trace, t) => {
132
- trace('startOptions', { ...ops, config: 'too wordy' });
132
+ trace("startOptions", { ...ops, config: "too wordy" });
133
133
  const workDir = upath.resolve(ops.workingDir);
134
134
  if (ops.closeOld) {
135
- trace('closeOld', await localPlatformaReadPidAndStop(logger, workDir));
135
+ trace("closeOld", await localPlatformaReadPidAndStop(logger, workDir));
136
136
  }
137
137
  const configPath = upath.join(workDir, LocalConfigYaml);
138
138
  logger.info(`writing configuration '${configPath}'...`);
139
139
  await fsp.writeFile(configPath, ops.config);
140
- const plBinPath = upath.join(workDir, 'binaries');
140
+ const plBinPath = upath.join(workDir, "binaries");
141
141
  const baseBinaryPath = await pl_binary.resolveLocalPlBinaryPath({
142
142
  logger,
143
143
  downloadDir: plBinPath,
144
144
  src: ops.plBinary,
145
145
  dispatcher: plHttp.defaultHttpDispatcher(ops.proxy),
146
146
  });
147
- const binaryPath = trace('binaryPath', upath.join('binaries', baseBinaryPath));
147
+ const binaryPath = trace("binaryPath", upath.join("binaries", baseBinaryPath));
148
148
  const env = { ...process.env };
149
149
  if (ops.proxy?.url) {
150
150
  const url = new URL(ops.proxy.url);
151
151
  if (ops.proxy.auth) {
152
152
  const parsed = plModelCommon.parseHttpAuth(ops.proxy.auth);
153
- if (parsed.scheme !== 'Basic') {
153
+ if (parsed.scheme !== "Basic") {
154
154
  throw new Error(`\
155
155
  Unsupported auth scheme: ${parsed.scheme}. \
156
156
  Only Basic auth is supported by the backend.`);
@@ -162,7 +162,7 @@ Only Basic auth is supported by the backend.`);
162
162
  env.https_proxy = url.toString();
163
163
  }
164
164
  const processOpts = plProcessOps(binaryPath, configPath, ops, workDir, env);
165
- trace('processOpts', {
165
+ trace("processOpts", {
166
166
  cmd: processOpts.cmd,
167
167
  args: processOpts.args,
168
168
  cwd: processOpts.opts.cwd,
@@ -176,17 +176,17 @@ Only Basic auth is supported by the backend.`);
176
176
  * and closes it. */
177
177
  async function localPlatformaReadPidAndStop(logger, workingDir) {
178
178
  return await trace.withTrace(logger, async (trace, t) => {
179
- const file = trace('pidFilePath', pid.filePid(workingDir));
180
- const oldPid = trace('pid', await pid.readPid(file));
181
- const alive = trace('wasAlive', await process$1.isProcessAlive(oldPid));
179
+ const file = trace("pidFilePath", pid.filePid(workingDir));
180
+ const oldPid = trace("pid", await pid.readPid(file));
181
+ const alive = trace("wasAlive", await process$1.isProcessAlive(oldPid));
182
182
  if (oldPid !== undefined && alive) {
183
- trace('stopped', process$1.processStop(oldPid));
183
+ trace("stopped", process$1.processStop(oldPid));
184
184
  try {
185
- trace('waitStopped', await process$1.processWaitStopped(oldPid, 15_000)); // larger, that 10s we provide to backend in config.
185
+ trace("waitStopped", await process$1.processWaitStopped(oldPid, 15_000)); // larger, that 10s we provide to backend in config.
186
186
  }
187
- catch (_e) {
188
- trace('forceStopped', process$1.processStop(oldPid, true));
189
- trace('waitForceStopped', await process$1.processWaitStopped(oldPid, 5_000));
187
+ catch {
188
+ trace("forceStopped", process$1.processStop(oldPid, true));
189
+ trace("waitForceStopped", await process$1.processWaitStopped(oldPid, 5_000));
190
190
  }
191
191
  }
192
192
  return t;
@@ -209,11 +209,11 @@ function mergeDefaultOps(ops, numCpu) {
209
209
  }
210
210
  if (ops.spawnOptions) {
211
211
  const withoutEnv = { ...ops.spawnOptions };
212
- delete withoutEnv['env'];
212
+ delete withoutEnv["env"];
213
213
  result.spawnOptions = { ...result.spawnOptions, ...withoutEnv };
214
214
  }
215
215
  const withoutSpawnOps = { ...ops };
216
- delete withoutSpawnOps['spawnOptions'];
216
+ delete withoutSpawnOps["spawnOptions"];
217
217
  return { ...result, ...withoutSpawnOps };
218
218
  }
219
219
  /** Gets default options for a platforma local binary
@@ -221,11 +221,11 @@ function mergeDefaultOps(ops, numCpu) {
221
221
  function plProcessOps(binaryPath, configPath, ops, workDir, defaultEnv) {
222
222
  const result = {
223
223
  cmd: binaryPath,
224
- args: ['--config', configPath],
224
+ args: ["--config", configPath],
225
225
  opts: {
226
226
  env: { ...defaultEnv },
227
227
  cwd: workDir,
228
- stdio: ['pipe', 'ignore', 'inherit'],
228
+ stdio: ["pipe", "ignore", "inherit"],
229
229
  windowsHide: true, // hide a terminal on Windows
230
230
  },
231
231
  };
@@ -233,7 +233,7 @@ function plProcessOps(binaryPath, configPath, ops, workDir, defaultEnv) {
233
233
  result.opts.env = { ...result.opts.env, ...ops.spawnOptions.env };
234
234
  }
235
235
  const withoutEnv = { ...ops.spawnOptions };
236
- delete withoutEnv['env'];
236
+ delete withoutEnv["env"];
237
237
  result.opts = { ...result.opts, ...withoutEnv };
238
238
  return result;
239
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pl.cjs","sources":["../../src/local/pl.ts"],"sourcesContent":["import type { ProcessOptions } from './process';\nimport {\n isProcessAlive,\n processStop,\n processWaitStopped,\n processRun,\n} 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 (_e) {\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"],"names":["withTrace","processRun","filePid","notEmpty","writePid","processStop","processWaitStopped","isProcessAlive","os","resolveLocalPlBinaryPath","defaultHttpDispatcher","parseHttpAuth","readPid","newDefaultPlBinarySource"],"mappings":"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"}
1
+ {"version":3,"file":"pl.cjs","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"],"names":["withTrace","processRun","filePid","notEmpty","writePid","processStop","processWaitStopped","isProcessAlive","os","resolveLocalPlBinaryPath","defaultHttpDispatcher","parseHttpAuth","readPid","newDefaultPlBinarySource"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import type { ProcessOptions } from './process';
2
- import type { PlBinarySource } from '../common/pl_binary';
3
- import type { MiLogger } from '@milaboratories/ts-helpers';
4
- import type { SpawnOptions } from 'node:child_process';
5
- import type { Trace } from './trace';
6
- import type { Required } from 'utility-types';
7
- import type { ProxySettings } from '@milaboratories/pl-http';
1
+ import type { ProcessOptions } from "./process";
2
+ import type { PlBinarySource } from "../common/pl_binary";
3
+ import type { MiLogger } from "@milaboratories/ts-helpers";
4
+ import type { SpawnOptions } from "node:child_process";
5
+ import type { Trace } from "./trace";
6
+ import type { Required } from "utility-types";
7
+ import type { ProxySettings } from "@milaboratories/pl-http";
8
8
  export declare const LocalConfigYaml = "config-local.yaml";
9
9
  /**
10
10
  * Represents a local running pl-core,
@@ -67,7 +67,7 @@ export type LocalPlOptions = {
67
67
  readonly onCloseAndError?: (pl: LocalPl) => Promise<void>;
68
68
  readonly onCloseAndErrorNoStop?: (pl: LocalPl) => Promise<void>;
69
69
  };
70
- export type LocalPlOptionsFull = Required<LocalPlOptions, 'plBinary' | 'spawnOptions' | 'closeOld'>;
70
+ export type LocalPlOptionsFull = Required<LocalPlOptions, "plBinary" | "spawnOptions" | "closeOld">;
71
71
  /**
72
72
  * Starts pl-core, if the option was provided downloads a binary, reads license environments etc.
73
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pl.d.ts","sourceRoot":"","sources":["../../src/local/pl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pl.d.ts","sourceRoot":"","sources":["../../src/local/pl.ts"],"names":[],"mappings":"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"}