@sfmc-bds/cli 0.4.3 → 0.4.5
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/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +5 -2
- package/dist/daemon/client.js.map +2 -2
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +4 -3
- package/dist/daemon/server.js.map +2 -2
- package/dist/i18n/locales/en.d.ts +1 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +1 -0
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +1 -0
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/management/maintenance.js +3 -4
- package/dist/management/maintenance.js.map +2 -2
- package/dist/management/platform-worker.js +22 -3
- package/dist/management/platform-worker.js.map +2 -2
- package/dist/management/tasks.js +2 -9
- package/dist/management/tasks.js.map +2 -2
- package/dist/module-update/index.d.ts.map +1 -1
- package/dist/module-update/index.js +2 -1
- package/dist/module-update/index.js.map +2 -2
- package/package.json +6 -6
- package/scripts/module-install/lib/module-update.mjs +21 -2
- package/scripts/module-install/test/module-update.test.mjs +94 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACb,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAG9F;AACD,wBAAgB,sBAAsB,IAAI,IAAI,CAAgE;AAmB9G;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1F;AAED,4BAA4B;AAC5B,cAAM,gBAAgB;IACpB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAA4B;IAC/C,MAAM,UAAS;IAEf,YAAY,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAO7C;IAED,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,OAAO;IAWf,0BAA0B;IAC1B,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,SAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBpG;IAED,8BAA8B;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ/B;IAED,mBAAmB;IACnB,UAAU,IAAI,IAAI,CAQjB;CACF;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACb,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAG9F;AACD,wBAAgB,sBAAsB,IAAI,IAAI,CAAgE;AAmB9G;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1F;AAED,4BAA4B;AAC5B,cAAM,gBAAgB;IACpB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAA4B;IAC/C,MAAM,UAAS;IAEf,YAAY,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAO7C;IAED,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,OAAO;IAWf,0BAA0B;IAC1B,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,SAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBpG;IAED,8BAA8B;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ/B;IAED,mBAAmB;IACnB,UAAU,IAAI,IAAI,CAQjB;CACF;AAyED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAU9D;AA2CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAInG;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAWpE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAItE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK3D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhG"}
|
package/dist/daemon/client.js
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
import { isLogPayload } from "./protocol.js";
|
|
19
19
|
import { isDaemonServer } from "./role.js";
|
|
20
20
|
import { fileURLToPath } from "node:url";
|
|
21
|
-
import { maintenanceToken } from "@sfmc-bds/management/node";
|
|
21
|
+
import { lockOwnerAlive, maintenanceToken } from "@sfmc-bds/management/node";
|
|
22
22
|
function onDaemonManagementEvent(callback) {
|
|
23
23
|
remoteStateBus.on("management", callback);
|
|
24
24
|
return () => {
|
|
@@ -189,7 +189,10 @@ function spawnDaemonProcess() {
|
|
|
189
189
|
const lockFile = path.join(ROOT, ".sfmc", "maintenance.lock");
|
|
190
190
|
if (fs.existsSync(lockFile)) {
|
|
191
191
|
const owner = JSON.parse(fs.readFileSync(lockFile, "utf8"));
|
|
192
|
-
|
|
192
|
+
const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;
|
|
193
|
+
const holder = token === owner.nonce;
|
|
194
|
+
const pidKnown = Number.isSafeInteger(owner.pid) && (owner.pid ?? 0) > 0;
|
|
195
|
+
if (!holder && (!pidKnown || lockOwnerAlive(owner.pid ?? 0))) throw new Error("\u5B9E\u4F8B\u6B63\u5728\u7EF4\u62A4\uFF1B\u540E\u53F0\u5207\u6362\u5B8C\u6210\u524D\u4E0D\u4F1A\u521B\u5EFA\u53E6\u4E00\u4E2A\u5B88\u62A4\u8FDB\u7A0B");
|
|
193
196
|
}
|
|
194
197
|
const entry = process.env.SFMC_DAEMON_ENTRY ?? fileURLToPath(new URL("../main.js", import.meta.url));
|
|
195
198
|
if (!entry) throw new Error("cannot resolve sfmc entry for daemon spawn");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/daemon/client.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * client.ts \u2014 CLI \u4FA7\u5B88\u62A4\u8FDB\u7A0B\u5BA2\u6237\u7AEF\uFF1AensureDaemon + RPC + \u65E5\u5FD7\u8BA2\u9605\n *\n * \u82E5 `.sfmc/daemon.json` \u5BF9\u5E94\u8FDB\u7A0B\u4E0D\u5728\u6216\u7BA1\u9053\u4E0D\u53EF\u8FDE\uFF0C\u5219 spawn `sfmc --daemon`\n *\uFF08detached + windowsHide\uFF09\uFF0C\u518D\u8F6E\u8BE2\u76F4\u5230 ping \u6210\u529F\u3002\n */\n\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport { EventEmitter } from \"node:events\";\nimport { ingestRemoteLog } from \"../logs.js\";\nimport { ROOT } from \"../runtime.js\";\nimport type { ServiceStateEvent, ServiceStatus } from \"../services.js\";\nimport {\n clearDaemonMeta,\n daemonLogPath,\n daemonMetaPath,\n readDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type {\n DaemonEvent,\n DaemonFrame,\n DaemonMethod,\n DaemonParams,\n DaemonRequest,\n DaemonResult,\n} from \"./protocol.js\";\nimport { isLogPayload } from \"./protocol.js\";\nimport { isDaemonServer } from \"./role.js\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ManagementEvent } from \"@sfmc-bds/management\";\nimport { maintenanceToken } from \"@sfmc-bds/management/node\";\n\nexport function onDaemonManagementEvent(callback: (event: ManagementEvent) => void): () => void {\n remoteStateBus.on(\"management\", callback);\n return () => { remoteStateBus.off(\"management\", callback); };\n}\nexport function disconnectDaemonClient(): void { subscriptionCount = 0; shared?.disconnect(); shared = null; }\n\n/** \u5355\u6B21 RPC \u9ED8\u8BA4\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09 */\nconst CALL_TIMEOUT_MS = 120_000;\n/** ensureDaemon \u7B49\u5F85\u5B88\u62A4\u8FDB\u7A0B\u5C31\u7EEA\u7684\u603B\u65F6\u957F */\nconst READY_TIMEOUT_MS = 15_000;\n/** \u8F6E\u8BE2\u95F4\u9694 */\nconst READY_POLL_MS = 150;\n\n/** \u5171\u4EAB\u8FDE\u63A5\uFF08\u540C\u4E00 CLI \u8FDB\u7A0B\u590D\u7528\uFF09 */\nlet shared: DaemonConnection | null = null;\n/** \u91CD\u8FDE\u671F\u95F4\u590D\u7528\u540C\u4E00\u6B21\u5EFA\u8FDE\uFF0C\u907F\u514D\u5E76\u884C\u72B6\u6001\u67E5\u8BE2\u8986\u76D6\u5DF2\u8BA2\u9605\u7684\u8FDE\u63A5\u3002 */\nlet connecting: Promise<DaemonConnection> | null = null;\n/** \u8BA2\u9605\u610F\u56FE\u5C5E\u4E8E\u5BA2\u6237\u7AEF\u4F1A\u8BDD\uFF0C\u4E0D\u80FD\u968F\u7740\u65E7 socket \u5173\u95ED\u800C\u4E22\u5931\u3002 */\nlet subscriptionCount = 0;\n\n/** \u672C\u5730\u72B6\u6001\u4E8B\u4EF6\u603B\u7EBF\uFF1A\u628A daemon \u63A8\u9001\u7684 state \u8F6C\u7ED9 CLI \u4FA7 onServiceStateChange \u8BA2\u9605\u8005 */\nconst remoteStateBus = new EventEmitter();\n\n/**\n * \u8BA2\u9605\u5B88\u62A4\u8FDB\u7A0B\u63A8\u9001\u7684\u670D\u52A1\u542F\u505C\u4E8B\u4EF6\uFF08CLI \u8FDB\u7A0B\u7528\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u6839\u636E running \u96C6\u5408\u5237\u65B0\u53D1\u9001\u76EE\u6807 / \u670D\u52A1\u7A97\uFF0C\u65E0\u9700\u672C\u5730\u6301\u6709 ChildProcess\u3002\n */\nexport function onRemoteServiceStateChange(fn: (ev: ServiceStateEvent) => void): () => void {\n remoteStateBus.on(\"state\", fn);\n return () => {\n remoteStateBus.off(\"state\", fn);\n };\n}\n\n/** \u5355\u6761\u8FDE\u63A5\uFF1A\u8BF7\u6C42/\u54CD\u5E94\u5339\u914D + \u53EF\u9009\u4E8B\u4EF6\u8BA2\u9605 */\nclass DaemonConnection {\n private sock: net.Socket;\n private meta: DaemonMeta;\n private buf = \"\";\n private pending = new Map<\n string,\n { resolve: (r: DaemonResult) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private subscribed = false;\n private subscribing: Promise<void> | undefined;\n closed = false;\n\n constructor(sock: net.Socket, meta: DaemonMeta) {\n this.sock = sock;\n this.meta = meta;\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => this.onData(chunk));\n sock.on(\"close\", () => this.onClose(new Error(\"daemon connection closed\")));\n sock.on(\"error\", (e) => this.onClose(e instanceof Error ? e : new Error(String(e))));\n }\n\n private onData(chunk: string): void {\n this.buf += chunk;\n let idx: number;\n while ((idx = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, idx).trim();\n this.buf = this.buf.slice(idx + 1);\n if (!line) continue;\n let frame: DaemonFrame;\n try {\n frame = JSON.parse(line) as DaemonFrame;\n } catch {\n continue;\n }\n if (frame.type === \"event\") {\n this.handleEvent(frame);\n continue;\n }\n if (frame.type === \"res\") {\n const wait = this.pending.get(frame.id);\n if (!wait) continue;\n this.pending.delete(frame.id);\n clearTimeout(wait.timer);\n if (frame.ok && frame.result) wait.resolve(frame.result);\n else wait.reject(new Error(frame.error ?? \"daemon error\"));\n }\n }\n }\n\n private handleEvent(ev: DaemonEvent): void {\n if (ev.event === \"management\") { remoteStateBus.emit(\"management\", ev.payload); return; }\n if (ev.event === \"log\" && isLogPayload(ev.payload)) {\n ingestRemoteLog(ev.payload.text, ev.payload.source, ev.payload.level);\n return;\n }\n if (ev.event === \"state\") {\n remoteStateBus.emit(\"state\", ev.payload as ServiceStateEvent);\n }\n }\n\n private onClose(err: Error): void {\n if (this.closed) return;\n this.closed = true;\n for (const [, wait] of this.pending) {\n clearTimeout(wait.timer);\n wait.reject(err);\n }\n this.pending.clear();\n if (shared === this) shared = null;\n }\n\n /** \u53D1\u9001 RPC \u5E76\u7B49\u5F85\u5339\u914D id \u7684\u54CD\u5E94 */\n call(method: DaemonMethod, params?: DaemonParams, timeoutMs = CALL_TIMEOUT_MS): Promise<DaemonResult> {\n if (this.closed || this.sock.destroyed) {\n return Promise.reject(new Error(\"daemon not connected\"));\n }\n const id = randomBytes(8).toString(\"hex\");\n const req: DaemonRequest = params\n ? { id, token: this.meta.token, method, params }\n : { id, token: this.meta.token, method };\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`daemon call timeout: ${method}`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n try {\n this.sock.write(JSON.stringify(req) + \"\\n\");\n } catch (e) {\n this.pending.delete(id);\n clearTimeout(timer);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n }\n\n /** \u8BA2\u9605\u65E5\u5FD7\u4E0E\u72B6\u6001\u4E8B\u4EF6\uFF08\u540C\u4E00\u8FDE\u63A5\u4E0A\u7EE7\u7EED\u53D1 RPC\uFF09 */\n async subscribe(): Promise<void> {\n if (this.subscribed) return;\n if (!this.subscribing) {\n this.subscribing = this.call(\"subscribe\").then(() => {\n this.subscribed = true;\n }).finally(() => { this.subscribing = undefined; });\n }\n await this.subscribing;\n }\n\n /** \u65AD\u5F00\u8FDE\u63A5\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09 */\n disconnect(): void {\n this.closed = true;\n try {\n this.sock.end();\n } catch {\n /* ignore */\n }\n if (shared === this) shared = null;\n }\n}\n\nfunction connectSocket(pipe: string, timeoutMs = 3000): Promise<net.Socket> {\n return new Promise((resolve, reject) => {\n const sock = net.createConnection(pipe);\n const timer = setTimeout(() => {\n sock.destroy();\n reject(new Error(\"connect timeout\"));\n }, timeoutMs);\n sock.once(\"connect\", () => {\n clearTimeout(timer);\n resolve(sock);\n });\n sock.once(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n}\n\n/**\n * \u5C1D\u8BD5\u8FDE\u63A5\u5DF2\u6709 daemon\uFF1B\u6210\u529F\u5219\u8FD4\u56DE\u8FDE\u63A5\uFF0C\u5931\u8D25\u8FD4\u56DE null\u3002\n */\nasync function tryConnectExisting(): Promise<DaemonConnection | null> {\n const meta = readDaemonMeta();\n if (!meta) return null;\n if (!(await isProcessAlive(meta.pid))) {\n return null;\n }\n try {\n const sock = await connectSocket(meta.pipe);\n const conn = new DaemonConnection(sock, meta);\n await conn.call(\"ping\", undefined, 3000);\n return conn;\n } catch {\n return null;\n }\n}\n\n/**\n * \u62C9\u8D77\u5B88\u62A4\u8FDB\u7A0B\u5B50\u8FDB\u7A0B\uFF08detached\uFF0C\u65E5\u5FD7\u5199\u5165 daemon.log\uFF09\u3002\n * \u5165\u53E3\u811A\u672C\u590D\u7528\u5F53\u524D CLI \u7684 argv[1]\uFF08\u5373 sfmc \u4E3B\u5165\u53E3\uFF09\u3002\n */\nfunction spawnDaemonProcess(): void {\n const lockFile = path.join(ROOT, \".sfmc\", \"maintenance.lock\");\n if (fs.existsSync(lockFile)) {\n const owner = JSON.parse(fs.readFileSync(lockFile, \"utf8\")) as { nonce: string };\n if ((maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN) !== owner.nonce) throw new Error(\"\u5B9E\u4F8B\u6B63\u5728\u7EF4\u62A4\uFF1B\u540E\u53F0\u5207\u6362\u5B8C\u6210\u524D\u4E0D\u4F1A\u521B\u5EFA\u53E6\u4E00\u4E2A\u5B88\u62A4\u8FDB\u7A0B\");\n }\n const entry = process.env.SFMC_DAEMON_ENTRY ?? fileURLToPath(new URL(\"../main.js\", import.meta.url));\n if (!entry) throw new Error(\"cannot resolve sfmc entry for daemon spawn\");\n fs.mkdirSync(logsDir(ROOT), { recursive: true });\n const logFd = fs.openSync(daemonLogPath(), \"a\");\n const child = spawn(process.env.SFMC_NODE_BINARY ?? process.execPath, [entry, \"--daemon\"], {\n detached: true,\n windowsHide: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, SFMC_ROOT: ROOT },\n cwd: ROOT,\n });\n child.unref();\n try {\n fs.closeSync(logFd);\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u786E\u4FDD\u5B88\u62A4\u8FDB\u7A0B\u53EF\u7528\u5E76\u8FD4\u56DE\u5171\u4EAB\u8FDE\u63A5\u3002\n * \u5B88\u62A4\u8FDB\u7A0B\u8FDB\u7A0B\u5185\u8C03\u7528\u4F1A\u629B\u9519\uFF08\u5E94\u76F4\u63A5\u8D70\u672C\u5730 cmd*\uFF09\u3002\n */\nexport async function ensureDaemon(): Promise<DaemonConnection> {\n if (isDaemonServer()) throw new Error(\"ensureDaemon must not run inside daemon server\");\n let conn = shared && !shared.closed ? shared : null;\n if (!conn) {\n connecting ??= connectDaemon().finally(() => { connecting = null; });\n conn = await connecting;\n }\n // \u7BA1\u7406\u8BF7\u6C42\u91CD\u8FDE\u6210\u529F\u540E\uFF0C\u5148\u6062\u590D\u65E5\u5FD7/\u72B6\u6001\u8BA2\u9605\uFF0C\u518D\u8FD4\u56DE\u65B0\u8FDE\u63A5\u3002\n if (subscriptionCount > 0) await conn.subscribe();\n return conn;\n}\n\nasync function connectDaemon(): Promise<DaemonConnection> {\n if (isDaemonServer()) {\n throw new Error(\"ensureDaemon must not run inside daemon server\");\n }\n if (shared && !shared.closed) return shared;\n\n let conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n\n const existing = readDaemonMeta();\n if (existing && (await isProcessAlive(existing.pid))) {\n /* PID \u4ECD\u5728\u4F46\u6682\u65F6\u8FDE\u4E0D\u4E0A\uFF1A\u77ED\u6682\u91CD\u8BD5\uFF0C\u7981\u6B62\u518D spawn \u7B2C\u4E8C\u5957\u5B88\u62A4\u8FDB\u7A0B */\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(`daemon pid ${existing.pid} is alive but pipe is unreachable`);\n }\n\n spawnDaemonProcess();\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n if (!fs.existsSync(daemonMetaPath())) continue;\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(\"failed to start or connect sfmc daemon\");\n}\n\n/**\n * \u8C03\u7528\u5B88\u62A4\u8FDB\u7A0B\u65B9\u6CD5\uFF1B\u81EA\u52A8 ensureDaemon\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1ACLI \u4FA7 status/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u51FA\u53E3\u3002\n */\nexport async function callDaemon(method: DaemonMethod, params?: DaemonParams): Promise<DaemonResult> {\n const conn = await ensureDaemon();\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n return conn.call(method, token ? { ...params, maintenanceToken: token } : params);\n}\n\n/**\n * \u786E\u4FDD\u5DF2\u8FDE\u63A5\u5E76\u8BA2\u9605\u8FDC\u7A0B\u65E5\u5FD7/\u72B6\u6001\uFF1B\u8FD4\u56DE\u65AD\u5F00\u51FD\u6570\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u542F\u52A8\u65F6\u6302\u4E0A\u5B9E\u65F6\u65E5\u5FD7\u6D41\uFF0C\u9000\u51FA\u65F6\u53EA disconnect\u3002\n */\nexport async function ensureDaemonSubscription(): Promise<() => void> {\n subscriptionCount++;\n try { await ensureDaemon(); }\n catch (error) { subscriptionCount = Math.max(0, subscriptionCount - 1); throw error; }\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n subscriptionCount = Math.max(0, subscriptionCount - 1);\n if (subscriptionCount === 0) shared?.disconnect();\n };\n}\n\n/**\n * \u8BF7\u6C42\u5B88\u62A4\u8FDB\u7A0B stopAll \u540E\u9000\u51FA\uFF08`sfmc daemon stop`\uFF09\u3002\n */\nexport async function shutdownDaemon(): Promise<string> {\n try {\n const conn = await ensureDaemon();\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n await conn.call(\"shutdown\", token ? { maintenanceToken: token } : undefined);\n conn.disconnect();\n } catch (e) {\n const meta = readDaemonMeta();\n if (!meta || !await isProcessAlive(meta.pid)) { clearDaemonMeta(); return \"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\"; }\n throw e;\n }\n /* \u77ED\u6682\u7B49\u5F85 meta \u6E05\u7406 */\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!readDaemonMeta()) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n const remaining = readDaemonMeta();\n if (remaining && await isProcessAlive(remaining.pid)) throw new Error(\"\u5B88\u62A4\u8FDB\u7A0B\u5C1A\u672A\u9000\u51FA\uFF0C\u4FDD\u7559\u8FDE\u63A5\u4FE1\u606F\");\n clearDaemonMeta();\n return \"\";\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u8FD0\u884C\u6001\u884C\uFF1B\u5931\u8D25\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4\u7531\u8C03\u7528\u65B9\u964D\u7EA7\u3002\n */\nexport async function queryRuntimeViaDaemon(): Promise<ServiceStatus[]> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.rows;\n return [];\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u683C\u5F0F\u5316 status \u6587\u672C\u3002\n */\nexport async function statusTextViaDaemon(): Promise<string> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.text;\n if (result.kind === \"text\") return result.text;\n return \"\";\n}\n\n/**\n * \u901A\u7528\u300C\u8FD4\u56DE text\u300D\u7C7B RPC \u8F85\u52A9\u3002\n */\nexport async function textViaDaemon(method: DaemonMethod, params?: DaemonParams): Promise<string> {\n const result = await callDaemon(method, params);\n if (result.kind === \"text\") return result.text;\n if (result.kind === \"status\") return result.text;\n return \"\";\n}\n"],
|
|
5
|
-
"mappings": "AAOA,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,SAAS;AAChB,OAAO,aAAa;AACpB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,YAAY;AAErB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AASP,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAE9B,SAAS,wBAAwB;
|
|
4
|
+
"sourcesContent": ["/**\n * client.ts \u2014 CLI \u4FA7\u5B88\u62A4\u8FDB\u7A0B\u5BA2\u6237\u7AEF\uFF1AensureDaemon + RPC + \u65E5\u5FD7\u8BA2\u9605\n *\n * \u82E5 `.sfmc/daemon.json` \u5BF9\u5E94\u8FDB\u7A0B\u4E0D\u5728\u6216\u7BA1\u9053\u4E0D\u53EF\u8FDE\uFF0C\u5219 spawn `sfmc --daemon`\n *\uFF08detached + windowsHide\uFF09\uFF0C\u518D\u8F6E\u8BE2\u76F4\u5230 ping \u6210\u529F\u3002\n */\n\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport { EventEmitter } from \"node:events\";\nimport { ingestRemoteLog } from \"../logs.js\";\nimport { ROOT } from \"../runtime.js\";\nimport type { ServiceStateEvent, ServiceStatus } from \"../services.js\";\nimport {\n clearDaemonMeta,\n daemonLogPath,\n daemonMetaPath,\n readDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type {\n DaemonEvent,\n DaemonFrame,\n DaemonMethod,\n DaemonParams,\n DaemonRequest,\n DaemonResult,\n} from \"./protocol.js\";\nimport { isLogPayload } from \"./protocol.js\";\nimport { isDaemonServer } from \"./role.js\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ManagementEvent } from \"@sfmc-bds/management\";\nimport { lockOwnerAlive, maintenanceToken } from \"@sfmc-bds/management/node\";\n\nexport function onDaemonManagementEvent(callback: (event: ManagementEvent) => void): () => void {\n remoteStateBus.on(\"management\", callback);\n return () => { remoteStateBus.off(\"management\", callback); };\n}\nexport function disconnectDaemonClient(): void { subscriptionCount = 0; shared?.disconnect(); shared = null; }\n\n/** \u5355\u6B21 RPC \u9ED8\u8BA4\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09 */\nconst CALL_TIMEOUT_MS = 120_000;\n/** ensureDaemon \u7B49\u5F85\u5B88\u62A4\u8FDB\u7A0B\u5C31\u7EEA\u7684\u603B\u65F6\u957F */\nconst READY_TIMEOUT_MS = 15_000;\n/** \u8F6E\u8BE2\u95F4\u9694 */\nconst READY_POLL_MS = 150;\n\n/** \u5171\u4EAB\u8FDE\u63A5\uFF08\u540C\u4E00 CLI \u8FDB\u7A0B\u590D\u7528\uFF09 */\nlet shared: DaemonConnection | null = null;\n/** \u91CD\u8FDE\u671F\u95F4\u590D\u7528\u540C\u4E00\u6B21\u5EFA\u8FDE\uFF0C\u907F\u514D\u5E76\u884C\u72B6\u6001\u67E5\u8BE2\u8986\u76D6\u5DF2\u8BA2\u9605\u7684\u8FDE\u63A5\u3002 */\nlet connecting: Promise<DaemonConnection> | null = null;\n/** \u8BA2\u9605\u610F\u56FE\u5C5E\u4E8E\u5BA2\u6237\u7AEF\u4F1A\u8BDD\uFF0C\u4E0D\u80FD\u968F\u7740\u65E7 socket \u5173\u95ED\u800C\u4E22\u5931\u3002 */\nlet subscriptionCount = 0;\n\n/** \u672C\u5730\u72B6\u6001\u4E8B\u4EF6\u603B\u7EBF\uFF1A\u628A daemon \u63A8\u9001\u7684 state \u8F6C\u7ED9 CLI \u4FA7 onServiceStateChange \u8BA2\u9605\u8005 */\nconst remoteStateBus = new EventEmitter();\n\n/**\n * \u8BA2\u9605\u5B88\u62A4\u8FDB\u7A0B\u63A8\u9001\u7684\u670D\u52A1\u542F\u505C\u4E8B\u4EF6\uFF08CLI \u8FDB\u7A0B\u7528\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u6839\u636E running \u96C6\u5408\u5237\u65B0\u53D1\u9001\u76EE\u6807 / \u670D\u52A1\u7A97\uFF0C\u65E0\u9700\u672C\u5730\u6301\u6709 ChildProcess\u3002\n */\nexport function onRemoteServiceStateChange(fn: (ev: ServiceStateEvent) => void): () => void {\n remoteStateBus.on(\"state\", fn);\n return () => {\n remoteStateBus.off(\"state\", fn);\n };\n}\n\n/** \u5355\u6761\u8FDE\u63A5\uFF1A\u8BF7\u6C42/\u54CD\u5E94\u5339\u914D + \u53EF\u9009\u4E8B\u4EF6\u8BA2\u9605 */\nclass DaemonConnection {\n private sock: net.Socket;\n private meta: DaemonMeta;\n private buf = \"\";\n private pending = new Map<\n string,\n { resolve: (r: DaemonResult) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private subscribed = false;\n private subscribing: Promise<void> | undefined;\n closed = false;\n\n constructor(sock: net.Socket, meta: DaemonMeta) {\n this.sock = sock;\n this.meta = meta;\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => this.onData(chunk));\n sock.on(\"close\", () => this.onClose(new Error(\"daemon connection closed\")));\n sock.on(\"error\", (e) => this.onClose(e instanceof Error ? e : new Error(String(e))));\n }\n\n private onData(chunk: string): void {\n this.buf += chunk;\n let idx: number;\n while ((idx = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, idx).trim();\n this.buf = this.buf.slice(idx + 1);\n if (!line) continue;\n let frame: DaemonFrame;\n try {\n frame = JSON.parse(line) as DaemonFrame;\n } catch {\n continue;\n }\n if (frame.type === \"event\") {\n this.handleEvent(frame);\n continue;\n }\n if (frame.type === \"res\") {\n const wait = this.pending.get(frame.id);\n if (!wait) continue;\n this.pending.delete(frame.id);\n clearTimeout(wait.timer);\n if (frame.ok && frame.result) wait.resolve(frame.result);\n else wait.reject(new Error(frame.error ?? \"daemon error\"));\n }\n }\n }\n\n private handleEvent(ev: DaemonEvent): void {\n if (ev.event === \"management\") { remoteStateBus.emit(\"management\", ev.payload); return; }\n if (ev.event === \"log\" && isLogPayload(ev.payload)) {\n ingestRemoteLog(ev.payload.text, ev.payload.source, ev.payload.level);\n return;\n }\n if (ev.event === \"state\") {\n remoteStateBus.emit(\"state\", ev.payload as ServiceStateEvent);\n }\n }\n\n private onClose(err: Error): void {\n if (this.closed) return;\n this.closed = true;\n for (const [, wait] of this.pending) {\n clearTimeout(wait.timer);\n wait.reject(err);\n }\n this.pending.clear();\n if (shared === this) shared = null;\n }\n\n /** \u53D1\u9001 RPC \u5E76\u7B49\u5F85\u5339\u914D id \u7684\u54CD\u5E94 */\n call(method: DaemonMethod, params?: DaemonParams, timeoutMs = CALL_TIMEOUT_MS): Promise<DaemonResult> {\n if (this.closed || this.sock.destroyed) {\n return Promise.reject(new Error(\"daemon not connected\"));\n }\n const id = randomBytes(8).toString(\"hex\");\n const req: DaemonRequest = params\n ? { id, token: this.meta.token, method, params }\n : { id, token: this.meta.token, method };\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`daemon call timeout: ${method}`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n try {\n this.sock.write(JSON.stringify(req) + \"\\n\");\n } catch (e) {\n this.pending.delete(id);\n clearTimeout(timer);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n }\n\n /** \u8BA2\u9605\u65E5\u5FD7\u4E0E\u72B6\u6001\u4E8B\u4EF6\uFF08\u540C\u4E00\u8FDE\u63A5\u4E0A\u7EE7\u7EED\u53D1 RPC\uFF09 */\n async subscribe(): Promise<void> {\n if (this.subscribed) return;\n if (!this.subscribing) {\n this.subscribing = this.call(\"subscribe\").then(() => {\n this.subscribed = true;\n }).finally(() => { this.subscribing = undefined; });\n }\n await this.subscribing;\n }\n\n /** \u65AD\u5F00\u8FDE\u63A5\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09 */\n disconnect(): void {\n this.closed = true;\n try {\n this.sock.end();\n } catch {\n /* ignore */\n }\n if (shared === this) shared = null;\n }\n}\n\nfunction connectSocket(pipe: string, timeoutMs = 3000): Promise<net.Socket> {\n return new Promise((resolve, reject) => {\n const sock = net.createConnection(pipe);\n const timer = setTimeout(() => {\n sock.destroy();\n reject(new Error(\"connect timeout\"));\n }, timeoutMs);\n sock.once(\"connect\", () => {\n clearTimeout(timer);\n resolve(sock);\n });\n sock.once(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n}\n\n/**\n * \u5C1D\u8BD5\u8FDE\u63A5\u5DF2\u6709 daemon\uFF1B\u6210\u529F\u5219\u8FD4\u56DE\u8FDE\u63A5\uFF0C\u5931\u8D25\u8FD4\u56DE null\u3002\n */\nasync function tryConnectExisting(): Promise<DaemonConnection | null> {\n const meta = readDaemonMeta();\n if (!meta) return null;\n if (!(await isProcessAlive(meta.pid))) {\n return null;\n }\n try {\n const sock = await connectSocket(meta.pipe);\n const conn = new DaemonConnection(sock, meta);\n await conn.call(\"ping\", undefined, 3000);\n return conn;\n } catch {\n return null;\n }\n}\n\n/**\n * \u62C9\u8D77\u5B88\u62A4\u8FDB\u7A0B\u5B50\u8FDB\u7A0B\uFF08detached\uFF0C\u65E5\u5FD7\u5199\u5165 daemon.log\uFF09\u3002\n * \u5165\u53E3\u811A\u672C\u590D\u7528\u5F53\u524D CLI \u7684 argv[1]\uFF08\u5373 sfmc \u4E3B\u5165\u53E3\uFF09\u3002\n */\nfunction spawnDaemonProcess(): void {\n const lockFile = path.join(ROOT, \".sfmc\", \"maintenance.lock\");\n if (fs.existsSync(lockFile)) {\n const owner = JSON.parse(fs.readFileSync(lockFile, \"utf8\")) as { pid?: number; nonce?: string };\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n const holder = token === owner.nonce;\n const pidKnown = Number.isSafeInteger(owner.pid) && (owner.pid ?? 0) > 0;\n // \u5F53\u524D\u7EF4\u62A4\u8FDB\u7A0B\u81EA\u5DF1\u62C9\u8D77\u66FF\u6362\u7528\u7684\u5B88\u62A4\u8FDB\u7A0B\u65F6 token \u76F8\u540C\uFF0C\u5141\u8BB8\u542F\u52A8\u3002\n // \u6301\u6709\u8005\u5DF2\u9000\u51FA\u5219\u4E0D\u518D\u6321\u4F4F\uFF1A\u5426\u5219\u754C\u9762\u65E0\u6CD5\u91CD\u8FDE\uFF0C\u4EFB\u52A1\u4F1A\u6C38\u8FDC\u505C\u5728\u300C\u8FDB\u884C\u4E2D\u300D\u3002\n if (!holder && (!pidKnown || lockOwnerAlive(owner.pid ?? 0))) throw new Error(\"\u5B9E\u4F8B\u6B63\u5728\u7EF4\u62A4\uFF1B\u540E\u53F0\u5207\u6362\u5B8C\u6210\u524D\u4E0D\u4F1A\u521B\u5EFA\u53E6\u4E00\u4E2A\u5B88\u62A4\u8FDB\u7A0B\");\n }\n const entry = process.env.SFMC_DAEMON_ENTRY ?? fileURLToPath(new URL(\"../main.js\", import.meta.url));\n if (!entry) throw new Error(\"cannot resolve sfmc entry for daemon spawn\");\n fs.mkdirSync(logsDir(ROOT), { recursive: true });\n const logFd = fs.openSync(daemonLogPath(), \"a\");\n const child = spawn(process.env.SFMC_NODE_BINARY ?? process.execPath, [entry, \"--daemon\"], {\n detached: true,\n windowsHide: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, SFMC_ROOT: ROOT },\n cwd: ROOT,\n });\n child.unref();\n try {\n fs.closeSync(logFd);\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u786E\u4FDD\u5B88\u62A4\u8FDB\u7A0B\u53EF\u7528\u5E76\u8FD4\u56DE\u5171\u4EAB\u8FDE\u63A5\u3002\n * \u5B88\u62A4\u8FDB\u7A0B\u8FDB\u7A0B\u5185\u8C03\u7528\u4F1A\u629B\u9519\uFF08\u5E94\u76F4\u63A5\u8D70\u672C\u5730 cmd*\uFF09\u3002\n */\nexport async function ensureDaemon(): Promise<DaemonConnection> {\n if (isDaemonServer()) throw new Error(\"ensureDaemon must not run inside daemon server\");\n let conn = shared && !shared.closed ? shared : null;\n if (!conn) {\n connecting ??= connectDaemon().finally(() => { connecting = null; });\n conn = await connecting;\n }\n // \u7BA1\u7406\u8BF7\u6C42\u91CD\u8FDE\u6210\u529F\u540E\uFF0C\u5148\u6062\u590D\u65E5\u5FD7/\u72B6\u6001\u8BA2\u9605\uFF0C\u518D\u8FD4\u56DE\u65B0\u8FDE\u63A5\u3002\n if (subscriptionCount > 0) await conn.subscribe();\n return conn;\n}\n\nasync function connectDaemon(): Promise<DaemonConnection> {\n if (isDaemonServer()) {\n throw new Error(\"ensureDaemon must not run inside daemon server\");\n }\n if (shared && !shared.closed) return shared;\n\n let conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n\n const existing = readDaemonMeta();\n if (existing && (await isProcessAlive(existing.pid))) {\n /* PID \u4ECD\u5728\u4F46\u6682\u65F6\u8FDE\u4E0D\u4E0A\uFF1A\u77ED\u6682\u91CD\u8BD5\uFF0C\u7981\u6B62\u518D spawn \u7B2C\u4E8C\u5957\u5B88\u62A4\u8FDB\u7A0B */\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(`daemon pid ${existing.pid} is alive but pipe is unreachable`);\n }\n\n spawnDaemonProcess();\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, READY_POLL_MS));\n if (!fs.existsSync(daemonMetaPath())) continue;\n conn = await tryConnectExisting();\n if (conn) {\n shared = conn;\n return conn;\n }\n }\n throw new Error(\"failed to start or connect sfmc daemon\");\n}\n\n/**\n * \u8C03\u7528\u5B88\u62A4\u8FDB\u7A0B\u65B9\u6CD5\uFF1B\u81EA\u52A8 ensureDaemon\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1ACLI \u4FA7 status/start/stop/send/update \u7B49\u8FD0\u7EF4\u547D\u4EE4\u7684\u7EDF\u4E00\u51FA\u53E3\u3002\n */\nexport async function callDaemon(method: DaemonMethod, params?: DaemonParams): Promise<DaemonResult> {\n const conn = await ensureDaemon();\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n return conn.call(method, token ? { ...params, maintenanceToken: token } : params);\n}\n\n/**\n * \u786E\u4FDD\u5DF2\u8FDE\u63A5\u5E76\u8BA2\u9605\u8FDC\u7A0B\u65E5\u5FD7/\u72B6\u6001\uFF1B\u8FD4\u56DE\u65AD\u5F00\u51FD\u6570\uFF08\u4E0D\u505C\u5B88\u62A4\u8FDB\u7A0B\uFF09\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1AREPL \u542F\u52A8\u65F6\u6302\u4E0A\u5B9E\u65F6\u65E5\u5FD7\u6D41\uFF0C\u9000\u51FA\u65F6\u53EA disconnect\u3002\n */\nexport async function ensureDaemonSubscription(): Promise<() => void> {\n subscriptionCount++;\n try { await ensureDaemon(); }\n catch (error) { subscriptionCount = Math.max(0, subscriptionCount - 1); throw error; }\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n subscriptionCount = Math.max(0, subscriptionCount - 1);\n if (subscriptionCount === 0) shared?.disconnect();\n };\n}\n\n/**\n * \u8BF7\u6C42\u5B88\u62A4\u8FDB\u7A0B stopAll \u540E\u9000\u51FA\uFF08`sfmc daemon stop`\uFF09\u3002\n */\nexport async function shutdownDaemon(): Promise<string> {\n try {\n const conn = await ensureDaemon();\n const token = maintenanceToken(ROOT) ?? process.env.SFMC_MAINTENANCE_TOKEN;\n await conn.call(\"shutdown\", token ? { maintenanceToken: token } : undefined);\n conn.disconnect();\n } catch (e) {\n const meta = readDaemonMeta();\n if (!meta || !await isProcessAlive(meta.pid)) { clearDaemonMeta(); return \"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\"; }\n throw e;\n }\n /* \u77ED\u6682\u7B49\u5F85 meta \u6E05\u7406 */\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!readDaemonMeta()) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n const remaining = readDaemonMeta();\n if (remaining && await isProcessAlive(remaining.pid)) throw new Error(\"\u5B88\u62A4\u8FDB\u7A0B\u5C1A\u672A\u9000\u51FA\uFF0C\u4FDD\u7559\u8FDE\u63A5\u4FE1\u606F\");\n clearDaemonMeta();\n return \"\";\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u8FD0\u884C\u6001\u884C\uFF1B\u5931\u8D25\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4\u7531\u8C03\u7528\u65B9\u964D\u7EA7\u3002\n */\nexport async function queryRuntimeViaDaemon(): Promise<ServiceStatus[]> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.rows;\n return [];\n}\n\n/**\n * \u4ECE\u5B88\u62A4\u8FDB\u7A0B\u62C9\u53D6\u683C\u5F0F\u5316 status \u6587\u672C\u3002\n */\nexport async function statusTextViaDaemon(): Promise<string> {\n const result = await callDaemon(\"status\");\n if (result.kind === \"status\") return result.text;\n if (result.kind === \"text\") return result.text;\n return \"\";\n}\n\n/**\n * \u901A\u7528\u300C\u8FD4\u56DE text\u300D\u7C7B RPC \u8F85\u52A9\u3002\n */\nexport async function textViaDaemon(method: DaemonMethod, params?: DaemonParams): Promise<string> {\n const result = await callDaemon(method, params);\n if (result.kind === \"text\") return result.text;\n if (result.kind === \"status\") return result.text;\n return \"\";\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["deadline"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2MH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2MH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAwGrD"}
|
package/dist/daemon/server.js
CHANGED
|
@@ -21,9 +21,9 @@ import {
|
|
|
21
21
|
} from "./paths.js";
|
|
22
22
|
import { toLogPayload } from "./protocol.js";
|
|
23
23
|
import { markDaemonServer } from "./role.js";
|
|
24
|
-
import { dispatchManagement, onManagementEvent } from "../management/server.js";
|
|
24
|
+
import { dispatchManagement, managementTasks, onManagementEvent } from "../management/server.js";
|
|
25
25
|
import { toManagementError } from "@sfmc-bds/management";
|
|
26
|
-
import { withMaintenanceLock } from "@sfmc-bds/management/node";
|
|
26
|
+
import { isMaintenanceLocked, withMaintenanceLock } from "@sfmc-bds/management/node";
|
|
27
27
|
import { ROOT } from "../runtime.js";
|
|
28
28
|
import fs from "node:fs";
|
|
29
29
|
import path from "node:path";
|
|
@@ -270,7 +270,8 @@ async function runDaemonServer() {
|
|
|
270
270
|
});
|
|
271
271
|
writeDaemonMeta(meta);
|
|
272
272
|
releaseStartup();
|
|
273
|
-
|
|
273
|
+
managementTasks();
|
|
274
|
+
if (process.argv.includes("--autostart") && !isMaintenanceLocked(ROOT)) await startAll();
|
|
274
275
|
const cleanup = () => {
|
|
275
276
|
unsubManagement();
|
|
276
277
|
unsubLog();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/daemon/server.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * server.ts \u2014 \u5B88\u62A4\u8FDB\u7A0B\u670D\u52A1\u7AEF\uFF1A\u672C\u673A\u7BA1\u9053 listen + \u5C06 RPC \u5206\u53D1\u7ED9\u73B0\u6709\u76D1\u7BA1\u903B\u8F91\n *\n * \u4EC5\u5728 `sfmc --daemon` \u8FDB\u7A0B\u5185\u8FD0\u884C\uFF1B\u6301\u6709 Service \u5B50\u8FDB\u7A0B\u3001\u81EA\u52A8\u91CD\u542F\u4E0E BDS stdin\u3002\n * CLI \u9000\u51FA\u4E0D\u65AD\u5F00\u672C\u8FDB\u7A0B\uFF1B`shutdown` \u65B9\u6CD5\u4F1A\u5148 stopAll \u518D\u9000\u51FA\u3002\n */\n\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport {\n cmdRestart,\n cmdSend,\n cmdStart,\n cmdStartAll,\n cmdStatus,\n cmdStop,\n cmdStopAll,\n cmdUpdate,\n} from \"../commands.js\";\nimport { onLog } from \"../logs.js\";\nimport { onServiceStateChange, queryServicesRuntimeLocal, stopAll } from \"../services.js\";\nimport { startAll } from \"../services.js\";\nimport {\n clearDaemonMeta,\n createDaemonToken,\n daemonPipePath,\n writeDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type { DaemonEvent, DaemonRequest, DaemonResponse, DaemonResult } from \"./protocol.js\";\nimport { toLogPayload } from \"./protocol.js\";\nimport { markDaemonServer } from \"./role.js\";\nimport { dispatchManagement, onManagementEvent } from \"../management/server.js\";\nimport { toManagementError } from \"@sfmc-bds/management\";\nimport { withMaintenanceLock } from \"@sfmc-bds/management/node\";\nimport { ROOT } from \"../runtime.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stopForMaintenance } from \"../management/maintenance.js\";\nimport { START_ORDER } from \"../services.js\";\nimport { readDaemonMeta } from \"./paths.js\";\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { randomUUID } from \"node:crypto\";\n\n/** \u5F53\u524D\u5DF2\u8BA2\u9605\u4E8B\u4EF6\u63A8\u9001\u7684 socket \u96C6\u5408 */\nconst subscribers = new Set<net.Socket>();\n\n/** \u662F\u5426\u5DF2\u5F00\u59CB\u4F18\u96C5\u9000\u51FA\uFF08\u907F\u514D\u91CD\u590D shutdown\uFF09 */\nlet shuttingDown = false;\n\n/**\n * \u5411\u6240\u6709\u8BA2\u9605\u8005\u5E7F\u64AD\u4E8B\u4EF6\u5E27\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u670D\u52A1\u65E5\u5FD7\u4E0E\u542F\u505C\u72B6\u6001\u9700\u5B9E\u65F6\u51FA\u73B0\u5728\u5DF2\u8FDE\u63A5\u7684 REPL\u3002\n */\nfunction broadcast(event: DaemonEvent): void {\n const line = JSON.stringify(event) + \"\\n\";\n for (const sock of subscribers) {\n if (sock.destroyed) {\n subscribers.delete(sock);\n continue;\n }\n if (sock.writableLength > 4 * 1024 * 1024) { sock.destroy(); subscribers.delete(sock); continue; }\n try {\n sock.write(line);\n } catch {\n subscribers.delete(sock);\n }\n }\n}\n\nfunction writeRes(sock: net.Socket, res: DaemonResponse): void {\n if (sock.destroyed) return;\n try {\n sock.write(JSON.stringify(res) + \"\\n\");\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u5206\u53D1\u5355\u6761 RPC \u5230\u73B0\u6709 cmd* / services API\uFF08\u672C\u8FDB\u7A0B\u5DF2\u662F daemon\uFF0Ccmd* \u8D70\u672C\u5730\u5B9E\u73B0\uFF09\u3002\n */\nasync function dispatch(req: DaemonRequest): Promise<DaemonResult> {\n const mutable = [\"start\", \"stop\", \"restart\", \"startAll\", \"stopAll\", \"send\", \"update\", \"shutdown\", \"maintenanceStop\"].includes(req.method);\n if (mutable) {\n const owner = fs.existsSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\")) ? JSON.parse(fs.readFileSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\"), \"utf8\")) as { nonce?: string } : null;\n if (!req.params?.maintenanceToken || req.params.maintenanceToken !== owner?.nonce) {\n return withMaintenanceLock(ROOT, () => dispatchUnlocked(req));\n }\n }\n return dispatchUnlocked(req);\n}\nasync function dispatchUnlocked(req: DaemonRequest): Promise<DaemonResult> {\n switch (req.method) {\n case \"maintenanceStop\": {\n await stopForMaintenance([...START_ORDER], () => {});\n return { kind: \"status\", text: \"\", rows: await queryServicesRuntimeLocal() };\n }\n case \"management\": {\n const request = req.params?.request;\n if (!request || typeof request.id !== \"string\" || typeof request.method !== \"string\") throw new Error(\"invalid management request\");\n try { return { kind: \"management\", response: { type: \"res\", id: request.id, ok: true, result: await dispatchManagement(request) } }; }\n catch (error) { return { kind: \"management\", response: { type: \"res\", id: request.id, ok: false, error: toManagementError(error) } }; }\n }\n case \"ping\":\n return { kind: \"pong\" };\n case \"status\": {\n const text = await cmdStatus();\n const rows = await queryServicesRuntimeLocal();\n return { kind: \"status\", text, rows };\n }\n case \"start\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdStart(name) };\n }\n case \"stop\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStopAll() };\n }\n return { kind: \"text\", text: await cmdStop(name) };\n }\n case \"restart\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n await cmdStopAll();\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdRestart(name) };\n }\n case \"startAll\":\n return { kind: \"text\", text: await cmdStartAll() };\n case \"stopAll\":\n return { kind: \"text\", text: await cmdStopAll() };\n case \"send\": {\n const name = req.params?.name;\n const message = req.params?.message;\n if (!name || message === undefined) throw new Error(\"missing params.name/message\");\n return { kind: \"text\", text: await cmdSend(name, message) };\n }\n case \"update\":\n return { kind: \"text\", text: await cmdUpdate(req.params?.args ?? []) };\n case \"subscribe\":\n return { kind: \"subscribed\" };\n case \"shutdown\": {\n if (!shuttingDown) {\n shuttingDown = true;\n try { await stopForMaintenance([...START_ORDER], () => {}); }\n catch (error) { shuttingDown = false; throw error; }\n setTimeout(() => {\n clearDaemonMeta();\n process.exit(0);\n }, 50).unref();\n }\n return { kind: \"shutdown\" };\n }\n default:\n throw new Error(`unknown method: ${(req as DaemonRequest).method}`);\n }\n}\n\n/**\n * \u5904\u7406\u5355\u6761\u8FDE\u63A5\u4E0A\u7684\u8BF7\u6C42\u884C\uFF1B\u9274\u6743\u5931\u8D25\u5219\u5173\u95ED\u3002\n */\nasync function handleLine(sock: net.Socket, line: string, expectedToken: string): Promise<void> {\n let req: DaemonRequest;\n try {\n req = JSON.parse(line) as DaemonRequest;\n } catch {\n writeRes(sock, { type: \"res\", id: \"?\", ok: false, error: \"invalid json\" });\n return;\n }\n if (!req?.id || !req.method) {\n writeRes(sock, { type: \"res\", id: req?.id ?? \"?\", ok: false, error: \"invalid request\" });\n return;\n }\n if (req.token !== expectedToken) {\n writeRes(sock, { type: \"res\", id: req.id, ok: false, error: \"unauthorized\" });\n sock.end();\n return;\n }\n\n if (req.method === \"subscribe\") {\n subscribers.add(sock);\n sock.once(\"close\", () => subscribers.delete(sock));\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result: { kind: \"subscribed\" } });\n return;\n }\n\n try {\n const result = await dispatch(req);\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result });\n } catch (e) {\n writeRes(sock, {\n type: \"res\",\n id: req.id,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\n/**\n * \u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u6807\u8BB0\u89D2\u8272\u3001listen \u7BA1\u9053\u3001\u843D\u76D8 daemon.json\uFF0C\u5E76\u8F6C\u53D1\u65E5\u5FD7/\u72B6\u6001\u4E8B\u4EF6\u3002\n * \u672C\u51FD\u6570\u5728\u6210\u529F listen \u540E\u6C38\u4E0D\u8FD4\u56DE\uFF08\u8FDB\u7A0B\u5E38\u9A7B\uFF09\u3002\n */\nexport async function runDaemonServer(): Promise<void> {\n const startLock = path.join(ROOT, \".sfmc\", \"daemon-start.lock\");\n fs.mkdirSync(path.dirname(startLock), { recursive: true });\n const nonce = randomUUID();\n let handle: number;\n try { handle = fs.openSync(startLock, \"wx\", 0o600); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === \"EEXIST\") throw new Error(\"\u5B88\u62A4\u8FDB\u7A0B\u6B63\u5728\u542F\u52A8\u6216\u542F\u52A8\u9501\u9057\u7559\uFF1B\u4E0D\u4F1A\u521B\u5EFA\u7B2C\u4E8C\u5957\u540E\u53F0\uFF0C\u8BF7\u68C0\u67E5 daemon-start.lock\"); throw error; }\n fs.writeFileSync(handle, JSON.stringify({ pid: process.pid, nonce })); fs.closeSync(handle);\n const releaseStartup = () => { try { const owner = JSON.parse(fs.readFileSync(startLock, \"utf8\")) as { nonce: string }; if (owner.nonce === nonce) fs.unlinkSync(startLock); } catch { /* \u5DF2\u91CA\u653E */ } };\n process.once(\"exit\", releaseStartup);\n const previous = readDaemonMeta();\n if (previous && await isProcessAlive(previous.pid)) { releaseStartup(); process.exit(0); }\n if (previous) clearDaemonMeta();\n markDaemonServer();\n const unsubManagement = onManagementEvent(event => broadcast({ type: \"event\", event: \"management\", payload: event }));\n\n const token = createDaemonToken();\n const pipe = daemonPipePath();\n const meta: DaemonMeta = {\n pid: process.pid,\n pipe,\n token,\n startedAt: new Date().toISOString(),\n };\n\n const unsubLog = onLog((log) => {\n broadcast({ type: \"event\", event: \"log\", payload: toLogPayload(log) });\n });\n const unsubState = onServiceStateChange((ev) => {\n broadcast({ type: \"event\", event: \"state\", payload: ev });\n });\n\n const server = net.createServer((sock) => {\n let buf = \"\";\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => {\n buf += chunk;\n if (Buffer.byteLength(buf) > 8 * 1024 * 1024) { sock.destroy(); return; }\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\")) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (!line) continue;\n void handleLine(sock, line, token);\n }\n });\n sock.on(\"error\", () => {\n subscribers.delete(sock);\n });\n sock.on(\"close\", () => {\n subscribers.delete(sock);\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onErr = (err: NodeJS.ErrnoException): void => {\n /* \u53E6\u4E00\u5B9E\u4F8B\u5DF2\u5360\u7528\u7BA1\u9053\uFF1A\u5B89\u9759\u9000\u51FA\uFF0C\u907F\u514D\u53CC\u5B88\u62A4\u8FDB\u7A0B */\n if (err.code === \"EADDRINUSE\") {\n process.exit(0);\n }\n reject(err);\n };\n server.once(\"error\", onErr);\n server.listen(pipe, () => {\n server.off(\"error\", onErr);\n resolve();\n });\n });\n\n writeDaemonMeta(meta);\n releaseStartup();\n if (process.argv.includes(\"--autostart\") && !fs.existsSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\"))) await startAll();\n\n const cleanup = (): void => {\n unsubManagement();\n unsubLog();\n unsubState();\n try {\n server.close();\n } catch {\n /* ignore */\n }\n clearDaemonMeta();\n };\n\n process.on(\"exit\", cleanup);\n process.on(\"SIGTERM\", () => {\n if (shuttingDown) return;\n shuttingDown = true;\n void stopAll().finally(() => {\n cleanup();\n process.exit(0);\n });\n });\n /* \u5B88\u62A4\u8FDB\u7A0B\u5FFD\u7565 SIGINT\uFF1A\u8131\u79BB\u7EC8\u7AEF\u540E\u4E0D\u5E94\u56E0\u4FE1\u53F7\u505C\u670D\uFF1B\u663E\u5F0F shutdown \u9000\u51FA */\n process.on(\"SIGINT\", () => {\n /* no-op */\n });\n\n await new Promise<never>(() => {\n /* park forever */\n });\n}\n"],
|
|
5
|
-
"mappings": "AAOA,OAAO,SAAS;AAChB,OAAO,aAAa;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa;AACtB,SAAS,sBAAsB,2BAA2B,eAAe;AACzE,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AACjC,SAAS,oBAAoB,yBAAyB;
|
|
4
|
+
"sourcesContent": ["/**\n * server.ts \u2014 \u5B88\u62A4\u8FDB\u7A0B\u670D\u52A1\u7AEF\uFF1A\u672C\u673A\u7BA1\u9053 listen + \u5C06 RPC \u5206\u53D1\u7ED9\u73B0\u6709\u76D1\u7BA1\u903B\u8F91\n *\n * \u4EC5\u5728 `sfmc --daemon` \u8FDB\u7A0B\u5185\u8FD0\u884C\uFF1B\u6301\u6709 Service \u5B50\u8FDB\u7A0B\u3001\u81EA\u52A8\u91CD\u542F\u4E0E BDS stdin\u3002\n * CLI \u9000\u51FA\u4E0D\u65AD\u5F00\u672C\u8FDB\u7A0B\uFF1B`shutdown` \u65B9\u6CD5\u4F1A\u5148 stopAll \u518D\u9000\u51FA\u3002\n */\n\nimport net from \"node:net\";\nimport process from \"node:process\";\nimport {\n cmdRestart,\n cmdSend,\n cmdStart,\n cmdStartAll,\n cmdStatus,\n cmdStop,\n cmdStopAll,\n cmdUpdate,\n} from \"../commands.js\";\nimport { onLog } from \"../logs.js\";\nimport { onServiceStateChange, queryServicesRuntimeLocal, stopAll } from \"../services.js\";\nimport { startAll } from \"../services.js\";\nimport {\n clearDaemonMeta,\n createDaemonToken,\n daemonPipePath,\n writeDaemonMeta,\n type DaemonMeta,\n} from \"./paths.js\";\nimport type { DaemonEvent, DaemonRequest, DaemonResponse, DaemonResult } from \"./protocol.js\";\nimport { toLogPayload } from \"./protocol.js\";\nimport { markDaemonServer } from \"./role.js\";\nimport { dispatchManagement, managementTasks, onManagementEvent } from \"../management/server.js\";\nimport { toManagementError } from \"@sfmc-bds/management\";\nimport { isMaintenanceLocked, withMaintenanceLock } from \"@sfmc-bds/management/node\";\nimport { ROOT } from \"../runtime.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stopForMaintenance } from \"../management/maintenance.js\";\nimport { START_ORDER } from \"../services.js\";\nimport { readDaemonMeta } from \"./paths.js\";\nimport { isProcessAlive } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { randomUUID } from \"node:crypto\";\n\n/** \u5F53\u524D\u5DF2\u8BA2\u9605\u4E8B\u4EF6\u63A8\u9001\u7684 socket \u96C6\u5408 */\nconst subscribers = new Set<net.Socket>();\n\n/** \u662F\u5426\u5DF2\u5F00\u59CB\u4F18\u96C5\u9000\u51FA\uFF08\u907F\u514D\u91CD\u590D shutdown\uFF09 */\nlet shuttingDown = false;\n\n/**\n * \u5411\u6240\u6709\u8BA2\u9605\u8005\u5E7F\u64AD\u4E8B\u4EF6\u5E27\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u670D\u52A1\u65E5\u5FD7\u4E0E\u542F\u505C\u72B6\u6001\u9700\u5B9E\u65F6\u51FA\u73B0\u5728\u5DF2\u8FDE\u63A5\u7684 REPL\u3002\n */\nfunction broadcast(event: DaemonEvent): void {\n const line = JSON.stringify(event) + \"\\n\";\n for (const sock of subscribers) {\n if (sock.destroyed) {\n subscribers.delete(sock);\n continue;\n }\n if (sock.writableLength > 4 * 1024 * 1024) { sock.destroy(); subscribers.delete(sock); continue; }\n try {\n sock.write(line);\n } catch {\n subscribers.delete(sock);\n }\n }\n}\n\nfunction writeRes(sock: net.Socket, res: DaemonResponse): void {\n if (sock.destroyed) return;\n try {\n sock.write(JSON.stringify(res) + \"\\n\");\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u5206\u53D1\u5355\u6761 RPC \u5230\u73B0\u6709 cmd* / services API\uFF08\u672C\u8FDB\u7A0B\u5DF2\u662F daemon\uFF0Ccmd* \u8D70\u672C\u5730\u5B9E\u73B0\uFF09\u3002\n */\nasync function dispatch(req: DaemonRequest): Promise<DaemonResult> {\n const mutable = [\"start\", \"stop\", \"restart\", \"startAll\", \"stopAll\", \"send\", \"update\", \"shutdown\", \"maintenanceStop\"].includes(req.method);\n if (mutable) {\n const owner = fs.existsSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\")) ? JSON.parse(fs.readFileSync(path.join(ROOT, \".sfmc\", \"maintenance.lock\"), \"utf8\")) as { nonce?: string } : null;\n if (!req.params?.maintenanceToken || req.params.maintenanceToken !== owner?.nonce) {\n return withMaintenanceLock(ROOT, () => dispatchUnlocked(req));\n }\n }\n return dispatchUnlocked(req);\n}\nasync function dispatchUnlocked(req: DaemonRequest): Promise<DaemonResult> {\n switch (req.method) {\n case \"maintenanceStop\": {\n await stopForMaintenance([...START_ORDER], () => {});\n return { kind: \"status\", text: \"\", rows: await queryServicesRuntimeLocal() };\n }\n case \"management\": {\n const request = req.params?.request;\n if (!request || typeof request.id !== \"string\" || typeof request.method !== \"string\") throw new Error(\"invalid management request\");\n try { return { kind: \"management\", response: { type: \"res\", id: request.id, ok: true, result: await dispatchManagement(request) } }; }\n catch (error) { return { kind: \"management\", response: { type: \"res\", id: request.id, ok: false, error: toManagementError(error) } }; }\n }\n case \"ping\":\n return { kind: \"pong\" };\n case \"status\": {\n const text = await cmdStatus();\n const rows = await queryServicesRuntimeLocal();\n return { kind: \"status\", text, rows };\n }\n case \"start\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdStart(name) };\n }\n case \"stop\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n return { kind: \"text\", text: await cmdStopAll() };\n }\n return { kind: \"text\", text: await cmdStop(name) };\n }\n case \"restart\": {\n const name = req.params?.name;\n if (!name) throw new Error(\"missing params.name\");\n if (name === \"all\" || name === \"-all\" || name === \"--all\") {\n await cmdStopAll();\n return { kind: \"text\", text: await cmdStartAll() };\n }\n return { kind: \"text\", text: await cmdRestart(name) };\n }\n case \"startAll\":\n return { kind: \"text\", text: await cmdStartAll() };\n case \"stopAll\":\n return { kind: \"text\", text: await cmdStopAll() };\n case \"send\": {\n const name = req.params?.name;\n const message = req.params?.message;\n if (!name || message === undefined) throw new Error(\"missing params.name/message\");\n return { kind: \"text\", text: await cmdSend(name, message) };\n }\n case \"update\":\n return { kind: \"text\", text: await cmdUpdate(req.params?.args ?? []) };\n case \"subscribe\":\n return { kind: \"subscribed\" };\n case \"shutdown\": {\n if (!shuttingDown) {\n shuttingDown = true;\n try { await stopForMaintenance([...START_ORDER], () => {}); }\n catch (error) { shuttingDown = false; throw error; }\n setTimeout(() => {\n clearDaemonMeta();\n process.exit(0);\n }, 50).unref();\n }\n return { kind: \"shutdown\" };\n }\n default:\n throw new Error(`unknown method: ${(req as DaemonRequest).method}`);\n }\n}\n\n/**\n * \u5904\u7406\u5355\u6761\u8FDE\u63A5\u4E0A\u7684\u8BF7\u6C42\u884C\uFF1B\u9274\u6743\u5931\u8D25\u5219\u5173\u95ED\u3002\n */\nasync function handleLine(sock: net.Socket, line: string, expectedToken: string): Promise<void> {\n let req: DaemonRequest;\n try {\n req = JSON.parse(line) as DaemonRequest;\n } catch {\n writeRes(sock, { type: \"res\", id: \"?\", ok: false, error: \"invalid json\" });\n return;\n }\n if (!req?.id || !req.method) {\n writeRes(sock, { type: \"res\", id: req?.id ?? \"?\", ok: false, error: \"invalid request\" });\n return;\n }\n if (req.token !== expectedToken) {\n writeRes(sock, { type: \"res\", id: req.id, ok: false, error: \"unauthorized\" });\n sock.end();\n return;\n }\n\n if (req.method === \"subscribe\") {\n subscribers.add(sock);\n sock.once(\"close\", () => subscribers.delete(sock));\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result: { kind: \"subscribed\" } });\n return;\n }\n\n try {\n const result = await dispatch(req);\n writeRes(sock, { type: \"res\", id: req.id, ok: true, result });\n } catch (e) {\n writeRes(sock, {\n type: \"res\",\n id: req.id,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\n/**\n * \u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u6807\u8BB0\u89D2\u8272\u3001listen \u7BA1\u9053\u3001\u843D\u76D8 daemon.json\uFF0C\u5E76\u8F6C\u53D1\u65E5\u5FD7/\u72B6\u6001\u4E8B\u4EF6\u3002\n * \u672C\u51FD\u6570\u5728\u6210\u529F listen \u540E\u6C38\u4E0D\u8FD4\u56DE\uFF08\u8FDB\u7A0B\u5E38\u9A7B\uFF09\u3002\n */\nexport async function runDaemonServer(): Promise<void> {\n const startLock = path.join(ROOT, \".sfmc\", \"daemon-start.lock\");\n fs.mkdirSync(path.dirname(startLock), { recursive: true });\n const nonce = randomUUID();\n let handle: number;\n try { handle = fs.openSync(startLock, \"wx\", 0o600); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === \"EEXIST\") throw new Error(\"\u5B88\u62A4\u8FDB\u7A0B\u6B63\u5728\u542F\u52A8\u6216\u542F\u52A8\u9501\u9057\u7559\uFF1B\u4E0D\u4F1A\u521B\u5EFA\u7B2C\u4E8C\u5957\u540E\u53F0\uFF0C\u8BF7\u68C0\u67E5 daemon-start.lock\"); throw error; }\n fs.writeFileSync(handle, JSON.stringify({ pid: process.pid, nonce })); fs.closeSync(handle);\n const releaseStartup = () => { try { const owner = JSON.parse(fs.readFileSync(startLock, \"utf8\")) as { nonce: string }; if (owner.nonce === nonce) fs.unlinkSync(startLock); } catch { /* \u5DF2\u91CA\u653E */ } };\n process.once(\"exit\", releaseStartup);\n const previous = readDaemonMeta();\n if (previous && await isProcessAlive(previous.pid)) { releaseStartup(); process.exit(0); }\n if (previous) clearDaemonMeta();\n markDaemonServer();\n const unsubManagement = onManagementEvent(event => broadcast({ type: \"event\", event: \"management\", payload: event }));\n\n const token = createDaemonToken();\n const pipe = daemonPipePath();\n const meta: DaemonMeta = {\n pid: process.pid,\n pipe,\n token,\n startedAt: new Date().toISOString(),\n };\n\n const unsubLog = onLog((log) => {\n broadcast({ type: \"event\", event: \"log\", payload: toLogPayload(log) });\n });\n const unsubState = onServiceStateChange((ev) => {\n broadcast({ type: \"event\", event: \"state\", payload: ev });\n });\n\n const server = net.createServer((sock) => {\n let buf = \"\";\n sock.setEncoding(\"utf8\");\n sock.on(\"data\", (chunk: string) => {\n buf += chunk;\n if (Buffer.byteLength(buf) > 8 * 1024 * 1024) { sock.destroy(); return; }\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\")) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (!line) continue;\n void handleLine(sock, line, token);\n }\n });\n sock.on(\"error\", () => {\n subscribers.delete(sock);\n });\n sock.on(\"close\", () => {\n subscribers.delete(sock);\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onErr = (err: NodeJS.ErrnoException): void => {\n /* \u53E6\u4E00\u5B9E\u4F8B\u5DF2\u5360\u7528\u7BA1\u9053\uFF1A\u5B89\u9759\u9000\u51FA\uFF0C\u907F\u514D\u53CC\u5B88\u62A4\u8FDB\u7A0B */\n if (err.code === \"EADDRINUSE\") {\n process.exit(0);\n }\n reject(err);\n };\n server.once(\"error\", onErr);\n server.listen(pipe, () => {\n server.off(\"error\", onErr);\n resolve();\n });\n });\n\n writeDaemonMeta(meta);\n releaseStartup();\n // \u542F\u52A8\u65F6\u5C31\u6838\u5BF9\u9057\u7559\u4EFB\u52A1\u3002\u7EF4\u62A4\u8FDB\u7A0B\u88AB\u6740\u6389\u540E\uFF0C\u684C\u9762\u4E0D\u7528\u5148\u53D1\u8BF7\u6C42\u4E5F\u80FD\u770B\u5230\u300C\u5DF2\u4E2D\u65AD\u300D\u3002\n managementTasks();\n if (process.argv.includes(\"--autostart\") && !isMaintenanceLocked(ROOT)) await startAll();\n\n const cleanup = (): void => {\n unsubManagement();\n unsubLog();\n unsubState();\n try {\n server.close();\n } catch {\n /* ignore */\n }\n clearDaemonMeta();\n };\n\n process.on(\"exit\", cleanup);\n process.on(\"SIGTERM\", () => {\n if (shuttingDown) return;\n shuttingDown = true;\n void stopAll().finally(() => {\n cleanup();\n process.exit(0);\n });\n });\n /* \u5B88\u62A4\u8FDB\u7A0B\u5FFD\u7565 SIGINT\uFF1A\u8131\u79BB\u7EC8\u7AEF\u540E\u4E0D\u5E94\u56E0\u4FE1\u53F7\u505C\u670D\uFF1B\u663E\u5F0F shutdown \u9000\u51FA */\n process.on(\"SIGINT\", () => {\n /* no-op */\n });\n\n await new Promise<never>(() => {\n /* park forever */\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -340,6 +340,7 @@ export declare const en: {
|
|
|
340
340
|
readonly "mod.update.reason.missingModule": "not installed";
|
|
341
341
|
readonly "mod.update.reason.missingDependency": "required module is not installed";
|
|
342
342
|
readonly "mod.update.reason.badVersion": "version is not semver";
|
|
343
|
+
readonly "mod.update.reason.retired": "included in the platform";
|
|
343
344
|
readonly "mod.pin.usage": "Usage: mod pin <id> --auto on|off";
|
|
344
345
|
readonly "mod.pin.ok": "{id} auto-update {state}";
|
|
345
346
|
readonly "mod.pin.on": "on";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,EAAE;aAEb,kBAAkB,EAAE,WAAW;aAC/B,aAAa,EAAE,MAAM;aACrB,iBAAiB,EAAE,UAAU;aAC7B,cAAc,EAAE,kBAAkB;aAClC,cAAc,EAAE,OAAO;aACvB,uBAAuB,EAAE,wBAAwB;aACjD,qBAAqB,EAAE,6BAA6B;aACpD,aAAa,EAAE,MAAM;aACrB,aAAa,EAAE,MAAM;aACrB,aAAa,EAAE,MAAM;aACrB,aAAa,EAAE,QAAQ;aACvB,YAAY,EAAE,KAAK;aAGnB,gBAAgB,EAAE,0BAA0B;aAC5C,YAAY,EAAE,wBAAwB;aACtC,gBAAgB,EAAE,0CAA0C;aAC5D,cAAc,EAAE,gCAAgC;aAChD,eAAe,EAAE,qBAAqB;aACtC,eAAe,EAAE,MAAM;aACvB,eAAe,EAAE,SAAS;aAG1B,cAAc,EAAE,+BAA+B;aAC/C,mBAAmB,EAAE,qEAAqE;aAC1F,aAAa,EAAE,8CAA8C;aAG7D,gBAAgB,EAAE,IAAI;aACtB,iBAAiB,EAAE,KAAK;aACxB,mBAAmB,EAAE,kBAAkB;aACvC,eAAe,EAAE,mEAAmE;aACpF,gBAAgB,EAAE,qEAAqE;aACvF,kBAAkB,EAAE,uBAAuB;aAC3C,sBAAsB,EAAE,oBAAoB;aAC5C,yBAAyB,EAAE,2BAA2B;aACtD,yBAAyB,EAAE,wBAAwB;aACnD,sBAAsB,EAAE,iCAAiC;aACzD,oBAAoB,EAAE,uDAAuD;aAC7E,eAAe,EAAE,iCAAiC;aAClD,aAAa,EAAE,uEAAuE;aACtF,kBAAkB,EAAE,sDAAsD;aAG1E,YAAY,EAAE,sCAAsC;aACpD,iBAAiB,EAAE,WAAW;aAC9B,YAAY,EAAE,QAAQ;aACtB,sBAAsB,EAAE,SAAS;aACjC,gBAAgB,EAAE,kDAAkD;aACpE,eAAe,EAAE,8BAA8B;aAC/C,mBAAmB,EAAE,iDAAiD;aACtE,iBAAiB,EAAE,gEAAgE;aACnF,qBAAqB,EAAE,cAAc;aACrC,qBAAqB,EAAE,cAAc;aACrC,sBAAsB,EAAE,aAAa;aACrC,mBAAmB,EAAE,kBAAkB;aACvC,oBAAoB,EAAE,YAAY;aAClC,sBAAsB,EAAE,yBAAyB;aACjD,aAAa,EAAE,wDAAwD;aACvE,WAAW,EAAE,uCAAuC;aACpD,YAAY,EAAE,sEAAsE;aACpF,WAAW,EAAE,gBAAgB;aAC7B,cAAc,EAAE,mBAAmB;aACnC,WAAW,EAAE,kFAAkF;aAC/F,qBAAqB,EAAE,oBAAoB;aAC3C,aAAa,EAAE,0BAA0B;aACzC,uBAAuB,EAAE,yCAAyC;aAClE,mBAAmB,EAAE,uCAAuC;aAC5D,qBAAqB,EAAE,mCAAmC;aAC1D,4BAA4B,EAAE,yBAAyB;aACvD,4BAA4B,EAAE,yBAAyB;aACvD,oBAAoB,EAAE,mBAAmB;aACzC,mBAAmB,EAAE,oCAAoC;aACzD,mBAAmB,EAAE,mBAAmB;aACxC,sBAAsB,EAAE,gBAAgB;aACxC,uBAAuB,EAAE,mBAAmB;aAC5C,mBAAmB,EAAE,sBAAsB;aAC3C,SAAS,EAAE,8CAA8C;aACzD,gBAAgB,EAAE,sCAAsC;aACxD,cAAc,EAAE,gCAAgC;aAChD,UAAU,EAAE,4BAA4B;aACxC,mBAAmB,EAAE,0BAA0B;aAC/C,gBAAgB,EAAE,kCAAkC;aACpD,mBAAmB,EAAE,qCAAqC;aAC1D,mBAAmB,EAAE,oBAAoB;aACzC,sBAAsB,EAAE,2CAA2C;aACnE,kBAAkB,EAAE,sCAAsC;aAC1D,qBAAqB,EAAE,2BAA2B;aAClD,kBAAkB,EAAE,wBAAwB;aAC5C,oBAAoB,EAAE,oCAAoC;aAC1D,oBAAoB,EAAE,wCAAwC;aAC9D,qBAAqB,EAAE,kBAAkB;aACzC,uBAAuB,EAAE,yBAAyB;aAClD,oBAAoB,EAAE,0BAA0B;aAChD,kBAAkB,EAAE,qBAAqB;aACzC,oBAAoB,EAAE,eAAe;aACrC,oBAAoB,EAAE,oCAAoC;aAC1D,iBAAiB,EAAE,mCAAmC;aACtD,mBAAmB,EAAE,kCAAkC;aACvD,oBAAoB,EAAE,uCAAuC;aAC7D,oBAAoB,EAAE,uBAAuB;aAC7C,YAAY,EAAE,2BAA2B;aACzC,iBAAiB,EAAE,kBAAkB;aACrC,mBAAmB,EAAE,qBAAqB;aAC1C,mBAAmB,EAAE,eAAe;aACpC,oBAAoB,EAAE,gBAAgB;aACtC,mBAAmB,EAAE,sBAAsB;aAC3C,uBAAuB,EAAE,yCAAyC;aAClE,kCAAkC,EAAE,wCAAwC;aAC5E,+BAA+B,EAAE,8BAA8B;aAC/D,mCAAmC,EACjC,wFAAwF;aAC1F,iBAAiB,EAAE,iBAAiB;aACpC,sBAAsB,EAAE,iBAAiB;aACzC,WAAW,EAAE,cAAc;aAC3B,aAAa,EAAE,yBAAyB;aACxC,cAAc,EAAE,cAAc;aAC9B,WAAW,EAAE,gBAAgB;aAC7B,WAAW,EAAE,kCAAkC;aAC/C,gBAAgB,EAAE,YAAY;aAC9B,mBAAmB,EAAE,2BAA2B;aAChD,qBAAqB,EAAE,mBAAmB;aAC1C,qBAAqB,EAAE,qCAAqC;aAC5D,uBAAuB,EAAE,iBAAiB;aAG1C,eAAe,EAAE,sBAAsB;aACvC,aAAa,EAAE,sEAAsE;aACrF,UAAU,EAAE,KAAK;aACjB,gBAAgB,EAAE,4BAA4B;aAC9C,qBAAqB,EAAE,yCAAyC;aAChE,oBAAoB,EAAE,+BAA+B;aACrD,aAAa,EAAE,wCAAwC;aACvD,wBAAwB,EAAE,0BAA0B;aACpD,mBAAmB,EAAE,sEAAsE;aAC3F,mBAAmB,EAAE,uBAAuB;aAC5C,qBAAqB,EAAE,SAAS;aAChC,sBAAsB,EAAE,UAAU;aAClC,sBAAsB,EAAE,UAAU;aAClC,uBAAuB,EAAE,WAAW;aACpC,uBAAuB,EAAE,YAAY;aACrC,uBAAuB,EAAE,YAAY;aACrC,wBAAwB,EAAE,aAAa;aACvC,wBAAwB,EAAE,aAAa;aACvC,kBAAkB,EAAE,cAAc;aAGlC,gBAAgB,EAAE,gBAAgB;aAClC,mBAAmB,EAAE,uBAAuB;aAC5C,gBAAgB,EAAE,4BAA4B;aAC9C,cAAc,EAAE,6BAA6B;aAC7C,sBAAsB,EAAE,qCAAqC;aAC7D,aAAa,EAAE,6BAA6B;aAC5C,oBAAoB,EAAE,oCAAoC;aAC1D,kBAAkB,EAAE,4BAA4B;aAChD,cAAc,EAAE,KAAK;aACrB,iBAAiB,EAAE,UAAU;aAC7B,uBAAuB,EAAE,SAAS;aAGlC,YAAY,EAAE,UAAU;aACxB,cAAc,EAAE,MAAM;aACtB,gBAAgB,EAAE,QAAQ;aAC1B,eAAe,EAAE,OAAO;aACxB,aAAa,EAAE,KAAK;aACpB,gBAAgB,EAAE,QAAQ;aAC1B,mBAAmB,EAAE,SAAS;aAC9B,mBAAmB,EAAE,SAAS;aAC9B,mBAAmB,EAAE,SAAS;aAC9B,oBAAoB,EAAE,UAAU;aAChC,gBAAgB,EAAE,GAAG;aACrB,aAAa,EAAE,SAAS;aACxB,qBAAqB,EAAE,oBAAoB;aAC3C,aAAa,EAAE,SAAS;aACxB,aAAa,EAAE,uCAAuC;aACtD,gBAAgB,EAAE,mCAAmC;aACrD,gBAAgB,EAAE,eAAe;aACjC,iBAAiB,EAAE,8BAA8B;aACjD,iBAAiB,EAAE,kCAAkC;aACrD,sBAAsB,EAAE,6BAA6B;aACrD,gBAAgB,EAAE,iCAAiC;aACnD,qBAAqB,EAAE,4BAA4B;aACnD,mBAAmB,EAAE,oCAAoC;aACzD,wBAAwB,EAAE,+BAA+B;aACzD,oBAAoB,EAAE,qCAAqC;aAC3D,qBAAqB,EAAE,6BAA6B;aACpD,aAAa,EAAE,iBAAiB;aAChC,iBAAiB,EAAE,2BAA2B;aAC9C,oBAAoB,EAAE,yBAAyB;aAC/C,qBAAqB,EAAE,6BAA6B;aACpD,gBAAgB,EAAE,iBAAiB;aACnC,gBAAgB,EAAE,gCAAgC;aAClD,gBAAgB,EAAE,iCAAiC;aACnD,gBAAgB,EAAE,qBAAqB;aACvC,iBAAiB,EAAE,cAAc;aACjC,eAAe,EAAE,mBAAmB;aACpC,mBAAmB,EAAE,mCAAmC;aACxD,gBAAgB,EAAE,sBAAsB;aACxC,gBAAgB,EAAE,sBAAsB;aACxC,aAAa,EAAE,2BAA2B;aAC1C,sBAAsB,EAAE,iBAAiB;aACzC,sBAAsB,EAAE,iBAAiB;aACzC,qBAAqB,EAAE,gBAAgB;aACvC,oBAAoB,EAAE,kBAAkB;aACxC,oBAAoB,EAAE,iBAAiB;aACvC,kBAAkB,EAAE,gCAAgC;aACpD,iBAAiB,EAAE,yBAAyB;aAC5C,oBAAoB,EAAE,qCAAqC;aAC3D,gBAAgB,EAAE,0BAA0B;aAC5C,oBAAoB,EAAE,6BAA6B;aACnD,yBAAyB,EAAE,wDAAwD;aACnF,uBAAuB,EAAE,yCAAyC;aAClE,sBAAsB,EAAE,4DAA4D;aACpF,qBAAqB,EAAE,oCAAoC;aAG3D,cAAc,EAAE,iBAAiB;aACjC,cAAc,EAAE,oCAAoC;aACpD,gBAAgB,EAAE,eAAe;aACjC,cAAc,EAAE,8BAA8B;aAC9C,oBAAoB,EAAE,sBAAsB;aAC5C,6BAA6B,EAAE,iDAAiD;aAChF,mBAAmB,EAAE,uCAAuC;aAC5D,cAAc,EAAE,4BAA4B;aAC5C,kBAAkB,EAAE,kFAAkF;aACtG,eAAe,EAAE,4BAA4B;aAC7C,wBAAwB,EAAE,iDAAiD;aAC3E,kBAAkB,EAAE,oBAAoB;aACxC,2BAA2B,EAAE,iCAAiC;aAC9D,+BAA+B,EAAE,2CAA2C;aAC5E,wBAAwB,EAAE,mBAAmB;aAC7C,4BAA4B,EAAE,8BAA8B;aAC5D,2BAA2B,EAAE,2BAA2B;aACxD,+BAA+B,EAAE,kBAAkB;aACnD,gBAAgB,EAAE,yBAAyB;aAC3C,oBAAoB,EAAE,6BAA6B;aACnD,kBAAkB,EAAE,0BAA0B;aAC9C,sBAAsB,EAAE,kCAAkC;aAC1D,0BAA0B,EAAE,4BAA4B;aACxD,oBAAoB,EAAE,gCAAgC;aACtD,iBAAiB,EAAE,yBAAyB;aAC5C,qBAAqB,EAAE,uBAAuB;aAC9C,cAAc,EAAE,4BAA4B;aAC5C,eAAe,EAAE,uBAAuB;aACxC,kBAAkB,EAAE,kBAAkB;aACtC,sBAAsB,EAAE,oBAAoB;aAC5C,cAAc,EAAE,0BAA0B;aAC1C,iBAAiB,EAAE,iBAAiB;aACpC,oBAAoB,EAAE,qBAAqB;aAC3C,aAAa,EACX,2IAA2I;aAC7I,kBAAkB,EAAE,YAAY;aAChC,oBAAoB,EAAE,mBAAmB;aACzC,sBAAsB,EAAE,iBAAiB;aACzC,wBAAwB,EAAE,SAAS;aACnC,4BAA4B,EAAE,QAAQ;aACtC,wBAAwB,EAAE,SAAS;aACnC,4BAA4B,EAAE,iBAAiB;aAC/C,2BAA2B,EAAE,2CAA2C;aACxE,kBAAkB,EAAE,sBAAsB;aAC1C,iBAAiB,EAAE,kEAAkE;aACrF,6BAA6B,EAAE,eAAe;aAC9C,wBAAwB,EAAE,YAAY;aACtC,wBAAwB,EAAE,kBAAkB;aAC5C,mBAAmB,EACjB,6HAA6H;aAC/H,cAAc,EAAE,kBAAkB;aAClC,qBAAqB,EAAE,gCAAgC;aACvD,oBAAoB,EAAE,2BAA2B;aACjD,oBAAoB,EAAE,uEAAuE;aAC7F,wBAAwB,EAAE,+CAA+C;aACzE,4BAA4B,EAAE,6CAA6C;aAC3E,wBAAwB,EAAE,mCAAmC;aAC7D,wBAAwB,EAAE,uEAAuE;aACjG,sBAAsB,EAAE,iBAAiB;aACzC,kBAAkB,EAAE,SAAS;aAC7B,wBAAwB,EAAE,kBAAkB;aAC5C,uBAAuB,EAAE,iBAAiB;aAC1C,wBAAwB,EAAE,uBAAuB;aACjD,uBAAuB,EAAE,sBAAsB;aAC/C,eAAe,EAAE,uBAAuB;aACxC,kBAAkB,EAAE,4BAA4B;aAChD,aAAa,EAAE,sBAAsB;aACrC,uBAAuB,EAAE,iBAAiB;aAC1C,qBAAqB,EAAE,qBAAqB;aAC5C,sBAAsB,EAAE,gBAAgB;aACxC,aAAa,EAAE,mCAAmC;aAClD,mBAAmB,EAAE,wDAAwD;aAC7E,kBAAkB,EAAE,mBAAmB;aACvC,sBAAsB,EAAE,sEAAsE;aAC9F,qBAAqB,EAAE,8EAA8E;aACrG,0BAA0B,EACxB,uGAAuG;aACzG,mBAAmB,EAAE,wBAAwB;aAC7C,oBAAoB,EAAE,+DAA+D;aACrF,kBAAkB,EAAE,qBAAqB;aACzC,mBAAmB,EAAE,4CAA4C;aACjE,qBAAqB,EAAE,oFAAoF;aAG3G,mBAAmB,EAAE,eAAe;aACpC,kBAAkB,EAAE,YAAY;aAChC,eAAe,EAAE,SAAS;aAC1B,mBAAmB,EAAE,2BAA2B;aAChD,0BAA0B,EAAE,gDAAgD;aAG5E,kBAAkB,EAAE,oFAAoF;aACxG,sBAAsB,EACpB,iGAAiG;aACnG,aAAa,EAAE,oBAAoB;aAGnC,UAAU,EAAE,6CAA6C;aAEzD,WAAW,EAAE,oCAAoC;aACjD,gBAAgB,EAAE,mBAAmB;aACrC,mBAAmB,EAAE,4FAA4F;aACjH,mBAAmB,EAAE,qDAAqD;aAC1E,gBAAgB,EAAE,sBAAsB;aACxC,oBAAoB,EAAE,qCAAqC;aAC3D,kBAAkB,EAAE,2BAA2B;aAC/C,cAAc,EAAE,gCAAgC;aAChD,mBAAmB,EAAE,qFAAqF;aAC1G,kBAAkB,EAAE,6BAA6B;aACjD,oBAAoB,EAAE,SAAS;aAC/B,qBAAqB,EAAE,UAAU;aACjC,cAAc,EAAE,cAAc;aAC9B,mBAAmB,EAAE,gCAAgC;aACrD,mBAAmB,EAAE,mDAAmD;aACxE,sBAAsB,EAAE,+CAA+C;aACvE,qBAAqB,EACnB,0IAA0I;aAC5I,kBAAkB,EAAE,wBAAwB;aAC5C,mBAAmB,EAAE,yBAAyB;aAC9C,mBAAmB,EAAE,4FAA4F;aACjH,iBAAiB,EAAE,4FAA4F;aAC/G,kBAAkB,EAAE,4EAA4E;aAChG,qBAAqB,EAAE,2BAA2B;aAClD,wBAAwB,EAAE,iDAAiD;aAC3E,aAAa,EAAE,4BAA4B;aAC3C,kBAAkB,EAAE,6DAA6D;aACjF,qBAAqB,EAAE,8DAA8D;aACrF,qBAAqB,EAAE,iEAAiE;aACxF,iBAAiB,EAAE,oBAAoB;aACvC,oBAAoB,EAAE,sBAAsB;aAC5C,oBAAoB,EAAE,2BAA2B;aACjD,sBAAsB,EAAE,0BAA0B;aAClD,oBAAoB,EAAE,sDAAsD;aAC5E,oBAAoB,EAAE,8BAA8B;aACpD,mBAAmB,EAAE,wBAAwB;aAC7C,uBAAuB,EAAE,8DAA8D;aACvF,2BAA2B,EAAE,iBAAiB;aAC9C,+BAA+B,EAAE,yBAAyB;aAC1D,mCAAmC,EAAE,sBAAsB;aAC3D,4BAA4B,EAAE,mBAAmB;aACjD,sCAAsC,EAAE,2BAA2B;aACnE,4BAA4B,EAAE,YAAY;aAC1C,kCAAkC,EAAE,4BAA4B;aAChE,yBAAyB,EAAE,sBAAsB;aACjD,uBAAuB,EAAE,yBAAyB;aAClD,oCAAoC,EAAE,0BAA0B;aAChE,gCAAgC,EAAE,4BAA4B;aAC9D,iCAAiC,EAAE,eAAe;aAClD,qCAAqC,EAAE,kCAAkC;aACzE,8BAA8B,EAAE,uBAAuB;aACvD,2BAA2B,EAAE,0BAA0B;aACvD,eAAe,EAAE,mCAAmC;aACpD,YAAY,EAAE,0BAA0B;aACxC,YAAY,EAAE,IAAI;aAClB,aAAa,EAAE,KAAK;aACpB,gBAAgB,EAAE,2EAA2E;aAC7F,iBAAiB,EAAE,+BAA+B;aAGlD,YAAY,EAAE,uBAAuB;aACrC,kBAAkB,EAAE,8BAA8B;aAClD,eAAe,EAAE,gBAAgB;aACjC,mBAAmB,EAAE,+BAA+B;aACpD,mBAAmB,EAAE,+BAA+B;aACpD,iBAAiB,EAAE,6BAA6B;aAChD,gBAAgB,EAAE,oDAAoD;aACtE,aAAa,EAAE,gCAAgC;aAC/C,mBAAmB,EAAE,2BAA2B;aAChD,gBAAgB,EAAE,4BAA4B;aAC9C,iBAAiB,EAAE,6BAA6B;aAChD,gBAAgB,EAAE,iCAAiC;aACnD,YAAY,EAAE,+CAA+C;aAG7D,mBAAmB,EAAE,wCAAwC;aAC7D,kBAAkB,EAAE,gDAAgD;aACpE,gBAAgB,EAAE,oBAAoB;aACtC,yBAAyB,EAAE,wDAAwD;aACnF,yBAAyB,EAAE,wCAAwC;aACnE,oBAAoB,EAAE,yDAAyD;aAC/E,mBAAmB,EAAE,wFAAwF;aAC7G,0BAA0B,EAAE,2BAA2B;aACvD,oBAAoB,EAAE,2DAA2D;aACjF,iBAAiB,EAAE,6BAA6B;aAChD,kBAAkB,EAAE,yCAAyC;aAC7D,mBAAmB,EAAE,mCAAmC;aACxD,qBAAqB,EAAE,2BAA2B;aAClD,kBAAkB,EAAE,+BAA+B;aACnD,wBAAwB,EAAE,iDAAiD;aAC3E,qBAAqB,EAAE,mCAAmC;aAC1D,iBAAiB,EAAE,QAAQ;aAC3B,qBAAqB,EAAE,iBAAiB;aACxC,qBAAqB,EAAE,iBAAiB;aACxC,eAAe,EAAE,KAAK;aACtB,gBAAgB,EAAE,KAAK;aACvB,wBAAwB,EAAE,4BAA4B;aACtD,yBAAyB,EAAE,sDAAsD;aACjF,8BAA8B,EAAE,sEAAsE;aACtG,yBAAyB,EAAE,uDAAuD;aAClF,8BAA8B,EAC5B,8JAA8J;aAChK,4BAA4B,EAC1B,mGAAmG;aACrG,gCAAgC,EAAE,kDAAkD;aACpF,6BAA6B,EAAE,yDAAyD;aACxF,+BAA+B,EAAE,6CAA6C;aAC9E,4BAA4B,EAAE,mEAAmE;aACjG,iCAAiC,EAC/B,sLAAsL;aACxL,+BAA+B,EAAE,+CAA+C;aAChF,2BAA2B,EAAE,uCAAuC;aACpE,wBAAwB,EAAE,gEAAgE;aAC1F,gCAAgC,EAAE,6CAA6C;aAC/E,+BAA+B,EAC7B,sGAAsG;aACxG,mCAAmC,EAAE,yEAAyE;aAC9G,gCAAgC,EAAE,qEAAqE;aACvG,mCAAmC,EACjC,uFAAuF;aACzF,iBAAiB,EAAE,yBAAyB;aAC5C,oBAAoB,EAAE,wCAAwC;aAC9D,gBAAgB,EAAE,sBAAsB;aACxC,kBAAkB,EAAE,8BAA8B;aAClD,kBAAkB,EAAE,4CAA4C;aAChE,mBAAmB,EAAE,8CAA8C;aACnE,cAAc,EAAE,mDAAmD;aACnE,mBAAmB,EAAE,6BAA6B;aAClD,kBAAkB,EAAE,+CAA+C;aACnE,sBAAsB,EAAE,uCAAuC;aAC/D,qBAAqB,EAAE,iDAAiD;aACxE,oBAAoB,EAAE,mCAAmC;aACzD,kBAAkB,EAAE,gBAAgB;aACpC,oBAAoB,EAAE,mEAAmE;aACzF,kBAAkB,EAAE,sDAAsD;aAC1E,oBAAoB,EAAE,mCAAmC;aACzD,gBAAgB,EAAE,iCAAiC;aACnD,kBAAkB,EAAE,wBAAwB;aAC5C,oBAAoB,EAAE,yCAAyC;aAC/D,oBAAoB,EAAE,mCAAmC;aACzD,uBAAuB,EACrB,uHAAuH;aACzH,2BAA2B,EAAE,8DAA8D;aAC3F,yBAAyB,EAAE,kDAAkD;aAC7E,yBAAyB,EAAE,mCAAmC;aAC9D,4BAA4B,EAAE,+DAA+D;aAC7F,gCAAgC,EAAE,uCAAuC;aACzE,sBAAsB,EAAE,+DAA+D;aACvF,yBAAyB,EAAE,wDAAwD;aACnF,yBAAyB,EAAE,kCAAkC;aAC7D,2BAA2B,EAAE,qBAAqB;aAClD,sBAAsB,EAAE,wBAAwB;aAChD,0BAA0B,EAAE,wBAAwB;aACpD,qBAAqB,EAAE,+CAA+C;aACtE,oBAAoB,EAAE,wEAAwE;aAC9F,kBAAkB,EAAE,+DAA+D;aACnF,kBAAkB,EAAE,oCAAoC;aACxD,mBAAmB,EAAE,0CAA0C;aAC/D,kBAAkB,EAAE,2BAA2B;aAC/C,sBAAsB,EAAE,sCAAsC;aAC9D,mBAAmB,EAAE,eAAe;aACpC,mBAAmB,EAAE,yEAAyE;aAC9F,qBAAqB,EAAE,yDAAyD;aAChF,wBAAwB,EAAE,4DAA4D;aACtF,wBAAwB,EAAE,sDAAsD;aAEhF,oBAAoB,EAClB,uPAAuP;aACzP,wBAAwB,EAAE,oDAAoD;aAC9E,yBAAyB,EAAE,8DAA8D;aACzF,sBAAsB,EAAE,gCAAgC;aACxD,sBAAsB,EAAE,iCAAiC;aACzD,0BAA0B,EAAE,gDAAgD;aAC5E,qBAAqB,EAAE,2DAA2D;aAClF,qBAAqB,EAAE,sEAAsE;aAC7F,wBAAwB,EAAE,sDAAsD;aAChF,0BAA0B,EAAE,6DAA6D;aACzF,4BAA4B,EAAE,mDAAmD;aACjF,wBAAwB,EAAE,cAAc;aACxC,mBAAmB,EAAE,8DAA8D;aACnF,uBAAuB,EAAE,uCAAuC;aAChE,wBAAwB,EAAE,0CAA0C;aACpE,wBAAwB,EAAE,gCAAgC;aAC1D,0BAA0B,EAAE,uCAAuC;aACnE,yBAAyB,EAAE,wDAAwD;aACnF,qBAAqB,EAAE,gCAAgC;aACvD,4BAA4B,EAAE,mCAAmC;aACjE,yBAAyB,EAAE,0BAA0B;aACrD,sBAAsB,EAAE,qCAAqC;aAC7D,qBAAqB,EAAE,YAAY;aACnC,qBAAqB,EAAE,iFAAiF;aACxG,uBAAuB,EAAE,oCAAoC;aAC7D,oBAAoB,EAAE,8BAA8B;aACpD,wBAAwB,EAAE,0BAA0B;aACpD,wBAAwB,EAAE,+BAA+B;aACzD,wBAAwB,EAAE,+BAA+B;aACzD,0BAA0B,EACxB,qGAAqG;aACvG,oBAAoB,EAAE,gCAAgC;aACtD,sBAAsB,EAAE,6BAA6B;aACrD,wBAAwB,EAAE,wCAAwC;CAC1D,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC"}
|
package/dist/i18n/locales/en.js
CHANGED
|
@@ -349,6 +349,7 @@ const en = {
|
|
|
349
349
|
"mod.update.reason.missingModule": "not installed",
|
|
350
350
|
"mod.update.reason.missingDependency": "required module is not installed",
|
|
351
351
|
"mod.update.reason.badVersion": "version is not semver",
|
|
352
|
+
"mod.update.reason.retired": "included in the platform",
|
|
352
353
|
"mod.pin.usage": "Usage: mod pin <id> --auto on|off",
|
|
353
354
|
"mod.pin.ok": "{id} auto-update {state}",
|
|
354
355
|
"mod.pin.on": "on",
|