@milaboratories/pl-deployments 2.15.17 → 2.15.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/common/os_and_arch.cjs +22 -28
- package/dist/common/os_and_arch.cjs.map +1 -1
- package/dist/common/os_and_arch.js +23 -26
- package/dist/common/os_and_arch.js.map +1 -1
- package/dist/common/pl_binary.cjs +35 -33
- package/dist/common/pl_binary.cjs.map +1 -1
- package/dist/common/pl_binary.d.ts +13 -18
- package/dist/common/pl_binary.js +33 -31
- package/dist/common/pl_binary.js.map +1 -1
- package/dist/common/pl_binary_download.cjs +143 -155
- package/dist/common/pl_binary_download.cjs.map +1 -1
- package/dist/common/pl_binary_download.d.ts +15 -48
- package/dist/common/pl_binary_download.js +138 -133
- package/dist/common/pl_binary_download.js.map +1 -1
- package/dist/common/pl_version.cjs +5 -6
- package/dist/common/pl_version.cjs.map +1 -1
- package/dist/common/pl_version.d.ts +4 -1
- package/dist/common/pl_version.js +5 -4
- package/dist/common/pl_version.js.map +1 -1
- package/dist/index.cjs +21 -25
- package/dist/index.d.ts +6 -6
- package/dist/index.js +7 -6
- package/dist/local/pid.cjs +14 -13
- package/dist/local/pid.cjs.map +1 -1
- package/dist/local/pid.js +11 -11
- package/dist/local/pid.js.map +1 -1
- package/dist/local/pl.cjs +194 -223
- package/dist/local/pl.cjs.map +1 -1
- package/dist/local/pl.d.ts +65 -65
- package/dist/local/pl.js +190 -202
- package/dist/local/pl.js.map +1 -1
- package/dist/local/process.cjs +37 -59
- package/dist/local/process.cjs.map +1 -1
- package/dist/local/process.d.ts +10 -10
- package/dist/local/process.js +36 -57
- package/dist/local/process.js.map +1 -1
- package/dist/local/trace.cjs +14 -17
- package/dist/local/trace.cjs.map +1 -1
- package/dist/local/trace.d.ts +6 -7
- package/dist/local/trace.js +15 -15
- package/dist/local/trace.js.map +1 -1
- package/dist/package.cjs +12 -0
- package/dist/package.cjs.map +1 -0
- package/dist/package.js +6 -0
- package/dist/package.js.map +1 -0
- package/dist/ssh/connection_info.cjs +36 -53
- package/dist/ssh/connection_info.cjs.map +1 -1
- package/dist/ssh/connection_info.d.ts +691 -713
- package/dist/ssh/connection_info.js +35 -51
- package/dist/ssh/connection_info.js.map +1 -1
- package/dist/ssh/pl.cjs +551 -638
- package/dist/ssh/pl.cjs.map +1 -1
- package/dist/ssh/pl.d.ts +120 -117
- package/dist/ssh/pl.js +548 -636
- package/dist/ssh/pl.js.map +1 -1
- package/dist/ssh/pl_paths.cjs +22 -24
- package/dist/ssh/pl_paths.cjs.map +1 -1
- package/dist/ssh/pl_paths.js +21 -19
- package/dist/ssh/pl_paths.js.map +1 -1
- package/dist/ssh/ssh.cjs +554 -618
- package/dist/ssh/ssh.cjs.map +1 -1
- package/dist/ssh/ssh.d.ts +139 -136
- package/dist/ssh/ssh.js +548 -616
- package/dist/ssh/ssh.js.map +1 -1
- package/dist/ssh/ssh_errors.cjs +45 -60
- package/dist/ssh/ssh_errors.cjs.map +1 -1
- package/dist/ssh/ssh_errors.js +45 -58
- package/dist/ssh/ssh_errors.js.map +1 -1
- package/dist/ssh/supervisord.cjs +50 -68
- package/dist/ssh/supervisord.cjs.map +1 -1
- package/dist/ssh/supervisord.d.ts +11 -21
- package/dist/ssh/supervisord.js +50 -66
- package/dist/ssh/supervisord.js.map +1 -1
- package/package.json +10 -10
- package/dist/common/os_and_arch.d.ts +0 -9
- package/dist/common/os_and_arch.d.ts.map +0 -1
- package/dist/common/pl_binary.d.ts.map +0 -1
- package/dist/common/pl_binary_download.d.ts.map +0 -1
- package/dist/common/pl_version.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/local/options.d.ts +0 -31
- package/dist/local/options.d.ts.map +0 -1
- package/dist/local/pid.d.ts +0 -4
- package/dist/local/pid.d.ts.map +0 -1
- package/dist/local/pl.d.ts.map +0 -1
- package/dist/local/process.d.ts.map +0 -1
- package/dist/local/trace.d.ts.map +0 -1
- package/dist/package.json.cjs +0 -8
- package/dist/package.json.cjs.map +0 -1
- package/dist/package.json.js +0 -6
- package/dist/package.json.js.map +0 -1
- package/dist/ssh/__tests__/common-utils.d.ts +0 -12
- package/dist/ssh/__tests__/common-utils.d.ts.map +0 -1
- package/dist/ssh/connection_info.d.ts.map +0 -1
- package/dist/ssh/pl.d.ts.map +0 -1
- package/dist/ssh/pl_paths.d.ts +0 -20
- package/dist/ssh/pl_paths.d.ts.map +0 -1
- package/dist/ssh/ssh.d.ts.map +0 -1
- package/dist/ssh/ssh_errors.d.ts +0 -29
- package/dist/ssh/ssh_errors.d.ts.map +0 -1
- package/dist/ssh/supervisord.d.ts.map +0 -1
|
@@ -1,148 +1,153 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import
|
|
1
|
+
import { newArch, newOs } from "./os_and_arch.js";
|
|
2
|
+
import { assertNever, fileExists } from "@milaboratories/ts-helpers";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import fsp from "node:fs/promises";
|
|
5
|
+
import upath from "upath";
|
|
6
|
+
import { request } from "undici";
|
|
7
|
+
import { Readable, Writable } from "node:stream";
|
|
8
|
+
import { text } from "node:stream/consumers";
|
|
9
|
+
import * as tar from "tar";
|
|
10
|
+
import decompress from "decompress";
|
|
11
11
|
|
|
12
|
+
//#region src/common/pl_binary_download.ts
|
|
12
13
|
const cdn = "https://cdn.platforma.bio/software";
|
|
13
|
-
// We'll download things from Global Access if downloading from CDN has failed
|
|
14
|
-
// (it might be that it's blocked from the company's network.)
|
|
15
14
|
const gaCdn = "https://cdn-ga.pl-open.science/software";
|
|
16
|
-
async function downloadBinaryNoExtract({ logger, baseDir, softwareName, tgzName, arch, platform, dispatcher
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
15
|
+
async function downloadBinaryNoExtract({ logger, baseDir, softwareName, tgzName, arch, platform, dispatcher }) {
|
|
16
|
+
const opts = getPathsForDownload(softwareName, tgzName, baseDir, newArch(arch), newOs(platform));
|
|
17
|
+
const { archiveUrl, alternativeArchiveGAUrl, archivePath } = opts;
|
|
18
|
+
try {
|
|
19
|
+
await downloadArchive({
|
|
20
|
+
logger,
|
|
21
|
+
archiveUrl,
|
|
22
|
+
archivePath,
|
|
23
|
+
dispatcher
|
|
24
|
+
});
|
|
25
|
+
opts.wasDownloadedFrom = archiveUrl;
|
|
26
|
+
} catch {
|
|
27
|
+
await downloadArchive({
|
|
28
|
+
logger,
|
|
29
|
+
archiveUrl: alternativeArchiveGAUrl,
|
|
30
|
+
archivePath,
|
|
31
|
+
dispatcher
|
|
32
|
+
});
|
|
33
|
+
opts.wasDownloadedFrom = alternativeArchiveGAUrl;
|
|
34
|
+
}
|
|
35
|
+
return opts;
|
|
28
36
|
}
|
|
29
|
-
async function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
async function downloadBinary({ logger, baseDir, softwareName, archiveName, arch, platform, dispatcher }) {
|
|
38
|
+
const opts = getPathsForDownload(softwareName, archiveName, baseDir, newArch(arch), newOs(platform));
|
|
39
|
+
const { archiveUrl, alternativeArchiveGAUrl, archivePath, archiveType, targetFolder } = opts;
|
|
40
|
+
try {
|
|
41
|
+
await downloadArchive({
|
|
42
|
+
logger,
|
|
43
|
+
archiveUrl,
|
|
44
|
+
archivePath,
|
|
45
|
+
dispatcher
|
|
46
|
+
});
|
|
47
|
+
opts.wasDownloadedFrom = archiveUrl;
|
|
48
|
+
} catch {
|
|
49
|
+
await downloadArchive({
|
|
50
|
+
logger,
|
|
51
|
+
archiveUrl: alternativeArchiveGAUrl,
|
|
52
|
+
archivePath,
|
|
53
|
+
dispatcher
|
|
54
|
+
});
|
|
55
|
+
opts.wasDownloadedFrom = alternativeArchiveGAUrl;
|
|
56
|
+
}
|
|
57
|
+
await extractArchive(logger, archivePath, archiveType, targetFolder);
|
|
58
|
+
return opts;
|
|
42
59
|
}
|
|
43
60
|
function getPathsForDownload(softwareName, archiveName, baseDir, arch, os) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
archivePath,
|
|
56
|
-
archiveType,
|
|
57
|
-
targetFolder,
|
|
58
|
-
baseName,
|
|
59
|
-
};
|
|
61
|
+
const baseName = `${archiveName}-${arch}`;
|
|
62
|
+
const archiveType = osToArchiveType[os];
|
|
63
|
+
const archiveFileName = `${baseName}.${archiveType}`;
|
|
64
|
+
return {
|
|
65
|
+
archiveUrl: `${cdn}/${softwareName}/${os}/${archiveFileName}`,
|
|
66
|
+
alternativeArchiveGAUrl: `${gaCdn}/${softwareName}/${os}/${archiveFileName}`,
|
|
67
|
+
archivePath: upath.join(baseDir, archiveFileName),
|
|
68
|
+
archiveType,
|
|
69
|
+
targetFolder: upath.join(baseDir, baseName),
|
|
70
|
+
baseName
|
|
71
|
+
};
|
|
60
72
|
}
|
|
61
|
-
async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;
|
|
96
|
-
logger.error(msg);
|
|
97
|
-
throw new Error(msg);
|
|
98
|
-
}
|
|
73
|
+
async function downloadArchive({ logger, archiveUrl, archivePath, dispatcher }) {
|
|
74
|
+
const state = {};
|
|
75
|
+
state.archivePath = archivePath;
|
|
76
|
+
try {
|
|
77
|
+
state.fileExisted = await fileExists(archivePath);
|
|
78
|
+
if (state.fileExisted) {
|
|
79
|
+
logger.info(`Platforma Backend archive download skipped: '${archivePath}' already exists`);
|
|
80
|
+
return state;
|
|
81
|
+
}
|
|
82
|
+
await fsp.mkdir(upath.dirname(archivePath), { recursive: true });
|
|
83
|
+
state.dirnameCreated = true;
|
|
84
|
+
logger.info(`Downloading archive:\n URL: ${archiveUrl}\n Save to: ${archivePath}`);
|
|
85
|
+
const { body, statusCode } = await request(archiveUrl, { dispatcher });
|
|
86
|
+
state.statusCode = statusCode;
|
|
87
|
+
if (statusCode != 200) {
|
|
88
|
+
state.errorMsg = `failed to download archive: ${statusCode}, response: ${(await text(body)).slice(0, 1e3)}`;
|
|
89
|
+
logger.error(state.errorMsg);
|
|
90
|
+
throw new Error(state.errorMsg);
|
|
91
|
+
}
|
|
92
|
+
state.tmpPath = archivePath + ".tmp";
|
|
93
|
+
await Readable.toWeb(body).pipeTo(Writable.toWeb(fs.createWriteStream(state.tmpPath)));
|
|
94
|
+
state.wroteTmp = true;
|
|
95
|
+
state.tmpExisted = await fileExists(state.tmpPath);
|
|
96
|
+
await fsp.rename(state.tmpPath, archivePath);
|
|
97
|
+
state.renamed = true;
|
|
98
|
+
state.newExisted = await fileExists(archivePath);
|
|
99
|
+
return state;
|
|
100
|
+
} catch (e) {
|
|
101
|
+
const msg = `downloadArchive: ${JSON.stringify(e)}, state: ${JSON.stringify(state)}`;
|
|
102
|
+
logger.error(msg);
|
|
103
|
+
throw new Error(msg);
|
|
104
|
+
}
|
|
99
105
|
}
|
|
100
106
|
/** Used to prevent mid-way interrupted unarchived folders to be used */
|
|
101
107
|
const MarkerFileName = ".ok";
|
|
102
108
|
async function extractArchive(logger, archivePath, archiveType, dstFolder) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
await fsp.writeFile(markerFilePath, "ok");
|
|
139
|
-
logger.info(` ... unpack done.`);
|
|
109
|
+
logger.info("extracting archive...");
|
|
110
|
+
logger.info(` archive path: '${archivePath}'`);
|
|
111
|
+
logger.info(` target dir: '${dstFolder}'`);
|
|
112
|
+
if (!await fileExists(archivePath)) {
|
|
113
|
+
const msg = `Platforma Backend binary archive not found at '${archivePath}'`;
|
|
114
|
+
logger.error(msg);
|
|
115
|
+
throw new Error(msg);
|
|
116
|
+
}
|
|
117
|
+
const markerFilePath = upath.join(dstFolder, MarkerFileName);
|
|
118
|
+
if (await fileExists(markerFilePath)) {
|
|
119
|
+
logger.info(`Platforma Backend binaries unpack skipped: '${dstFolder}' exists`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (await fileExists(dstFolder)) {
|
|
123
|
+
logger.info(`Removing previous incompletely unpacked folder: '${dstFolder}'`);
|
|
124
|
+
await fsp.rm(dstFolder, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
logger.info(` creating target dir '${dstFolder}'`);
|
|
127
|
+
await fsp.mkdir(dstFolder, { recursive: true });
|
|
128
|
+
logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${dstFolder}`);
|
|
129
|
+
switch (archiveType) {
|
|
130
|
+
case "tgz":
|
|
131
|
+
await tar.x({
|
|
132
|
+
file: archivePath,
|
|
133
|
+
cwd: dstFolder,
|
|
134
|
+
gzip: true
|
|
135
|
+
});
|
|
136
|
+
break;
|
|
137
|
+
case "zip":
|
|
138
|
+
await decompress(archivePath, dstFolder);
|
|
139
|
+
break;
|
|
140
|
+
default: assertNever(archiveType);
|
|
141
|
+
}
|
|
142
|
+
await fsp.writeFile(markerFilePath, "ok");
|
|
143
|
+
logger.info(` ... unpack done.`);
|
|
140
144
|
}
|
|
141
145
|
const osToArchiveType = {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
146
|
+
linux: "tgz",
|
|
147
|
+
macos: "tgz",
|
|
148
|
+
windows: "zip"
|
|
145
149
|
};
|
|
146
150
|
|
|
147
|
-
|
|
148
|
-
|
|
151
|
+
//#endregion
|
|
152
|
+
export { downloadBinary, downloadBinaryNoExtract };
|
|
153
|
+
//# sourceMappingURL=pl_binary_download.js.map
|
|
@@ -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,\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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"}
|
|
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,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var _package = require('../package.json.cjs');
|
|
1
|
+
const require_package = require('../package.cjs');
|
|
4
2
|
|
|
3
|
+
//#region src/common/pl_version.ts
|
|
5
4
|
function getDefaultPlVersion() {
|
|
6
|
-
|
|
7
|
-
return _package["pl-version"];
|
|
5
|
+
return require_package.pl_version;
|
|
8
6
|
}
|
|
9
7
|
|
|
8
|
+
//#endregion
|
|
10
9
|
exports.getDefaultPlVersion = getDefaultPlVersion;
|
|
11
|
-
//# sourceMappingURL=pl_version.cjs.map
|
|
10
|
+
//# sourceMappingURL=pl_version.cjs.map
|
|
@@ -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"],"
|
|
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,9 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { pl_version } from "../package.js";
|
|
2
2
|
|
|
3
|
+
//#region src/common/pl_version.ts
|
|
3
4
|
function getDefaultPlVersion() {
|
|
4
|
-
|
|
5
|
-
return packageJson["pl-version"];
|
|
5
|
+
return pl_version;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
//#endregion
|
|
8
9
|
export { getDefaultPlVersion };
|
|
9
|
-
//# sourceMappingURL=pl_version.js.map
|
|
10
|
+
//# sourceMappingURL=pl_version.js.map
|
|
@@ -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"],"
|
|
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,26 +1,22 @@
|
|
|
1
|
-
'
|
|
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');
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exports.
|
|
12
|
-
exports.
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
15
|
-
exports.
|
|
16
|
-
exports.
|
|
17
|
-
exports.
|
|
18
|
-
exports.SshPl = pl$1.SshPl;
|
|
19
|
-
exports.parseGlibcVersion = pl$1.parseGlibcVersion;
|
|
20
|
-
exports.ConnectionInfo = connection_info.ConnectionInfo;
|
|
21
|
-
exports.PortPair = connection_info.PortPair;
|
|
22
|
-
exports.SshPlPorts = connection_info.SshPlPorts;
|
|
23
|
-
exports.newConnectionInfo = connection_info.newConnectionInfo;
|
|
24
|
-
exports.parseConnectionInfo = connection_info.parseConnectionInfo;
|
|
25
|
-
exports.stringifyConnectionInfo = connection_info.stringifyConnectionInfo;
|
|
26
|
-
//# sourceMappingURL=index.cjs.map
|
|
8
|
+
exports.ConnectionInfo = require_connection_info.ConnectionInfo;
|
|
9
|
+
exports.LocalConfigYaml = require_pl.LocalConfigYaml;
|
|
10
|
+
exports.LocalPl = require_pl.LocalPl;
|
|
11
|
+
exports.PortPair = require_connection_info.PortPair;
|
|
12
|
+
exports.SshClient = require_ssh.SshClient;
|
|
13
|
+
exports.SshPl = require_pl$1.SshPl;
|
|
14
|
+
exports.SshPlPorts = require_connection_info.SshPlPorts;
|
|
15
|
+
exports.getDefaultPlVersion = require_pl_version.getDefaultPlVersion;
|
|
16
|
+
exports.localPlatformaInit = require_pl.localPlatformaInit;
|
|
17
|
+
exports.mergeDefaultOps = require_pl.mergeDefaultOps;
|
|
18
|
+
exports.newConnectionInfo = require_connection_info.newConnectionInfo;
|
|
19
|
+
exports.parseConnectionInfo = require_connection_info.parseConnectionInfo;
|
|
20
|
+
exports.parseGlibcVersion = require_pl$1.parseGlibcVersion;
|
|
21
|
+
exports.plProcessOps = require_pl.plProcessOps;
|
|
22
|
+
exports.stringifyConnectionInfo = require_connection_info.stringifyConnectionInfo;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { LocalConfigYaml, LocalPl, LocalPlOptions, LocalPlOptionsFull, localPlatformaInit, mergeDefaultOps, plProcessOps } from "./local/pl.js";
|
|
2
|
+
import { getDefaultPlVersion } from "./common/pl_version.js";
|
|
3
|
+
import { SshAuthMethods, SshAuthMethodsResult, SshClient, SshDirContent, SshExecResult } from "./ssh/ssh.js";
|
|
4
|
+
import { ConnectionInfo, PortPair, SshPlPorts, newConnectionInfo, parseConnectionInfo, stringifyConnectionInfo } from "./ssh/connection_info.js";
|
|
5
|
+
import { LockProcessInfo, SshPl, SshPlConfig, parseGlibcVersion } from "./ssh/pl.js";
|
|
6
|
+
export { ConnectionInfo, LocalConfigYaml, LocalPl, LocalPlOptions, LocalPlOptionsFull, LockProcessInfo, PortPair, SshAuthMethods, SshAuthMethodsResult, SshClient, SshDirContent, SshExecResult, SshPl, SshPlConfig, SshPlPorts, getDefaultPlVersion, localPlatformaInit, mergeDefaultOps, newConnectionInfo, parseConnectionInfo, parseGlibcVersion, plProcessOps, stringifyConnectionInfo };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { getDefaultPlVersion } from "./common/pl_version.js";
|
|
2
|
+
import { LocalConfigYaml, LocalPl, localPlatformaInit, mergeDefaultOps, plProcessOps } from "./local/pl.js";
|
|
3
|
+
import { SshClient } from "./ssh/ssh.js";
|
|
4
|
+
import { ConnectionInfo, PortPair, SshPlPorts, newConnectionInfo, parseConnectionInfo, stringifyConnectionInfo } from "./ssh/connection_info.js";
|
|
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 };
|
package/dist/local/pid.cjs
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
3
|
+
let node_fs_promises = require("node:fs/promises");
|
|
4
|
+
node_fs_promises = require_runtime.__toESM(node_fs_promises);
|
|
5
|
+
let upath = require("upath");
|
|
6
|
+
upath = require_runtime.__toESM(upath);
|
|
6
7
|
|
|
8
|
+
//#region src/local/pid.ts
|
|
7
9
|
function filePid(dir) {
|
|
8
|
-
|
|
10
|
+
return upath.default.join(dir, "pl_pid");
|
|
9
11
|
}
|
|
10
12
|
async function readPid(filePath) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const text = await fsp.readFile(filePath);
|
|
15
|
-
return Number(text.toString());
|
|
13
|
+
if (!await (0, _milaboratories_ts_helpers.fileExists)(filePath)) return;
|
|
14
|
+
const text = await node_fs_promises.default.readFile(filePath);
|
|
15
|
+
return Number(text.toString());
|
|
16
16
|
}
|
|
17
17
|
async function writePid(filePath, pid) {
|
|
18
|
-
|
|
18
|
+
await node_fs_promises.default.writeFile(filePath, JSON.stringify(pid));
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
//#endregion
|
|
21
22
|
exports.filePid = filePid;
|
|
22
23
|
exports.readPid = readPid;
|
|
23
24
|
exports.writePid = writePid;
|
|
24
|
-
//# sourceMappingURL=pid.cjs.map
|
|
25
|
+
//# sourceMappingURL=pid.cjs.map
|
package/dist/local/pid.cjs.map
CHANGED
|
@@ -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"],"
|
|
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"}
|
package/dist/local/pid.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { fileExists } from
|
|
2
|
-
import fsp from
|
|
3
|
-
import upath from
|
|
1
|
+
import { fileExists } from "@milaboratories/ts-helpers";
|
|
2
|
+
import fsp from "node:fs/promises";
|
|
3
|
+
import upath from "upath";
|
|
4
4
|
|
|
5
|
+
//#region src/local/pid.ts
|
|
5
6
|
function filePid(dir) {
|
|
6
|
-
|
|
7
|
+
return upath.join(dir, "pl_pid");
|
|
7
8
|
}
|
|
8
9
|
async function readPid(filePath) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const text = await fsp.readFile(filePath);
|
|
13
|
-
return Number(text.toString());
|
|
10
|
+
if (!await fileExists(filePath)) return;
|
|
11
|
+
const text = await fsp.readFile(filePath);
|
|
12
|
+
return Number(text.toString());
|
|
14
13
|
}
|
|
15
14
|
async function writePid(filePath, pid) {
|
|
16
|
-
|
|
15
|
+
await fsp.writeFile(filePath, JSON.stringify(pid));
|
|
17
16
|
}
|
|
18
17
|
|
|
18
|
+
//#endregion
|
|
19
19
|
export { filePid, readPid, writePid };
|
|
20
|
-
//# sourceMappingURL=pid.js.map
|
|
20
|
+
//# sourceMappingURL=pid.js.map
|
package/dist/local/pid.js.map
CHANGED
|
@@ -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"],"
|
|
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"}
|