@sfmc-bds/cli 0.6.1 → 0.8.0
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/logs.d.ts +21 -0
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +67 -1
- package/dist/logs.js.map +2 -2
- package/dist/management/config.d.ts.map +1 -1
- package/dist/management/config.js +5 -1
- package/dist/management/config.js.map +2 -2
- package/dist/management/domain.d.ts +46 -2
- package/dist/management/domain.d.ts.map +1 -1
- package/dist/management/domain.js +112 -26
- package/dist/management/domain.js.map +2 -2
- package/dist/management/maintenance.d.ts +8 -0
- package/dist/management/maintenance.d.ts.map +1 -1
- package/dist/management/maintenance.js +18 -0
- package/dist/management/maintenance.js.map +2 -2
- package/dist/management/pack-import.d.ts +29 -0
- package/dist/management/pack-import.d.ts.map +1 -0
- package/dist/management/pack-import.js +108 -0
- package/dist/management/pack-import.js.map +7 -0
- package/dist/management/server.d.ts.map +1 -1
- package/dist/management/server.js +67 -10
- package/dist/management/server.js.map +2 -2
- package/dist/module-sidecars.d.ts.map +1 -1
- package/dist/module-sidecars.js +23 -0
- package/dist/module-sidecars.js.map +2 -2
- package/dist/registry.d.ts +11 -5
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +35 -11
- package/dist/registry.js.map +2 -2
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +14 -0
- package/dist/services.js.map +2 -2
- package/dist/world-packs.d.ts +47 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +38 -11
- package/dist/world-packs.js.map +2 -2
- package/package.json +7 -7
- package/scripts/module-install/.sfmc-registry-cache.json +151 -28
- package/scripts/module-install/lib/registry-index.mjs +50 -13
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/management/pack-import.ts"],
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { PackImportPlan, PackImportOptions } from \"@sfmc-bds/management\";\nimport { decidePackInstallPlan, enableInstalledPack, installPackDirectory, readPackManifestInfo, resolvePackRoots, scanDestOccupancy, worldPackParentDir } from \"@sfmc-bds/bds-tools/world-packs\";\nimport { ROOT } from \"../runtime.js\";\nimport { resolveBdsContext } from \"../pack-lifecycle.js\";\nimport { identifier } from \"./domain.js\";\n\n/** \u4E0E REPL \u5171\u7528\u5B89\u88C5\u51B3\u7B56\uFF1B\u5148\u68C0\u67E5\u6574\u4E2A\u5F52\u6863\uFF0C\u907F\u514D\u540E\u9762\u7684\u51B2\u7A81\u5BFC\u81F4\u524D\u9762\u7684\u5305\u5DF2\u88AB\u5199\u5165\u3002 */\nasync function inspectImport<T>(filename: string, action: (plan: PackImportPlan, install: (force: boolean) => Promise<void>) => Promise<T>): Promise<T> {\n const inbox = path.resolve(ROOT, \"packs\", \"_desktop-inbox\");\n const file = path.resolve(inbox, identifier(filename));\n if (!file.startsWith(inbox + path.sep) || !fs.existsSync(file)) throw new Error(\"\u4E16\u754C\u5305\u5C1A\u672A\u4E0A\u4F20\u5230\u5B9E\u4F8B\u6536\u4EF6\u7BB1\");\n const context = resolveBdsContext();\n const resolved = await resolvePackRoots(file);\n try {\n if (!resolved.roots.length) throw new Error(\"\u5F52\u6863\u4E0D\u542B\u53EF\u8BC6\u522B\u7684\u4E16\u754C\u5305\");\n const seen = new Set<string>();\n const prepared = resolved.roots.map(source => {\n const info = readPackManifestInfo(source);\n if (!info) throw new Error(\"\u4E16\u754C\u5305 manifest \u65E0\u6548\");\n const id = info.uuid.toLowerCase();\n if (seen.has(id)) throw new Error(`\u5F52\u6863\u5305\u542B\u91CD\u590D\u7684\u4E16\u754C\u5305 UUID: ${info.uuid}`);\n seen.add(id);\n const destParent = worldPackParentDir(context.bdsRoot, context.levelName, info.kind);\n const decision = decidePackInstallPlan({ incoming: info, hint: path.basename(source), occupancy: scanDestOccupancy(destParent) });\n return { source, info, destParent, decision };\n });\n const hash = createHash(\"sha256\");\n for await (const chunk of fs.createReadStream(file)) hash.update(chunk);\n hash.update(JSON.stringify({\n context,\n existing: prepared.map(({ info, decision }) => ({\n id: info.uuid,\n dir: decision.kind === \"fresh\" ? null : decision.dir,\n manifest: decision.kind === \"fresh\" ? null : fs.readFileSync(path.join(decision.dir, \"manifest.json\"), \"utf8\"),\n })),\n }));\n const plan: PackImportPlan = {\n revision: hash.digest(\"hex\"),\n packs: prepared.map(({ info, decision }) => ({\n id: info.uuid, name: info.name, kind: info.kind, version: info.version.join(\".\"),\n action: decision.kind === \"fresh\" ? \"install\" : decision.kind === \"needConfirm\" ? \"conflict\" : \"update\",\n ...(decision.kind === \"fresh\" ? {} : { existing: { name: decision.existing.name, version: decision.existing.version.join(\".\") } }),\n })),\n };\n return await action(plan, async force => {\n for (const { source, info, destParent } of prepared) {\n const result = await installPackDirectory({ srcDir: source, destParent, force });\n if (!result.ok) throw Object.assign(new Error(result.reason ?? \"\u4E16\u754C\u5305\u5B89\u88C5\u5931\u8D25\"), { code: result.conflict ? \"conflict\" : \"io\", details: result.conflict });\n await enableInstalledPack({ ...context, info });\n }\n });\n } finally { resolved.dispose(); }\n}\n\nexport function planPackImport(filename: string): Promise<PackImportPlan> {\n return inspectImport(filename, async plan => plan);\n}\n\n/**\n * \u4ECE\u7BA1\u7406\u8BF7\u6C42\u53D6\u51FA\u6536\u4EF6\u7BB1\u6587\u4EF6\u540D\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u684C\u9762\u4E00\u6B21\u62D6\u5165\u6216\u9009\u4E2D\u591A\u4E2A\u4E16\u754C\u5305\u65F6\u4F20 filenames\uFF1B\u65E7\u5BA2\u6237\u7AEF\u4ECD\u53EA\u4F20 filename\u3002\n */\nexport function readImportFilenames(params: { filename?: unknown; filenames?: unknown }): string[] {\n if (Array.isArray(params.filenames)) {\n const names = [...new Set(params.filenames.map(value => identifier(value)))];\n if (!names.length) throw new Error(\"\u6CA1\u6709\u8981\u5BFC\u5165\u7684\u4E16\u754C\u5305\");\n return names;\n }\n return [identifier(params.filename)];\n}\n\n/**\n * \u6309\u987A\u5E8F\u5BFC\u5165\u591A\u4E2A\u6536\u4EF6\u7BB1\u6587\u4EF6\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u6279\u91CF\u5BFC\u5165\u3002\u53EA\u6709\u4E00\u4E2A\u6587\u4EF6\u65F6\u4ECD\u8D70 importPack\uFF0C\u4FDD\u7559 force \u4E0E revision \u7684\u539F\u6709\u6821\u9A8C\u3002\n * \u4E2D\u9014\u5931\u8D25\u65F6\uFF0C\u524D\u9762\u5DF2\u7ECF\u5B89\u88C5\u7684\u5305\u4FDD\u7559\uFF0C\u9519\u8BEF\u91CC\u5E26\u4E0A\u5DF2\u5BFC\u5165\u6570\u91CF\u3002\n */\nexport async function importPacks(filenames: string[], options: PackImportOptions = {}) {\n if (filenames.length === 1) {\n const only = filenames[0];\n if (!only) throw new Error(\"\u6CA1\u6709\u8981\u5BFC\u5165\u7684\u4E16\u754C\u5305\");\n return importPack(only, options);\n }\n const imported: string[] = [];\n for (const name of filenames) {\n try {\n await importPack(name);\n imported.push(name);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const code = (error as { code?: unknown }).code;\n throw Object.assign(new Error(imported.length ? `\u5DF2\u5BFC\u5165 ${imported.length} \u4E2A\uFF0C\u7EE7\u7EED\u5BFC\u5165 ${name} \u5931\u8D25\uFF1A${message}` : message), typeof code === \"string\" ? { code } : {});\n }\n }\n return { changed: true, restartRequired: true, imported: imported.length };\n}\n\n/** force \u5FC5\u987B\u7ED1\u5B9A\u7528\u6237\u770B\u8FC7\u7684\u5F52\u6863\u53CA\u5DF2\u6709\u5305\u7248\u672C\uFF0C\u6392\u961F\u671F\u95F4\u6709\u53D8\u5316\u65F6\u91CD\u65B0\u786E\u8BA4\u3002 */\nexport function importPack(filename: string, options: PackImportOptions = {}) {\n return inspectImport(filename, async (plan, install) => {\n if ((options.force && !options.revision) || (options.revision !== undefined && options.revision !== plan.revision)) {\n throw Object.assign(new Error(\"\u5BFC\u5165\u6587\u4EF6\u6216\u5DF2\u5B89\u88C5\u5305\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u5165\u5E76\u786E\u8BA4\"), { code: \"conflict\" });\n }\n const conflicts = plan.packs.filter(pack => pack.action === \"conflict\");\n if (conflicts.length && !options.force) {\n throw Object.assign(new Error(`\u4E16\u754C\u5305\u9700\u8981\u786E\u8BA4\u8986\u76D6\uFF1A${conflicts.map(pack => `${pack.name}\uFF08\u5DF2\u6709 ${pack.existing!.version}\uFF0C\u5BFC\u5165 ${pack.version}\uFF09`).join(\"\u3001\")}`), { code: \"conflict\", details: { conflicts } });\n }\n await install(options.force === true);\n return { changed: true, restartRequired: true };\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/management/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/management/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAA6C,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAO/H,OAAO,EAAE,SAAS,EAAgC,MAAM,YAAY,CAAC;AAsBrE,wBAAgB,eAAe,cAQ9B;AACD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,2BAA+E;AA4C3J,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuNrF"}
|
|
@@ -2,23 +2,24 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import { EventEmitter } from "node:events";
|
|
5
|
-
import { MANAGEMENT_PROTOCOL_VERSION } from "@sfmc-bds/management";
|
|
5
|
+
import { LOG_TAIL_MAX, MANAGEMENT_PROTOCOL_VERSION } from "@sfmc-bds/management";
|
|
6
6
|
import { readQqBindings } from "@sfmc-bds/db-server/qq-bindings";
|
|
7
7
|
import { ROOT, isRuntimeInitialized, spawnService } from "../runtime.js";
|
|
8
8
|
import { queryServicesRuntimeLocal, services, START_ORDER, SERVICE_NAMES, refreshServices, onServiceStateChange } from "../services.js";
|
|
9
|
-
import { readDiskLogs, onLog } from "../logs.js";
|
|
9
|
+
import { readDiskLogs, deleteStoredLogs, onLog } from "../logs.js";
|
|
10
10
|
import { cmdModuleEnable, cmdModuleDisable } from "../module-commands.js";
|
|
11
11
|
import { ensureCoreConfigs } from "@sfmc-bds/sdk/node/config";
|
|
12
12
|
import { TaskStore, atomicJson } from "./tasks.js";
|
|
13
13
|
import { configFiles, readDocument, revision, saveDocument, validateDocument } from "./config.js";
|
|
14
|
-
import { listModules, searchModules, identifier, runFetch, readJson, listPacks, togglePack,
|
|
15
|
-
import { attachmentPlan, platformVersion, withStoppedServices, launchPlatformUpdate, createBackup, restoreSnapshot, verifyRunning } from "./maintenance.js";
|
|
14
|
+
import { listModules, searchModules, identifier, runFetch, readJson, listPacks, togglePack, readPackIcon, uninstallPack, setPackVersion, playerFiles, savePlayerPermissions, modulePlan, applyModulePlan, moduleInstallBlock } from "./domain.js";
|
|
15
|
+
import { attachmentPlan, platformVersion, withStoppedServices, launchPlatformUpdate, createBackup, restoreSnapshot, deleteSnapshot, verifyRunning } from "./maintenance.js";
|
|
16
16
|
import { startupPlan } from "./startup.js";
|
|
17
17
|
import { cmdPackBuild, cmdPackDeploy } from "../pack-lifecycle.js";
|
|
18
18
|
import { withMaintenanceLock } from "@sfmc-bds/management/node";
|
|
19
19
|
import { deploymentPreflight, deploymentPort } from "./deployment.js";
|
|
20
20
|
import { resolveBdsContext } from "../pack-lifecycle.js";
|
|
21
21
|
import { readRuntimeMetrics } from "./metrics-read.js";
|
|
22
|
+
import { importPacks, planPackImport, readImportFilenames } from "./pack-import.js";
|
|
22
23
|
const events = new EventEmitter();
|
|
23
24
|
function deploymentInitialized() {
|
|
24
25
|
if (isRuntimeInitialized()) return true;
|
|
@@ -49,6 +50,12 @@ function string(value, label) {
|
|
|
49
50
|
if (typeof value !== "string" || value.length > 2 * 1024 * 1024) throw new Error(`\u975E\u6CD5 ${label}`);
|
|
50
51
|
return value;
|
|
51
52
|
}
|
|
53
|
+
function timeBound(value, label) {
|
|
54
|
+
if (value === void 0) return void 0;
|
|
55
|
+
const date = new Date(string(value, label));
|
|
56
|
+
if (Number.isNaN(date.getTime())) throw new Error(`\u975E\u6CD5 ${label}`);
|
|
57
|
+
return date;
|
|
58
|
+
}
|
|
52
59
|
function service(value) {
|
|
53
60
|
if (!SERVICE_NAMES.includes(value)) throw new Error("\u672A\u77E5\u670D\u52A1");
|
|
54
61
|
return value;
|
|
@@ -93,7 +100,7 @@ async function dispatchManagement(request) {
|
|
|
93
100
|
const store = managementTasks();
|
|
94
101
|
switch (request.method) {
|
|
95
102
|
case "handshake":
|
|
96
|
-
return { protocolVersion: MANAGEMENT_PROTOCOL_VERSION, platformVersion: platformVersion(), host: { os: process.platform === "win32" ? "windows" : process.platform, arch: process.arch, release: os.release() }, root: ROOT, capabilities: ["services", "logs", "modules", "config", "packs", "players", "updates", "operations", "metrics", "manual-restart", "manual-backup"], daemonPid: process.pid, daemonStartedAt: new Date(Date.now() - process.uptime() * 1e3).toISOString(), initialized: deploymentInitialized() };
|
|
103
|
+
return { protocolVersion: MANAGEMENT_PROTOCOL_VERSION, platformVersion: platformVersion(), host: { os: process.platform === "win32" ? "windows" : process.platform, arch: process.arch, release: os.release() }, root: ROOT, capabilities: ["services", "logs", "logs-range", "modules", "config", "packs", "players", "updates", "operations", "metrics", "manual-restart", "manual-backup", "pack-import-plan", "pack-icons", "pack-uninstall", "backup-delete", "pack-import-batch", "pack-version"], daemonPid: process.pid, daemonStartedAt: new Date(Date.now() - process.uptime() * 1e3).toISOString(), initialized: deploymentInitialized() };
|
|
97
104
|
case "events.subscribe":
|
|
98
105
|
return { subscribed: true };
|
|
99
106
|
case "services.list":
|
|
@@ -141,8 +148,32 @@ async function dispatchManagement(request) {
|
|
|
141
148
|
return { delivered: true };
|
|
142
149
|
});
|
|
143
150
|
}
|
|
144
|
-
case "logs.tail":
|
|
145
|
-
|
|
151
|
+
case "logs.tail": {
|
|
152
|
+
const since = timeBound(p.since, "\u5F00\u59CB\u65F6\u95F4");
|
|
153
|
+
const until = timeBound(p.until, "\u7ED3\u675F\u65F6\u95F4");
|
|
154
|
+
if (since && until && until < since) throw new Error("\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u5F00\u59CB\u65F6\u95F4");
|
|
155
|
+
const limit = Math.min(LOG_TAIL_MAX, Math.max(1, Number(p.limit) || 1e3));
|
|
156
|
+
const ranged = Boolean(since || until);
|
|
157
|
+
const entries = readDiskLogs({
|
|
158
|
+
...ranged ? {} : { limit },
|
|
159
|
+
...since ? { since } : {},
|
|
160
|
+
...until ? { until } : {},
|
|
161
|
+
...Array.isArray(p.sources) ? { sources: p.sources.map((value) => string(value, "\u65E5\u5FD7\u6765\u6E90")) } : {},
|
|
162
|
+
...Array.isArray(p.levels) ? { levels: p.levels } : {}
|
|
163
|
+
});
|
|
164
|
+
const truncated = entries.length > limit;
|
|
165
|
+
return { entries: (truncated ? entries.slice(entries.length - limit) : entries).map((log) => ({ ...log, time: log.time.toISOString() })), ...truncated ? { truncated: true } : {} };
|
|
166
|
+
}
|
|
167
|
+
case "logs.delete": {
|
|
168
|
+
const since = timeBound(p.since, "\u5F00\u59CB\u65F6\u95F4");
|
|
169
|
+
const until = timeBound(p.until, "\u7ED3\u675F\u65F6\u95F4");
|
|
170
|
+
if (!since || !until) throw new Error("\u5220\u9664\u65E5\u5FD7\u9700\u8981\u5F00\u59CB\u548C\u7ED3\u675F\u65F6\u95F4");
|
|
171
|
+
if (until < since) throw new Error("\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u5F00\u59CB\u65F6\u95F4");
|
|
172
|
+
const source = p.source === void 0 ? void 0 : string(p.source, "\u65E5\u5FD7\u6765\u6E90");
|
|
173
|
+
if (source !== void 0 && (source.length > 128 || /[\r\n]/.test(source))) throw new Error("\u975E\u6CD5\u65E5\u5FD7\u6765\u6E90");
|
|
174
|
+
const text = p.text === void 0 ? void 0 : string(p.text, "\u65E5\u5FD7\u6B63\u6587");
|
|
175
|
+
return deleteStoredLogs({ since, until, ...source === void 0 ? {} : { source }, ...text === void 0 ? {} : { text } });
|
|
176
|
+
}
|
|
146
177
|
case "operations.list":
|
|
147
178
|
return { operations: store.list().filter((row) => !Array.isArray(p.statuses) || p.statuses.includes(row.status)).slice(0, Math.min(Number(p.limit) || 100, 200)) };
|
|
148
179
|
case "operations.get":
|
|
@@ -155,6 +186,8 @@ async function dispatchManagement(request) {
|
|
|
155
186
|
const id = identifier(p.id);
|
|
156
187
|
const linked = (await listModules()).modules.find((row) => row.id === id || row.folder === id)?.linked;
|
|
157
188
|
if (linked) throw new Error("\u4FDD\u7559\u672C\u5730\u94FE\u63A5\u6A21\u5757\uFF0C\u4E0D\u901A\u8FC7\u5305\u5B89\u88C5\u6216\u5378\u8F7D\u8986\u76D6\u5F00\u53D1\u76EE\u5F55");
|
|
189
|
+
const block = await moduleInstallBlock(id);
|
|
190
|
+
if (block) throw new Error(block);
|
|
158
191
|
return store.submit(request.method, async (context) => {
|
|
159
192
|
context.phase("download", "\u4E0B\u8F7D\u5E76\u5B89\u88C5\u6A21\u5757\uFF0C\u670D\u52A1\u5668\u4FDD\u6301\u8FD0\u884C");
|
|
160
193
|
const args = ["install", id];
|
|
@@ -223,16 +256,35 @@ async function dispatchManagement(request) {
|
|
|
223
256
|
}
|
|
224
257
|
case "packs.list":
|
|
225
258
|
return listPacks();
|
|
226
|
-
case "packs.
|
|
259
|
+
case "packs.icon":
|
|
260
|
+
return readPackIcon(identifier(p.id));
|
|
261
|
+
case "packs.import.plan":
|
|
262
|
+
return planPackImport(identifier(p.filename));
|
|
263
|
+
case "packs.import": {
|
|
264
|
+
const names = readImportFilenames(p);
|
|
227
265
|
return store.submit(request.method, async (context) => {
|
|
228
|
-
context.phase("execute", "\u5BFC\u5165\u4E16\u754C\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS");
|
|
229
|
-
return
|
|
266
|
+
context.phase("execute", names.length > 1 ? `\u5BFC\u5165 ${names.length} \u4E2A\u4E16\u754C\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS` : "\u5BFC\u5165\u4E16\u754C\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS");
|
|
267
|
+
return importPacks(names, { force: p.force === true, ...p.revision === void 0 ? {} : { revision: string(p.revision, "\u5BFC\u5165\u8BA1\u5212\u7248\u672C") } });
|
|
230
268
|
});
|
|
269
|
+
}
|
|
231
270
|
case "packs.toggle":
|
|
232
271
|
return store.submit(request.method, async (context) => {
|
|
233
272
|
context.phase("execute", "\u4FDD\u5B58\u4E16\u754C\u5305\u72B6\u6001\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS");
|
|
234
273
|
return togglePack(identifier(p.id), p.enabled === true);
|
|
235
274
|
});
|
|
275
|
+
case "packs.uninstall":
|
|
276
|
+
return store.submit(request.method, async (context) => {
|
|
277
|
+
context.phase("execute", "\u5378\u8F7D\u4E16\u754C\u5305\u5E76\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS");
|
|
278
|
+
return uninstallPack(identifier(p.id));
|
|
279
|
+
});
|
|
280
|
+
case "packs.version": {
|
|
281
|
+
const id = identifier(p.id);
|
|
282
|
+
const version = p.version;
|
|
283
|
+
return store.submit(request.method, async (context) => {
|
|
284
|
+
context.phase("execute", "\u5199\u5165\u8D44\u6E90\u5305\u7248\u672C\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS");
|
|
285
|
+
return setPackVersion(id, version);
|
|
286
|
+
});
|
|
287
|
+
}
|
|
236
288
|
case "players.list":
|
|
237
289
|
return players();
|
|
238
290
|
case "metrics.read":
|
|
@@ -316,6 +368,11 @@ async function dispatchManagement(request) {
|
|
|
316
368
|
if (p.confirmDataLoss !== true) throw new Error("\u6062\u590D\u6570\u636E\u9700\u8981\u660E\u786E\u786E\u8BA4\u4E22\u5F03\u5907\u4EFD\u4E4B\u540E\u7684\u53D8\u66F4");
|
|
317
369
|
return store.submit(request.method, (context) => withStoppedServices(context, [...START_ORDER], () => restoreSnapshot(identifier(p.id), context.phase)));
|
|
318
370
|
}
|
|
371
|
+
case "backups.delete":
|
|
372
|
+
return store.submit(request.method, async (context) => {
|
|
373
|
+
context.phase("execute", "\u5220\u9664\u5907\u4EFD\u76EE\u5F55");
|
|
374
|
+
return deleteSnapshot(identifier(p.id));
|
|
375
|
+
});
|
|
319
376
|
case "startup.plan":
|
|
320
377
|
return startupPlan();
|
|
321
378
|
default:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/management/server.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { EventEmitter } from \"node:events\";\nimport { MANAGEMENT_PROTOCOL_VERSION, type ManagementRequest, type ManagementEvent } from \"@sfmc-bds/management\";\nimport { readQqBindings } from \"@sfmc-bds/db-server/qq-bindings\";\nimport { ROOT, isRuntimeInitialized, spawnService } from \"../runtime.js\";\nimport { queryServicesRuntimeLocal, services, START_ORDER, SERVICE_NAMES, refreshServices, onServiceStateChange, type ServiceName } from \"../services.js\";\nimport { readDiskLogs, onLog } from \"../logs.js\";\nimport { cmdModuleEnable, cmdModuleDisable } from \"../module-commands.js\";\nimport { ensureCoreConfigs } from \"@sfmc-bds/sdk/node/config\";\nimport { TaskStore, atomicJson, type TaskContext } from \"./tasks.js\";\nimport { configFiles, readDocument, revision, saveDocument, validateDocument } from \"./config.js\";\nimport { listModules, searchModules, identifier, runFetch, readJson, listPacks, togglePack, importPack, playerFiles, savePlayerPermissions, modulePlan, applyModulePlan } from \"./domain.js\";\nimport { attachmentPlan, platformVersion, withStoppedServices, launchPlatformUpdate, createBackup, restoreSnapshot, verifyRunning } from \"./maintenance.js\";\nimport { startupPlan } from \"./startup.js\";\nimport { cmdPackBuild, cmdPackDeploy } from \"../pack-lifecycle.js\";\nimport { withMaintenanceLock } from \"@sfmc-bds/management/node\";\nimport { deploymentPreflight, deploymentPort } from \"./deployment.js\";\nimport { resolveBdsContext } from \"../pack-lifecycle.js\";\nimport { readRuntimeMetrics } from \"./metrics-read.js\";\n\nconst events = new EventEmitter();\n/** \u7A7A\u76EE\u5F55\u4E5F\u8981\u80FD\u5B8C\u6210\u63E1\u624B\uFF0C\u4F9B\u684C\u9762\u521D\u59CB\u5316\u5411\u5BFC\u7EE7\u7EED\uFF1B\u65E7\u90E8\u7F72\u4ECD\u8BC6\u522B\u5DF2\u6709 BDS\u3002 */\nfunction deploymentInitialized(): boolean {\n if (isRuntimeInitialized()) return true;\n const config = readJson<{ bds_path?: string }>(path.join(ROOT, \"configs\", \"bds_updater.json\"), {});\n if (!config.bds_path) return false;\n return fs.existsSync(path.join(resolveBdsContext().bdsRoot, process.platform === \"win32\" ? \"bedrock_server.exe\" : \"bedrock_server\"));\n}\nlet tasks: TaskStore | undefined;\nexport function managementTasks() {\n if (!tasks) {\n tasks = new TaskStore(ROOT);\n tasks.on(\"operation\", payload => events.emit(\"event\", { type: \"event\", event: \"operation\", instanceId: ROOT, payload }));\n onLog(log => events.emit(\"event\", { type: \"event\", event: \"log\", instanceId: ROOT, payload: { ...log, time: log.time.toISOString() } }));\n onServiceStateChange(payload => events.emit(\"event\", { type: \"event\", event: \"serviceState\", instanceId: ROOT, payload }));\n }\n return tasks;\n}\nexport function onManagementEvent(callback: (event: ManagementEvent) => void) { events.on(\"event\", callback); return () => events.off(\"event\", callback); }\nfunction params(request: ManagementRequest): Record<string, unknown> {\n if (request.params === undefined) return {};\n if (!request.params || typeof request.params !== \"object\" || Array.isArray(request.params)) throw new Error(\"\u53C2\u6570\u5FC5\u987B\u4E3A\u5BF9\u8C61\");\n return request.params as Record<string, unknown>;\n}\nfunction string(value: unknown, label: string) { if (typeof value !== \"string\" || value.length > 2 * 1024 * 1024) throw new Error(`\u975E\u6CD5 ${label}`); return value; }\nfunction service(value: unknown): ServiceName { if (!SERVICE_NAMES.includes(value as ServiceName)) throw new Error(\"\u672A\u77E5\u670D\u52A1\"); return value as ServiceName; }\nasync function rebuildModules() {\n const build = await cmdPackBuild([]); if (!build.ok) throw new Error(build.message);\n const deploy = await cmdPackDeploy([]); if (!deploy.ok) throw new Error(deploy.message);\n return { changed: true };\n}\n\nasync function players() {\n const files = playerFiles(); const allowlist = readJson<unknown[]>(files.allowlist, []);\n const cfg = readJson<{ db_port?: number; http_auth?: string; dbDir?: string }>(path.join(ROOT, \"configs\", \"db_config.json\"), {});\n const database = path.resolve(ROOT, typeof cfg.dbDir === \"string\" && cfg.dbDir.trim() ? cfg.dbDir : \"data/sfmc_data.db\");\n let data: { online?: { name: string }[]; updatedAt?: number } = {};\n try {\n const response = await fetch(`http://127.0.0.1:${cfg.db_port ?? 3001}/api/sfmc/status`, { headers: cfg.http_auth ? { authorization: `Bearer ${cfg.http_auth}` } : {}, signal: AbortSignal.timeout(5000) });\n if (response.ok) data = await response.json() as typeof data;\n } catch { /* \u672A\u8FDE\u63A5\u65F6\u4F7F\u7528\u672A\u77E5\u72B6\u6001 */ }\n const fresh = typeof data.updatedAt === \"number\" && Date.now() - data.updatedAt < 60_000;\n return { players: (data.online ?? []).map(row => ({ name: row.name, xuid: \"\", online: fresh ? true : null })), updatedAt: data.updatedAt ? new Date(data.updatedAt).toISOString() : \"\", fresh, allowlist, permissions: readJson<unknown[]>(files.permissions, []), sfmcPermissions: readJson<unknown[]>(files.sfmcPermissions, []), bindings: readQqBindings(database) };\n}\nasync function bdsUpdate(context: TaskContext, checkOnly = false) {\n context.phase(\"download\", checkOnly ? \"\u68C0\u67E5 BDS \u66F4\u65B0\" : \"\u66F4\u65B0 BDS\");\n const args = checkOnly ? [\"--check-only\", \"--no-notify\"] : [\"--no-start\", \"--no-notify\"];\n let output = \"\";\n await new Promise<void>((resolve, reject) => {\n const child = spawnService(\"update\", args, { stdio: \"pipe\", cwd: ROOT });\n for (const stream of [child.stdout, child.stderr]) stream?.on(\"data\", chunk => { output = (output + String(chunk)).slice(-64_000); });\n child.on(\"error\", reject); child.on(\"close\", code => code === 0 ? resolve() : reject(new Error(`BDS \u66F4\u65B0\u5931\u8D25 (${code})`)));\n });\n return { checked: checkOnly, updated: /SFMC_UPDATE_RESULT=deployed/.test(output), currentVersion: /CURRENT=([^\\r\\n]+)/.exec(output)?.[1] ?? \"unknown\", latestVersion: /LATEST=([^\\r\\n]+)/.exec(output)?.[1] ?? \"unknown\", result: /SFMC_UPDATE_RESULT=([^\\r\\n]+)/.exec(output)?.[1] ?? \"unknown\" };\n}\nexport async function dispatchManagement(request: ManagementRequest): Promise<unknown> {\n const p = params(request); const store = managementTasks();\n switch (request.method) {\n case \"handshake\": return { protocolVersion: MANAGEMENT_PROTOCOL_VERSION, platformVersion: platformVersion(), host: { os: process.platform === \"win32\" ? \"windows\" : process.platform, arch: process.arch, release: os.release() }, root: ROOT, capabilities: [\"services\", \"logs\", \"modules\", \"config\", \"packs\", \"players\", \"updates\", \"operations\", \"metrics\", \"manual-restart\", \"manual-backup\"], daemonPid: process.pid, daemonStartedAt: new Date(Date.now() - process.uptime() * 1000).toISOString(), initialized: deploymentInitialized() };\n case \"events.subscribe\": return { subscribed: true };\n case \"services.list\": return { rows: await queryServicesRuntimeLocal() };\n case \"services.start\": case \"services.stop\": case \"services.restart\": {\n const requestedNames = p.name === \"all\" ? [...START_ORDER] : [service(p.name)];\n const reloadConfig = p.reloadConfig === true;\n if (reloadConfig && (p.name !== \"all\" || request.method !== \"services.restart\")) throw new Error(\"\u91CD\u65B0\u8BFB\u53D6\u914D\u7F6E\u9700\u8981\u91CD\u542F\u5168\u90E8\u670D\u52A1\");\n return store.submit(request.method, async context => {\n context.phase(\"execute\");\n const rows = await queryServicesRuntimeLocal();\n const names = p.runningOnly === true\n ? requestedNames.filter(name => rows.some(row => row.name === name && row.running))\n : requestedNames;\n if (rows.some(row => names.includes(row.name) && row.running && row.ownership === \"external\") && request.method !== \"services.start\") throw new Error(\"\u5916\u90E8\u8FDB\u7A0B\u65E0\u6CD5\u5B89\u5168\u505C\u6B62\uFF0C\u8BF7\u901A\u8FC7\u539F\u7BA1\u7406\u5668\u64CD\u4F5C\");\n if (request.method !== \"services.start\") for (const name of [...names].reverse()) await services[name].stop(false, false);\n if (reloadConfig) {\n const after = await queryServicesRuntimeLocal();\n if (after.some(row => requestedNames.includes(row.name) && row.running)) throw new Error(\"\u670D\u52A1\u672A\u5B8C\u5168\u9000\u51FA\uFF0C\u5DF2\u4E2D\u6B62\u914D\u7F6E\u5237\u65B0\");\n refreshServices();\n }\n if (request.method !== \"services.stop\") {\n if (!reloadConfig) {\n const after = await queryServicesRuntimeLocal();\n if (request.method === \"services.restart\" && after.some(row => names.includes(row.name) && row.running)) throw new Error(\"\u670D\u52A1\u672A\u5B8C\u5168\u9000\u51FA\uFF0C\u5DF2\u4E2D\u6B62\u91CD\u542F\");\n const stopped = names.filter(name => !after.some(row => row.name === name && row.running));\n if (stopped.length) refreshServices(stopped);\n }\n const outcomes = [];\n for (const name of names) outcomes.push({ name, ...(await services[name].start()) });\n await verifyRunning(outcomes.filter(row => row.status !== \"skipped\").map(row => row.name));\n return { outcomes };\n }\n return { stopped: names };\n });\n }\n case \"services.send\": {\n const name = service(p.name); const message = string(p.message, \"\u547D\u4EE4\");\n if (/[\\r\\n]/.test(message) || !message.trim()) throw new Error(\"\u4E00\u6B21\u53EA\u80FD\u53D1\u9001\u4E00\u884C\u547D\u4EE4\");\n const target = services[name]; if (!target.proc?.stdin || !target.running) throw new Error(\"\u670D\u52A1\u672A\u6258\u7BA1\u6216\u6CA1\u6709\u547D\u4EE4\u8F93\u5165\u901A\u9053\");\n return withMaintenanceLock(ROOT, async () => { target.proc!.stdin!.write(message + \"\\n\"); return { delivered: true }; });\n }\n case \"logs.tail\": return { entries: readDiskLogs({ limit: Math.min(5000, Math.max(1, Number(p.limit) || 1000)), ...(Array.isArray(p.sources) ? { sources: p.sources.map(value => string(value, \"\u65E5\u5FD7\u6765\u6E90\")) } : {}), ...(Array.isArray(p.levels) ? { levels: p.levels as (\"info\" | \"warn\" | \"error\")[] } : {}) }).map(log => ({ ...log, time: log.time.toISOString() })) };\n case \"operations.list\": return { operations: store.list().filter(row => !Array.isArray(p.statuses) || p.statuses.includes(row.status)).slice(0, Math.min(Number(p.limit) || 100, 200)) };\n case \"operations.get\": return { operation: store.get(string(p.operationId, \"\u4EFB\u52A1\u7F16\u53F7\")) };\n case \"modules.list\": return listModules();\n case \"modules.search\": return searchModules(typeof p.query === \"string\" ? p.query : \"\");\n case \"modules.install\": {\n const id = identifier(p.id);\n const linked = (await listModules()).modules.find(row => row.id === id || row.folder === id)?.linked;\n if (linked) throw new Error(\"\u4FDD\u7559\u672C\u5730\u94FE\u63A5\u6A21\u5757\uFF0C\u4E0D\u901A\u8FC7\u5305\u5B89\u88C5\u6216\u5378\u8F7D\u8986\u76D6\u5F00\u53D1\u76EE\u5F55\");\n return store.submit(request.method, async context => {\n context.phase(\"download\", \"\u4E0B\u8F7D\u5E76\u5B89\u88C5\u6A21\u5757\uFF0C\u670D\u52A1\u5668\u4FDD\u6301\u8FD0\u884C\");\n const args = [\"install\", id];\n if (typeof p.source === \"string\" && p.source) args.push(\"--from\", p.source);\n await runFetch(args);\n context.phase(\"execute\", \"\u91CD\u5EFA\u884C\u4E3A\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return { ...(await rebuildModules()), restartRequired: true };\n });\n }\n case \"modules.uninstall\": case \"modules.toggle\": {\n const id = identifier(p.id);\n if (request.method !== \"modules.toggle\") {\n const linked = (await listModules()).modules.find(row => row.id === id || row.folder === id)?.linked;\n if (linked) throw new Error(\"\u4FDD\u7559\u672C\u5730\u94FE\u63A5\u6A21\u5757\uFF0C\u4E0D\u901A\u8FC7\u5305\u5B89\u88C5\u6216\u5378\u8F7D\u8986\u76D6\u5F00\u53D1\u76EE\u5F55\");\n }\n return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u66F4\u65B0\u6A21\u5757\u5E76\u91CD\u5EFA\u884C\u4E3A\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n if (request.method === \"modules.toggle\") {\n const result = await (p.enabled === true ? cmdModuleEnable([id]) : cmdModuleDisable([id])); if (!result.ok) throw new Error(result.message);\n } else {\n await runFetch([\"uninstall\", id]);\n }\n return { ...(await rebuildModules()), restartRequired: true };\n });\n }\n case \"config.list\": return { keys: [...configFiles().keys()] };\n case \"config.read\": return readDocument(string(p.key, \"\u914D\u7F6E\u540D\u79F0\"));\n case \"config.save\": {\n const key = string(p.key, \"\u914D\u7F6E\u540D\u79F0\"); const text = string(p.text, \"\u914D\u7F6E\u5185\u5BB9\"); const expected = string(p.revision, \"\u914D\u7F6E\u7248\u672C\");\n const document = readDocument(key); validateDocument(document, text);\n if (document.revision !== expected) throw Object.assign(new Error(\"\u914D\u7F6E\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\"), { code: \"conflict\" });\n return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u4FDD\u5B58\u914D\u7F6E\u6587\u4EF6\uFF0C\u4E0D\u91CD\u542F\u670D\u52A1\");\n saveDocument(key, expected, text);\n return { saved: true, revision: revision(text), restartRequired: true };\n });\n }\n case \"config.apply\": {\n const key = string(p.key, \"\u914D\u7F6E\u540D\u79F0\"); const text = string(p.text, \"\u914D\u7F6E\u5185\u5BB9\"); const expected = string(p.revision, \"\u914D\u7F6E\u7248\u672C\");\n const document = readDocument(key); validateDocument(document, text);\n if (document.revision !== expected) throw Object.assign(new Error(\"\u914D\u7F6E\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\"), { code: \"conflict\" });\n return store.submit(request.method, async context => {\n let saved = false;\n try { return await withStoppedServices(context, [...START_ORDER], async () => {\n saveDocument(key, expected, text); context.phase(\"apply\", \"\u6587\u4EF6\u5DF2\u4FDD\u5B58\uFF0C\u6B63\u5728\u5E94\u7528\u8FD0\u884C\u914D\u7F6E\");\n saved = true;\n refreshServices(); return { saved: true, revision: readDocument(key).revision, applied: true };\n }); } catch (error) { throw Object.assign(new Error(`${saved ? \"\u6587\u4EF6\u5DF2\u4FDD\u5B58\uFF0C\u8FD0\u884C\u65F6\u5E94\u7528\u5931\u8D25\" : \"\u914D\u7F6E\u672A\u4FDD\u5B58\"}: ${error instanceof Error ? error.message : String(error)}`), { code: \"io\", details: { saved, applied: false } }); }\n });\n }\n case \"packs.list\": return listPacks();\n case \"packs.import\": return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u5BFC\u5165\u4E16\u754C\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return importPack(identifier(p.filename));\n });\n case \"packs.toggle\": return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u4FDD\u5B58\u4E16\u754C\u5305\u72B6\u6001\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return togglePack(identifier(p.id), p.enabled === true);\n });\n case \"players.list\": return players();\n case \"metrics.read\": return readRuntimeMetrics(request.params);\n case \"players.apply\": return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], async () => savePlayerPermissions(string(p.kind, \"\u6743\u9650\u7C7B\u578B\"), p.entries)));\n case \"attachment.plan\": return attachmentPlan();\n case \"attachment.apply\": return store.submit(request.method, async context => {\n const plan = await attachmentPlan(false);\n if (p.targetVersion !== undefined && p.targetVersion !== plan.targetVersion) throw Object.assign(new Error(\"\u76EE\u6807\u7248\u672C\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0\u65E5\u5FD7\u540E\u786E\u8BA4\"), { code: \"conflict\" });\n if (plan.externalServices.length) throw new Error(\"\u65E0\u6CD5\u53EF\u9760\u8FC1\u79FB\u5916\u90E8\u8FDB\u7A0B\uFF1B\u8BF7\u5148\u901A\u8FC7\u539F\u7BA1\u7406\u5668\u4F18\u96C5\u505C\u670D\");\n if (plan.upgradeRequired) return launchPlatformUpdate(store, context, plan.targetVersion);\n return { attached: true, version: plan.currentVersion, development: plan.development };\n });\n case \"updates.check\": {\n const results = await Promise.allSettled([attachmentPlan(), modulePlan(), bdsUpdate({ id: \"check\", phase: () => {} }, true)]);\n return Object.fromEntries(results.map((result, index) => [[\"platform\", \"modules\", \"bds\"][index], result.status === \"fulfilled\" ? result.value : { error: String(result.reason) }]));\n }\n case \"updates.run\": {\n if (p.kind === \"platform\") return store.submit(request.method, async context => { const plan = await attachmentPlan(false); if (p.targetVersion !== undefined && p.targetVersion !== plan.targetVersion) throw Object.assign(new Error(\"\u76EE\u6807\u7248\u672C\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0\u65E5\u5FD7\u540E\u786E\u8BA4\"), { code: \"conflict\" }); return plan.upgradeRequired ? launchPlatformUpdate(store, context, plan.targetVersion) : { upToDate: true, version: plan.currentVersion }; });\n if (p.kind === \"modules\") return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], async () => { const result = await applyModulePlan(Array.isArray(p.ids) ? p.ids.map(identifier) : []); await rebuildModules(); return result; }));\n if (p.kind === \"bds\") return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], () => bdsUpdate(context)));\n throw new Error(\"\u672A\u77E5\u66F4\u65B0\u7C7B\u578B\");\n }\n case \"deployment.create\": {\n if (p.acceptEula !== true) throw new Error(\"\u521B\u5EFA\u90E8\u7F72\u524D\u5FC5\u987B\u786E\u8BA4 BDS \u4F7F\u7528\u6761\u6B3E\");\n return store.submit(request.method, async context => {\n if (isRuntimeInitialized()) throw new Error(\"\u76EE\u5F55\u5DF2\u7ECF\u521D\u59CB\u5316\uFF0C\u4E0D\u8986\u76D6\u5DF2\u6709\u90E8\u7F72\");\n const ports = { db: deploymentPort(p.dbPort, 3001), bds: deploymentPort(p.bdsPort, 19132), bds6: deploymentPort(p.bdsPort6, 19133) };\n context.phase(\"preflight\", \"\u68C0\u67E5\u76EE\u5F55\u3001\u78C1\u76D8\u7A7A\u95F4\u548C TCP\uFF0FUDP \u7AEF\u53E3\"); await deploymentPreflight(ports);\n context.phase(\"prepare\"); ensureCoreConfigs(ROOT, [\"db_config\", \"qq_config\", \"bds_updater\", \"permissions\", \"qq_link\"]);\n const updater = path.join(ROOT, \"configs\", \"bds_updater.json\");\n atomicJson(updater, { ...readJson(updater, {}), bds_path: \"BDS\", backup_dir: \"backups\" });\n const dbFile = path.join(ROOT, \"configs\", \"db_config.json\"); atomicJson(dbFile, { ...readJson(dbFile, {}), db_port: ports.db });\n fs.mkdirSync(path.join(ROOT, \"modules\", \"packages\"), { recursive: true });\n await bdsUpdate(context);\n const properties = path.join(ROOT, \"BDS\", \"server.properties\");\n let text = fs.readFileSync(properties, \"utf8\");\n for (const [key, port] of [[\"server-port\", ports.bds], [\"server-portv6\", ports.bds6]] as const) text = text.replace(new RegExp(`^${key}=.*$`, \"m\"), `${key}=${port}`);\n fs.writeFileSync(properties, text);\n await rebuildModules();\n refreshServices(); context.phase(\"start\");\n const started: ServiceName[] = [];\n try { for (const name of START_ORDER) { const result = await services[name].start(); if (result.status !== \"skipped\") started.push(name); } await verifyRunning(started); }\n catch (error) { for (const name of [...START_ORDER].reverse()) await services[name].stop(false, false).catch(() => {}); throw error; }\n atomicJson(path.join(ROOT, \"configs\", \"runtime.json\"), { ...readJson(path.join(ROOT, \"configs\", \"runtime.json\"), {}), initialized_at: new Date().toISOString() });\n return { created: true, rows: await queryServicesRuntimeLocal() };\n });\n }\n case \"backups.list\": { const directory = path.join(ROOT, \".sfmc\", \"backups\"); return { backups: fs.existsSync(directory) ? fs.readdirSync(directory).filter(id => fs.existsSync(path.join(directory, id, \"manifest.json\"))) : [] }; }\n case \"backups.create\": return store.submit(request.method, context => createBackup(context));\n case \"backups.restore\": {\n if (p.confirmDataLoss !== true) throw new Error(\"\u6062\u590D\u6570\u636E\u9700\u8981\u660E\u786E\u786E\u8BA4\u4E22\u5F03\u5907\u4EFD\u4E4B\u540E\u7684\u53D8\u66F4\");\n return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], () => restoreSnapshot(identifier(p.id), context.phase)));\n }\n case \"startup.plan\": return startupPlan();\n default: throw Object.assign(new Error(`\u4E0D\u652F\u6301\u7684\u7BA1\u7406\u65B9\u6CD5: ${request.method}`), { code: \"unsupported\" });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { EventEmitter } from \"node:events\";\nimport { LOG_TAIL_MAX, MANAGEMENT_PROTOCOL_VERSION, type ManagementRequest, type ManagementEvent } from \"@sfmc-bds/management\";\nimport { readQqBindings } from \"@sfmc-bds/db-server/qq-bindings\";\nimport { ROOT, isRuntimeInitialized, spawnService } from \"../runtime.js\";\nimport { queryServicesRuntimeLocal, services, START_ORDER, SERVICE_NAMES, refreshServices, onServiceStateChange, type ServiceName } from \"../services.js\";\nimport { readDiskLogs, deleteStoredLogs, onLog } from \"../logs.js\";\nimport { cmdModuleEnable, cmdModuleDisable } from \"../module-commands.js\";\nimport { ensureCoreConfigs } from \"@sfmc-bds/sdk/node/config\";\nimport { TaskStore, atomicJson, type TaskContext } from \"./tasks.js\";\nimport { configFiles, readDocument, revision, saveDocument, validateDocument } from \"./config.js\";\nimport { listModules, searchModules, identifier, runFetch, readJson, listPacks, togglePack, readPackIcon, uninstallPack, setPackVersion, playerFiles, savePlayerPermissions, modulePlan, applyModulePlan, moduleInstallBlock } from \"./domain.js\";\nimport { attachmentPlan, platformVersion, withStoppedServices, launchPlatformUpdate, createBackup, restoreSnapshot, deleteSnapshot, verifyRunning } from \"./maintenance.js\";\nimport { startupPlan } from \"./startup.js\";\nimport { cmdPackBuild, cmdPackDeploy } from \"../pack-lifecycle.js\";\nimport { withMaintenanceLock } from \"@sfmc-bds/management/node\";\nimport { deploymentPreflight, deploymentPort } from \"./deployment.js\";\nimport { resolveBdsContext } from \"../pack-lifecycle.js\";\nimport { readRuntimeMetrics } from \"./metrics-read.js\";\n\nimport { importPacks, planPackImport, readImportFilenames } from \"./pack-import.js\";\n\nconst events = new EventEmitter();\n/** \u7A7A\u76EE\u5F55\u4E5F\u8981\u80FD\u5B8C\u6210\u63E1\u624B\uFF0C\u4F9B\u684C\u9762\u521D\u59CB\u5316\u5411\u5BFC\u7EE7\u7EED\uFF1B\u65E7\u90E8\u7F72\u4ECD\u8BC6\u522B\u5DF2\u6709 BDS\u3002 */\nfunction deploymentInitialized(): boolean {\n if (isRuntimeInitialized()) return true;\n const config = readJson<{ bds_path?: string }>(path.join(ROOT, \"configs\", \"bds_updater.json\"), {});\n if (!config.bds_path) return false;\n return fs.existsSync(path.join(resolveBdsContext().bdsRoot, process.platform === \"win32\" ? \"bedrock_server.exe\" : \"bedrock_server\"));\n}\nlet tasks: TaskStore | undefined;\nexport function managementTasks() {\n if (!tasks) {\n tasks = new TaskStore(ROOT);\n tasks.on(\"operation\", payload => events.emit(\"event\", { type: \"event\", event: \"operation\", instanceId: ROOT, payload }));\n onLog(log => events.emit(\"event\", { type: \"event\", event: \"log\", instanceId: ROOT, payload: { ...log, time: log.time.toISOString() } }));\n onServiceStateChange(payload => events.emit(\"event\", { type: \"event\", event: \"serviceState\", instanceId: ROOT, payload }));\n }\n return tasks;\n}\nexport function onManagementEvent(callback: (event: ManagementEvent) => void) { events.on(\"event\", callback); return () => events.off(\"event\", callback); }\nfunction params(request: ManagementRequest): Record<string, unknown> {\n if (request.params === undefined) return {};\n if (!request.params || typeof request.params !== \"object\" || Array.isArray(request.params)) throw new Error(\"\u53C2\u6570\u5FC5\u987B\u4E3A\u5BF9\u8C61\");\n return request.params as Record<string, unknown>;\n}\nfunction string(value: unknown, label: string) { if (typeof value !== \"string\" || value.length > 2 * 1024 * 1024) throw new Error(`\u975E\u6CD5 ${label}`); return value; }\n/** \u89E3\u6790\u65E5\u5FD7\u67E5\u8BE2\u7528\u7684 ISO \u65F6\u95F4\u3002\u7F3A\u7701\u8FD4\u56DE undefined\u3002 */\nfunction timeBound(value: unknown, label: string): Date | undefined {\n if (value === undefined) return undefined;\n const date = new Date(string(value, label));\n if (Number.isNaN(date.getTime())) throw new Error(`\u975E\u6CD5 ${label}`);\n return date;\n}\nfunction service(value: unknown): ServiceName { if (!SERVICE_NAMES.includes(value as ServiceName)) throw new Error(\"\u672A\u77E5\u670D\u52A1\"); return value as ServiceName; }\nasync function rebuildModules() {\n const build = await cmdPackBuild([]); if (!build.ok) throw new Error(build.message);\n const deploy = await cmdPackDeploy([]); if (!deploy.ok) throw new Error(deploy.message);\n return { changed: true };\n}\n\nasync function players() {\n const files = playerFiles(); const allowlist = readJson<unknown[]>(files.allowlist, []);\n const cfg = readJson<{ db_port?: number; http_auth?: string; dbDir?: string }>(path.join(ROOT, \"configs\", \"db_config.json\"), {});\n const database = path.resolve(ROOT, typeof cfg.dbDir === \"string\" && cfg.dbDir.trim() ? cfg.dbDir : \"data/sfmc_data.db\");\n let data: { online?: { name: string }[]; updatedAt?: number } = {};\n try {\n const response = await fetch(`http://127.0.0.1:${cfg.db_port ?? 3001}/api/sfmc/status`, { headers: cfg.http_auth ? { authorization: `Bearer ${cfg.http_auth}` } : {}, signal: AbortSignal.timeout(5000) });\n if (response.ok) data = await response.json() as typeof data;\n } catch { /* \u672A\u8FDE\u63A5\u65F6\u4F7F\u7528\u672A\u77E5\u72B6\u6001 */ }\n const fresh = typeof data.updatedAt === \"number\" && Date.now() - data.updatedAt < 60_000;\n return { players: (data.online ?? []).map(row => ({ name: row.name, xuid: \"\", online: fresh ? true : null })), updatedAt: data.updatedAt ? new Date(data.updatedAt).toISOString() : \"\", fresh, allowlist, permissions: readJson<unknown[]>(files.permissions, []), sfmcPermissions: readJson<unknown[]>(files.sfmcPermissions, []), bindings: readQqBindings(database) };\n}\nasync function bdsUpdate(context: TaskContext, checkOnly = false) {\n context.phase(\"download\", checkOnly ? \"\u68C0\u67E5 BDS \u66F4\u65B0\" : \"\u66F4\u65B0 BDS\");\n const args = checkOnly ? [\"--check-only\", \"--no-notify\"] : [\"--no-start\", \"--no-notify\"];\n let output = \"\";\n await new Promise<void>((resolve, reject) => {\n const child = spawnService(\"update\", args, { stdio: \"pipe\", cwd: ROOT });\n for (const stream of [child.stdout, child.stderr]) stream?.on(\"data\", chunk => { output = (output + String(chunk)).slice(-64_000); });\n child.on(\"error\", reject); child.on(\"close\", code => code === 0 ? resolve() : reject(new Error(`BDS \u66F4\u65B0\u5931\u8D25 (${code})`)));\n });\n return { checked: checkOnly, updated: /SFMC_UPDATE_RESULT=deployed/.test(output), currentVersion: /CURRENT=([^\\r\\n]+)/.exec(output)?.[1] ?? \"unknown\", latestVersion: /LATEST=([^\\r\\n]+)/.exec(output)?.[1] ?? \"unknown\", result: /SFMC_UPDATE_RESULT=([^\\r\\n]+)/.exec(output)?.[1] ?? \"unknown\" };\n}\nexport async function dispatchManagement(request: ManagementRequest): Promise<unknown> {\n const p = params(request); const store = managementTasks();\n switch (request.method) {\n case \"handshake\": return { protocolVersion: MANAGEMENT_PROTOCOL_VERSION, platformVersion: platformVersion(), host: { os: process.platform === \"win32\" ? \"windows\" : process.platform, arch: process.arch, release: os.release() }, root: ROOT, capabilities: [\"services\", \"logs\", \"logs-range\", \"modules\", \"config\", \"packs\", \"players\", \"updates\", \"operations\", \"metrics\", \"manual-restart\", \"manual-backup\", \"pack-import-plan\", \"pack-icons\", \"pack-uninstall\", \"backup-delete\", \"pack-import-batch\", \"pack-version\"], daemonPid: process.pid, daemonStartedAt: new Date(Date.now() - process.uptime() * 1000).toISOString(), initialized: deploymentInitialized() };\n case \"events.subscribe\": return { subscribed: true };\n case \"services.list\": return { rows: await queryServicesRuntimeLocal() };\n case \"services.start\": case \"services.stop\": case \"services.restart\": {\n const requestedNames = p.name === \"all\" ? [...START_ORDER] : [service(p.name)];\n const reloadConfig = p.reloadConfig === true;\n if (reloadConfig && (p.name !== \"all\" || request.method !== \"services.restart\")) throw new Error(\"\u91CD\u65B0\u8BFB\u53D6\u914D\u7F6E\u9700\u8981\u91CD\u542F\u5168\u90E8\u670D\u52A1\");\n return store.submit(request.method, async context => {\n context.phase(\"execute\");\n const rows = await queryServicesRuntimeLocal();\n const names = p.runningOnly === true\n ? requestedNames.filter(name => rows.some(row => row.name === name && row.running))\n : requestedNames;\n if (rows.some(row => names.includes(row.name) && row.running && row.ownership === \"external\") && request.method !== \"services.start\") throw new Error(\"\u5916\u90E8\u8FDB\u7A0B\u65E0\u6CD5\u5B89\u5168\u505C\u6B62\uFF0C\u8BF7\u901A\u8FC7\u539F\u7BA1\u7406\u5668\u64CD\u4F5C\");\n if (request.method !== \"services.start\") for (const name of [...names].reverse()) await services[name].stop(false, false);\n if (reloadConfig) {\n const after = await queryServicesRuntimeLocal();\n if (after.some(row => requestedNames.includes(row.name) && row.running)) throw new Error(\"\u670D\u52A1\u672A\u5B8C\u5168\u9000\u51FA\uFF0C\u5DF2\u4E2D\u6B62\u914D\u7F6E\u5237\u65B0\");\n refreshServices();\n }\n if (request.method !== \"services.stop\") {\n if (!reloadConfig) {\n const after = await queryServicesRuntimeLocal();\n if (request.method === \"services.restart\" && after.some(row => names.includes(row.name) && row.running)) throw new Error(\"\u670D\u52A1\u672A\u5B8C\u5168\u9000\u51FA\uFF0C\u5DF2\u4E2D\u6B62\u91CD\u542F\");\n const stopped = names.filter(name => !after.some(row => row.name === name && row.running));\n if (stopped.length) refreshServices(stopped);\n }\n const outcomes = [];\n for (const name of names) outcomes.push({ name, ...(await services[name].start()) });\n await verifyRunning(outcomes.filter(row => row.status !== \"skipped\").map(row => row.name));\n return { outcomes };\n }\n return { stopped: names };\n });\n }\n case \"services.send\": {\n const name = service(p.name); const message = string(p.message, \"\u547D\u4EE4\");\n if (/[\\r\\n]/.test(message) || !message.trim()) throw new Error(\"\u4E00\u6B21\u53EA\u80FD\u53D1\u9001\u4E00\u884C\u547D\u4EE4\");\n const target = services[name]; if (!target.proc?.stdin || !target.running) throw new Error(\"\u670D\u52A1\u672A\u6258\u7BA1\u6216\u6CA1\u6709\u547D\u4EE4\u8F93\u5165\u901A\u9053\");\n return withMaintenanceLock(ROOT, async () => { target.proc!.stdin!.write(message + \"\\n\"); return { delivered: true }; });\n }\n case \"logs.tail\": {\n const since = timeBound(p.since, \"\u5F00\u59CB\u65F6\u95F4\");\n const until = timeBound(p.until, \"\u7ED3\u675F\u65F6\u95F4\");\n if (since && until && until < since) throw new Error(\"\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u5F00\u59CB\u65F6\u95F4\");\n const limit = Math.min(LOG_TAIL_MAX, Math.max(1, Number(p.limit) || 1000));\n const ranged = Boolean(since || until);\n const entries = readDiskLogs({\n ...(ranged ? {} : { limit }),\n ...(since ? { since } : {}),\n ...(until ? { until } : {}),\n ...(Array.isArray(p.sources) ? { sources: p.sources.map(value => string(value, \"\u65E5\u5FD7\u6765\u6E90\")) } : {}),\n ...(Array.isArray(p.levels) ? { levels: p.levels as (\"info\" | \"warn\" | \"error\")[] } : {}),\n });\n const truncated = entries.length > limit;\n return { entries: (truncated ? entries.slice(entries.length - limit) : entries).map(log => ({ ...log, time: log.time.toISOString() })), ...(truncated ? { truncated: true } : {}) };\n }\n case \"logs.delete\": {\n const since = timeBound(p.since, \"\u5F00\u59CB\u65F6\u95F4\");\n const until = timeBound(p.until, \"\u7ED3\u675F\u65F6\u95F4\");\n if (!since || !until) throw new Error(\"\u5220\u9664\u65E5\u5FD7\u9700\u8981\u5F00\u59CB\u548C\u7ED3\u675F\u65F6\u95F4\");\n if (until < since) throw new Error(\"\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u5F00\u59CB\u65F6\u95F4\");\n const source = p.source === undefined ? undefined : string(p.source, \"\u65E5\u5FD7\u6765\u6E90\");\n if (source !== undefined && (source.length > 128 || /[\\r\\n]/.test(source))) throw new Error(\"\u975E\u6CD5\u65E5\u5FD7\u6765\u6E90\");\n const text = p.text === undefined ? undefined : string(p.text, \"\u65E5\u5FD7\u6B63\u6587\");\n return deleteStoredLogs({ since, until, ...(source === undefined ? {} : { source }), ...(text === undefined ? {} : { text }) });\n }\n case \"operations.list\": return { operations: store.list().filter(row => !Array.isArray(p.statuses) || p.statuses.includes(row.status)).slice(0, Math.min(Number(p.limit) || 100, 200)) };\n case \"operations.get\": return { operation: store.get(string(p.operationId, \"\u4EFB\u52A1\u7F16\u53F7\")) };\n case \"modules.list\": return listModules();\n case \"modules.search\": return searchModules(typeof p.query === \"string\" ? p.query : \"\");\n case \"modules.install\": {\n const id = identifier(p.id);\n const linked = (await listModules()).modules.find(row => row.id === id || row.folder === id)?.linked;\n if (linked) throw new Error(\"\u4FDD\u7559\u672C\u5730\u94FE\u63A5\u6A21\u5757\uFF0C\u4E0D\u901A\u8FC7\u5305\u5B89\u88C5\u6216\u5378\u8F7D\u8986\u76D6\u5F00\u53D1\u76EE\u5F55\");\n const block = await moduleInstallBlock(id);\n if (block) throw new Error(block);\n return store.submit(request.method, async context => {\n context.phase(\"download\", \"\u4E0B\u8F7D\u5E76\u5B89\u88C5\u6A21\u5757\uFF0C\u670D\u52A1\u5668\u4FDD\u6301\u8FD0\u884C\");\n const args = [\"install\", id];\n if (typeof p.source === \"string\" && p.source) args.push(\"--from\", p.source);\n await runFetch(args);\n context.phase(\"execute\", \"\u91CD\u5EFA\u884C\u4E3A\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return { ...(await rebuildModules()), restartRequired: true };\n });\n }\n case \"modules.uninstall\": case \"modules.toggle\": {\n const id = identifier(p.id);\n if (request.method !== \"modules.toggle\") {\n const linked = (await listModules()).modules.find(row => row.id === id || row.folder === id)?.linked;\n if (linked) throw new Error(\"\u4FDD\u7559\u672C\u5730\u94FE\u63A5\u6A21\u5757\uFF0C\u4E0D\u901A\u8FC7\u5305\u5B89\u88C5\u6216\u5378\u8F7D\u8986\u76D6\u5F00\u53D1\u76EE\u5F55\");\n }\n return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u66F4\u65B0\u6A21\u5757\u5E76\u91CD\u5EFA\u884C\u4E3A\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n if (request.method === \"modules.toggle\") {\n const result = await (p.enabled === true ? cmdModuleEnable([id]) : cmdModuleDisable([id])); if (!result.ok) throw new Error(result.message);\n } else {\n await runFetch([\"uninstall\", id]);\n }\n return { ...(await rebuildModules()), restartRequired: true };\n });\n }\n case \"config.list\": return { keys: [...configFiles().keys()] };\n case \"config.read\": return readDocument(string(p.key, \"\u914D\u7F6E\u540D\u79F0\"));\n case \"config.save\": {\n const key = string(p.key, \"\u914D\u7F6E\u540D\u79F0\"); const text = string(p.text, \"\u914D\u7F6E\u5185\u5BB9\"); const expected = string(p.revision, \"\u914D\u7F6E\u7248\u672C\");\n const document = readDocument(key); validateDocument(document, text);\n if (document.revision !== expected) throw Object.assign(new Error(\"\u914D\u7F6E\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\"), { code: \"conflict\" });\n return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u4FDD\u5B58\u914D\u7F6E\u6587\u4EF6\uFF0C\u4E0D\u91CD\u542F\u670D\u52A1\");\n saveDocument(key, expected, text);\n return { saved: true, revision: revision(text), restartRequired: true };\n });\n }\n case \"config.apply\": {\n const key = string(p.key, \"\u914D\u7F6E\u540D\u79F0\"); const text = string(p.text, \"\u914D\u7F6E\u5185\u5BB9\"); const expected = string(p.revision, \"\u914D\u7F6E\u7248\u672C\");\n const document = readDocument(key); validateDocument(document, text);\n if (document.revision !== expected) throw Object.assign(new Error(\"\u914D\u7F6E\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\"), { code: \"conflict\" });\n return store.submit(request.method, async context => {\n let saved = false;\n try { return await withStoppedServices(context, [...START_ORDER], async () => {\n saveDocument(key, expected, text); context.phase(\"apply\", \"\u6587\u4EF6\u5DF2\u4FDD\u5B58\uFF0C\u6B63\u5728\u5E94\u7528\u8FD0\u884C\u914D\u7F6E\");\n saved = true;\n refreshServices(); return { saved: true, revision: readDocument(key).revision, applied: true };\n }); } catch (error) { throw Object.assign(new Error(`${saved ? \"\u6587\u4EF6\u5DF2\u4FDD\u5B58\uFF0C\u8FD0\u884C\u65F6\u5E94\u7528\u5931\u8D25\" : \"\u914D\u7F6E\u672A\u4FDD\u5B58\"}: ${error instanceof Error ? error.message : String(error)}`), { code: \"io\", details: { saved, applied: false } }); }\n });\n }\n case \"packs.list\": return listPacks();\n case \"packs.icon\": return readPackIcon(identifier(p.id));\n case \"packs.import.plan\": return planPackImport(identifier(p.filename));\n case \"packs.import\": {\n const names = readImportFilenames(p);\n return store.submit(request.method, async context => {\n context.phase(\"execute\", names.length > 1 ? `\u5BFC\u5165 ${names.length} \u4E2A\u4E16\u754C\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS` : \"\u5BFC\u5165\u4E16\u754C\u5305\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return importPacks(names, { force: p.force === true, ...(p.revision === undefined ? {} : { revision: string(p.revision, \"\u5BFC\u5165\u8BA1\u5212\u7248\u672C\") }) });\n });\n }\n case \"packs.toggle\": return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u4FDD\u5B58\u4E16\u754C\u5305\u72B6\u6001\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return togglePack(identifier(p.id), p.enabled === true);\n });\n case \"packs.uninstall\": return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u5378\u8F7D\u4E16\u754C\u5305\u5E76\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return uninstallPack(identifier(p.id));\n });\n case \"packs.version\": {\n const id = identifier(p.id);\n const version = p.version;\n return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u5199\u5165\u8D44\u6E90\u5305\u7248\u672C\uFF0C\u7B49\u5F85\u624B\u52A8\u91CD\u542F BDS\");\n return setPackVersion(id, version);\n });\n }\n case \"players.list\": return players();\n case \"metrics.read\": return readRuntimeMetrics(request.params);\n case \"players.apply\": return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], async () => savePlayerPermissions(string(p.kind, \"\u6743\u9650\u7C7B\u578B\"), p.entries)));\n case \"attachment.plan\": return attachmentPlan();\n case \"attachment.apply\": return store.submit(request.method, async context => {\n const plan = await attachmentPlan(false);\n if (p.targetVersion !== undefined && p.targetVersion !== plan.targetVersion) throw Object.assign(new Error(\"\u76EE\u6807\u7248\u672C\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0\u65E5\u5FD7\u540E\u786E\u8BA4\"), { code: \"conflict\" });\n if (plan.externalServices.length) throw new Error(\"\u65E0\u6CD5\u53EF\u9760\u8FC1\u79FB\u5916\u90E8\u8FDB\u7A0B\uFF1B\u8BF7\u5148\u901A\u8FC7\u539F\u7BA1\u7406\u5668\u4F18\u96C5\u505C\u670D\");\n if (plan.upgradeRequired) return launchPlatformUpdate(store, context, plan.targetVersion);\n return { attached: true, version: plan.currentVersion, development: plan.development };\n });\n case \"updates.check\": {\n const results = await Promise.allSettled([attachmentPlan(), modulePlan(), bdsUpdate({ id: \"check\", phase: () => {} }, true)]);\n return Object.fromEntries(results.map((result, index) => [[\"platform\", \"modules\", \"bds\"][index], result.status === \"fulfilled\" ? result.value : { error: String(result.reason) }]));\n }\n case \"updates.run\": {\n if (p.kind === \"platform\") return store.submit(request.method, async context => { const plan = await attachmentPlan(false); if (p.targetVersion !== undefined && p.targetVersion !== plan.targetVersion) throw Object.assign(new Error(\"\u76EE\u6807\u7248\u672C\u5DF2\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0\u65E5\u5FD7\u540E\u786E\u8BA4\"), { code: \"conflict\" }); return plan.upgradeRequired ? launchPlatformUpdate(store, context, plan.targetVersion) : { upToDate: true, version: plan.currentVersion }; });\n if (p.kind === \"modules\") return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], async () => { const result = await applyModulePlan(Array.isArray(p.ids) ? p.ids.map(identifier) : []); await rebuildModules(); return result; }));\n if (p.kind === \"bds\") return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], () => bdsUpdate(context)));\n throw new Error(\"\u672A\u77E5\u66F4\u65B0\u7C7B\u578B\");\n }\n case \"deployment.create\": {\n if (p.acceptEula !== true) throw new Error(\"\u521B\u5EFA\u90E8\u7F72\u524D\u5FC5\u987B\u786E\u8BA4 BDS \u4F7F\u7528\u6761\u6B3E\");\n return store.submit(request.method, async context => {\n if (isRuntimeInitialized()) throw new Error(\"\u76EE\u5F55\u5DF2\u7ECF\u521D\u59CB\u5316\uFF0C\u4E0D\u8986\u76D6\u5DF2\u6709\u90E8\u7F72\");\n const ports = { db: deploymentPort(p.dbPort, 3001), bds: deploymentPort(p.bdsPort, 19132), bds6: deploymentPort(p.bdsPort6, 19133) };\n context.phase(\"preflight\", \"\u68C0\u67E5\u76EE\u5F55\u3001\u78C1\u76D8\u7A7A\u95F4\u548C TCP\uFF0FUDP \u7AEF\u53E3\"); await deploymentPreflight(ports);\n context.phase(\"prepare\"); ensureCoreConfigs(ROOT, [\"db_config\", \"qq_config\", \"bds_updater\", \"permissions\", \"qq_link\"]);\n const updater = path.join(ROOT, \"configs\", \"bds_updater.json\");\n atomicJson(updater, { ...readJson(updater, {}), bds_path: \"BDS\", backup_dir: \"backups\" });\n const dbFile = path.join(ROOT, \"configs\", \"db_config.json\"); atomicJson(dbFile, { ...readJson(dbFile, {}), db_port: ports.db });\n fs.mkdirSync(path.join(ROOT, \"modules\", \"packages\"), { recursive: true });\n await bdsUpdate(context);\n const properties = path.join(ROOT, \"BDS\", \"server.properties\");\n let text = fs.readFileSync(properties, \"utf8\");\n for (const [key, port] of [[\"server-port\", ports.bds], [\"server-portv6\", ports.bds6]] as const) text = text.replace(new RegExp(`^${key}=.*$`, \"m\"), `${key}=${port}`);\n fs.writeFileSync(properties, text);\n await rebuildModules();\n refreshServices(); context.phase(\"start\");\n const started: ServiceName[] = [];\n try { for (const name of START_ORDER) { const result = await services[name].start(); if (result.status !== \"skipped\") started.push(name); } await verifyRunning(started); }\n catch (error) { for (const name of [...START_ORDER].reverse()) await services[name].stop(false, false).catch(() => {}); throw error; }\n atomicJson(path.join(ROOT, \"configs\", \"runtime.json\"), { ...readJson(path.join(ROOT, \"configs\", \"runtime.json\"), {}), initialized_at: new Date().toISOString() });\n return { created: true, rows: await queryServicesRuntimeLocal() };\n });\n }\n case \"backups.list\": { const directory = path.join(ROOT, \".sfmc\", \"backups\"); return { backups: fs.existsSync(directory) ? fs.readdirSync(directory).filter(id => fs.existsSync(path.join(directory, id, \"manifest.json\"))) : [] }; }\n case \"backups.create\": return store.submit(request.method, context => createBackup(context));\n case \"backups.restore\": {\n if (p.confirmDataLoss !== true) throw new Error(\"\u6062\u590D\u6570\u636E\u9700\u8981\u660E\u786E\u786E\u8BA4\u4E22\u5F03\u5907\u4EFD\u4E4B\u540E\u7684\u53D8\u66F4\");\n return store.submit(request.method, context => withStoppedServices(context, [...START_ORDER], () => restoreSnapshot(identifier(p.id), context.phase)));\n }\n case \"backups.delete\": return store.submit(request.method, async context => {\n context.phase(\"execute\", \"\u5220\u9664\u5907\u4EFD\u76EE\u5F55\");\n return deleteSnapshot(identifier(p.id));\n });\n case \"startup.plan\": return startupPlan();\n default: throw Object.assign(new Error(`\u4E0D\u652F\u6301\u7684\u7BA1\u7406\u65B9\u6CD5: ${request.method}`), { code: \"unsupported\" });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-sidecars.d.ts","sourceRoot":"","sources":["../src/module-sidecars.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"module-sidecars.d.ts","sourceRoot":"","sources":["../src/module-sidecars.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyHH;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,GACvD,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAUzC"}
|
package/dist/module-sidecars.js
CHANGED
|
@@ -3,6 +3,25 @@ import fs from "node:fs";
|
|
|
3
3
|
import net from "node:net";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
const children = /* @__PURE__ */ new Map();
|
|
6
|
+
let runtimeRoot = "";
|
|
7
|
+
function persistSidecars() {
|
|
8
|
+
if (!runtimeRoot) return;
|
|
9
|
+
const file = path.join(runtimeRoot, ".sfmc", "sidecars.runtime.json");
|
|
10
|
+
const processes = [...children.entries()].flatMap(([id, child]) => {
|
|
11
|
+
const pid = child.pid ?? 0;
|
|
12
|
+
if (!pid || child.exitCode !== null) return [];
|
|
13
|
+
return [{ id, pid }];
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
if (!processes.length) {
|
|
17
|
+
fs.unlinkSync(file);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
21
|
+
fs.writeFileSync(file, JSON.stringify({ processes }) + "\n");
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
6
25
|
function readJson(file) {
|
|
7
26
|
try {
|
|
8
27
|
const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
@@ -70,6 +89,7 @@ function loadSpecs(root) {
|
|
|
70
89
|
return found;
|
|
71
90
|
}
|
|
72
91
|
async function startModuleSidecars(root, log) {
|
|
92
|
+
runtimeRoot = root;
|
|
73
93
|
for (const { spec, dir } of loadSpecs(root)) {
|
|
74
94
|
if (children.has(spec.id)) continue;
|
|
75
95
|
if (!isEnabled(root, spec)) continue;
|
|
@@ -93,11 +113,13 @@ async function startModuleSidecars(root, log) {
|
|
|
93
113
|
log(`[${spec.id}] \u5DF2\u968F\u670D\u52A1\u5668\u542F\u52A8\u9644\u5C5E\u8FDB\u7A0B (PID ${child.pid ?? 0})`, "stdout");
|
|
94
114
|
child.on("exit", (code) => {
|
|
95
115
|
if (children.get(spec.id) === child) children.delete(spec.id);
|
|
116
|
+
persistSidecars();
|
|
96
117
|
log(`[${spec.id}] \u9644\u5C5E\u8FDB\u7A0B\u9000\u51FA (code ${code ?? "?"})`, code === 0 ? "stdout" : "stderr");
|
|
97
118
|
});
|
|
98
119
|
child.on("error", (err) => {
|
|
99
120
|
log(`[${spec.id}] \u9644\u5C5E\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${err.message}`, "stderr");
|
|
100
121
|
});
|
|
122
|
+
persistSidecars();
|
|
101
123
|
}
|
|
102
124
|
}
|
|
103
125
|
function stopModuleSidecars() {
|
|
@@ -108,6 +130,7 @@ function stopModuleSidecars() {
|
|
|
108
130
|
} catch {
|
|
109
131
|
}
|
|
110
132
|
}
|
|
133
|
+
persistSidecars();
|
|
111
134
|
}
|
|
112
135
|
export {
|
|
113
136
|
startModuleSidecars,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/module-sidecars.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * \u6A21\u5757\u968F BDS \u542F\u52A8\u7684\u9644\u5C5E\u8FDB\u7A0B\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u5F00\u670D\u524D\u626B\u63CF modules/packages/<id>/sidecar.json\u3002\n * \u76EE\u524D Bluemap \u7528\u5B83\u62C9\u8D77\u5730\u56FE\u8FDB\u7A0B\uFF1B\u65E5\u5FD7\u6B63\u6587\u7531\u811A\u672C\u6253\u8FDB BDS\uFF0C\u8FD9\u91CC\u53EA\u62A5\u544A\u542F\u52A8\u548C\u9000\u51FA\u3002\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\n\n/** \u6A21\u5757\u5305\u6839\u76EE\u5F55\u91CC\u7684 sidecar.json\u3002 */\ninterface SidecarSpec {\n id: string;\n /** \u76F8\u5BF9\u6A21\u5757\u5305\u6839\u76EE\u5F55\u7684 Node \u5165\u53E3\u3002 */\n entry: string;\n /** \u76F8\u5BF9 SFMC \u6839\u76EE\u5F55\u7684\u914D\u7F6E\u6587\u4EF6\u3002\u7F3A\u7701\u4E0D\u5224\u65AD\u5F00\u5173\u3002 */\n configFile?: string;\n /** \u914D\u7F6E\u91CC\u7684\u70B9\u8DEF\u5F84\u3002\u503C\u4E3A false \u65F6\u4E0D\u542F\u52A8\u3002\u7F3A\u7701\u89C6\u4E3A\u5F00\u542F\u3002 */\n when?: string;\n}\n\n/** \u672C\u8F6E BDS \u62C9\u8D77\u7684\u9644\u5C5E\u8FDB\u7A0B\u3002\u505C\u670D\u65F6\u53EA\u7ED3\u675F\u8FD9\u4E9B\uFF0C\u4E0D\u78B0\u7528\u6237\u53E6\u5916\u5F00\u7684\u8FDB\u7A0B\u3002 */\nconst children = new Map<string, ChildProcess>();\n\nfunction readJson(file: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(file, \"utf8\")) as unknown;\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\n/** \u6CBF\u70B9\u8DEF\u5F84\u53D6\u503C\u3002\u4E2D\u9014\u4E0D\u662F\u5BF9\u8C61\u5219\u8FD4\u56DE undefined\u3002 */\nfunction readPath(source: Record<string, unknown>, dotted: string): unknown {\n let current: unknown = source;\n for (const part of dotted.split(\".\")) {\n if (!current || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction isEnabled(root: string, spec: SidecarSpec): boolean {\n if (!spec.when || !spec.configFile) return true;\n const config = readJson(path.join(root, spec.configFile));\n if (!config) return true;\n const flag = readPath(config, spec.when);\n return flag !== false;\n}\n\nfunction configuredPort(root: string, spec: SidecarSpec): number {\n if (!spec.configFile) return 0;\n const config = readJson(path.join(root, spec.configFile));\n const port = config?.port;\n return typeof port === \"number\" && port > 0 && port < 65536 ? port : 0;\n}\n\n/** \u7AEF\u53E3\u5DF2\u6709\u8FDB\u7A0B\u76D1\u542C\u65F6\u4E0D\u518D\u542F\u52A8\u7B2C\u4E8C\u4E2A\u3002 */\nfunction portOpen(port: number): Promise<boolean> {\n if (!port) return Promise.resolve(false);\n return new Promise((resolve) => {\n const socket = net.connect({ host: \"127.0.0.1\", port });\n const done = (open: boolean) => {\n socket.removeAllListeners();\n socket.destroy();\n resolve(open);\n };\n socket.once(\"connect\", () => done(true));\n socket.once(\"error\", () => done(false));\n socket.setTimeout(500, () => done(false));\n });\n}\n\nfunction loadSpecs(root: string): Array<{ spec: SidecarSpec; dir: string }> {\n const packagesDir = path.join(root, \"modules\", \"packages\");\n if (!fs.existsSync(packagesDir)) return [];\n const found: Array<{ spec: SidecarSpec; dir: string }> = [];\n for (const entry of fs.readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const dir = path.join(packagesDir, entry.name);\n const file = path.join(dir, \"sidecar.json\");\n if (!fs.existsSync(file)) continue;\n const raw = readJson(file);\n if (!raw || typeof raw.id !== \"string\" || typeof raw.entry !== \"string\") continue;\n const lock = readJson(path.join(root, \"modules\", \"module-lock.json\"));\n const modules = lock?.modules && typeof lock.modules === \"object\" ? (lock.modules as Record<string, unknown>) : {};\n const row = modules[raw.id];\n const enabled = !row || typeof row !== \"object\" || (row as { enabled?: boolean }).enabled !== false;\n if (!enabled) continue;\n const spec: SidecarSpec = { id: raw.id, entry: raw.entry };\n if (typeof raw.configFile === \"string\") spec.configFile = raw.configFile;\n if (typeof raw.when === \"string\") spec.when = raw.when;\n found.push({ spec, dir });\n }\n return found;\n}\n\n/**\n * \u5728 BDS \u8FDB\u7A0B\u62C9\u8D77\u4E4B\u524D\u542F\u52A8\u9644\u5C5E\u8FDB\u7A0B\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Aservices.ts \u91CC bds \u7684 start\uFF0C\u5728 beforeStart \u4E4B\u540E\u8C03\u7528\u3002\n */\nexport async function startModuleSidecars(\n root: string,\n log: (line: string, stream: \"stdout\" | \"stderr\") => void\n): Promise<void> {\n for (const { spec, dir } of loadSpecs(root)) {\n if (children.has(spec.id)) continue;\n if (!isEnabled(root, spec)) continue;\n const entry = path.join(dir, spec.entry);\n if (!fs.existsSync(entry)) {\n log(`[${spec.id}] \u672A\u627E\u5230\u9644\u5C5E\u8FDB\u7A0B\u5165\u53E3: ${entry}`, \"stderr\");\n continue;\n }\n const port = configuredPort(root, spec);\n if (await portOpen(port)) {\n log(`[${spec.id}] \u7AEF\u53E3 ${port} \u5DF2\u5728\u76D1\u542C\uFF0C\u8DF3\u8FC7\u542F\u52A8\u3002`, \"stdout\");\n continue;\n }\n const child = spawn(process.execPath, [entry], {\n cwd: dir,\n env: { ...process.env, SFMC_ROOT: root },\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n children.set(spec.id, child);\n log(`[${spec.id}] \u5DF2\u968F\u670D\u52A1\u5668\u542F\u52A8\u9644\u5C5E\u8FDB\u7A0B (PID ${child.pid ?? 0})`, \"stdout\");\n child.on(\"exit\", (code) => {\n if (children.get(spec.id) === child) children.delete(spec.id);\n log(`[${spec.id}] \u9644\u5C5E\u8FDB\u7A0B\u9000\u51FA (code ${code ?? \"?\"})`, code === 0 ? \"stdout\" : \"stderr\");\n });\n child.on(\"error\", (err) => {\n log(`[${spec.id}] \u9644\u5C5E\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${err.message}`, \"stderr\");\n });\n }\n}\n\n/**\n * \u7ED3\u675F\u672C\u8F6E\u7531\u5F00\u670D\u62C9\u8D77\u7684\u9644\u5C5E\u8FDB\u7A0B\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1ABDS \u670D\u52A1 cleanup \u65F6\u8C03\u7528\u3002\u7528\u6237\u81EA\u5DF1\u53E6\u5F00\u7684\u5730\u56FE\u8FDB\u7A0B\u4E0D\u4F1A\u88AB\u5173\u6389\u3002\n */\nexport function stopModuleSidecars(): void {\n for (const [id, child] of children) {\n children.delete(id);\n try {\n child.kill();\n } catch {\n /* \u8FDB\u7A0B\u5DF2\u7ECF\u7ED3\u675F\u65F6\u5FFD\u7565\u3002 */\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * \u6A21\u5757\u968F BDS \u542F\u52A8\u7684\u9644\u5C5E\u8FDB\u7A0B\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u5F00\u670D\u524D\u626B\u63CF modules/packages/<id>/sidecar.json\u3002\n * \u76EE\u524D Bluemap \u7528\u5B83\u62C9\u8D77\u5730\u56FE\u8FDB\u7A0B\uFF1B\u65E5\u5FD7\u6B63\u6587\u7531\u811A\u672C\u6253\u8FDB BDS\uFF0C\u8FD9\u91CC\u53EA\u62A5\u544A\u542F\u52A8\u548C\u9000\u51FA\u3002\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\n\n/** \u6A21\u5757\u5305\u6839\u76EE\u5F55\u91CC\u7684 sidecar.json\u3002 */\ninterface SidecarSpec {\n id: string;\n /** \u76F8\u5BF9\u6A21\u5757\u5305\u6839\u76EE\u5F55\u7684 Node \u5165\u53E3\u3002 */\n entry: string;\n /** \u76F8\u5BF9 SFMC \u6839\u76EE\u5F55\u7684\u914D\u7F6E\u6587\u4EF6\u3002\u7F3A\u7701\u4E0D\u5224\u65AD\u5F00\u5173\u3002 */\n configFile?: string;\n /** \u914D\u7F6E\u91CC\u7684\u70B9\u8DEF\u5F84\u3002\u503C\u4E3A false \u65F6\u4E0D\u542F\u52A8\u3002\u7F3A\u7701\u89C6\u4E3A\u5F00\u542F\u3002 */\n when?: string;\n}\n\n/** \u672C\u8F6E BDS \u62C9\u8D77\u7684\u9644\u5C5E\u8FDB\u7A0B\u3002\u505C\u670D\u65F6\u53EA\u7ED3\u675F\u8FD9\u4E9B\uFF0C\u4E0D\u78B0\u7528\u6237\u53E6\u5916\u5F00\u7684\u8FDB\u7A0B\u3002 */\nconst children = new Map<string, ChildProcess>();\n/** \u672C\u8F6E\u9644\u5C5E\u8FDB\u7A0B\u6240\u5C5E\u7684\u5B9E\u4F8B\u6839\uFF0C\u8FD0\u884C\u6001\u6587\u4EF6\u5199\u5230\u8BE5\u76EE\u5F55\u7684 .sfmc\u3002 */\nlet runtimeRoot = \"\";\n\n/**\n * \u628A\u5F53\u524D\u4ECD\u6D3B\u7740\u7684\u9644\u5C5E\u8FDB\u7A0B PID \u5199\u5230 .sfmc/sidecars.runtime.json\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1A\u6570\u636E\u670D\u52A1\u636E\u6B64\u7EDF\u8BA1\u5404\u5730\u56FE\u7B49\u9644\u5C5E\u8FDB\u7A0B\u7684\u5185\u5B58\u3002\u8FDB\u7A0B\u90FD\u9000\u51FA\u540E\u5220\u6389\u6587\u4EF6\u3002\n */\nfunction persistSidecars(): void {\n if (!runtimeRoot) return;\n const file = path.join(runtimeRoot, \".sfmc\", \"sidecars.runtime.json\");\n const processes = [...children.entries()].flatMap(([id, child]) => {\n const pid = child.pid ?? 0;\n if (!pid || child.exitCode !== null) return [];\n return [{ id, pid }];\n });\n try {\n if (!processes.length) {\n fs.unlinkSync(file);\n return;\n }\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ processes }) + \"\\n\");\n } catch {\n /* \u8FD0\u884C\u6001\u6587\u4EF6\u5199\u5931\u8D25\u65F6\u5185\u5B58\u9762\u677F\u4F1A\u5C11\u8FD9\u4E00\u9879\uFF0C\u4E0D\u5F71\u54CD\u9644\u5C5E\u8FDB\u7A0B\u672C\u8EAB\u3002 */\n }\n}\n\nfunction readJson(file: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(file, \"utf8\")) as unknown;\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\n/** \u6CBF\u70B9\u8DEF\u5F84\u53D6\u503C\u3002\u4E2D\u9014\u4E0D\u662F\u5BF9\u8C61\u5219\u8FD4\u56DE undefined\u3002 */\nfunction readPath(source: Record<string, unknown>, dotted: string): unknown {\n let current: unknown = source;\n for (const part of dotted.split(\".\")) {\n if (!current || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction isEnabled(root: string, spec: SidecarSpec): boolean {\n if (!spec.when || !spec.configFile) return true;\n const config = readJson(path.join(root, spec.configFile));\n if (!config) return true;\n const flag = readPath(config, spec.when);\n return flag !== false;\n}\n\nfunction configuredPort(root: string, spec: SidecarSpec): number {\n if (!spec.configFile) return 0;\n const config = readJson(path.join(root, spec.configFile));\n const port = config?.port;\n return typeof port === \"number\" && port > 0 && port < 65536 ? port : 0;\n}\n\n/** \u7AEF\u53E3\u5DF2\u6709\u8FDB\u7A0B\u76D1\u542C\u65F6\u4E0D\u518D\u542F\u52A8\u7B2C\u4E8C\u4E2A\u3002 */\nfunction portOpen(port: number): Promise<boolean> {\n if (!port) return Promise.resolve(false);\n return new Promise((resolve) => {\n const socket = net.connect({ host: \"127.0.0.1\", port });\n const done = (open: boolean) => {\n socket.removeAllListeners();\n socket.destroy();\n resolve(open);\n };\n socket.once(\"connect\", () => done(true));\n socket.once(\"error\", () => done(false));\n socket.setTimeout(500, () => done(false));\n });\n}\n\nfunction loadSpecs(root: string): Array<{ spec: SidecarSpec; dir: string }> {\n const packagesDir = path.join(root, \"modules\", \"packages\");\n if (!fs.existsSync(packagesDir)) return [];\n const found: Array<{ spec: SidecarSpec; dir: string }> = [];\n for (const entry of fs.readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const dir = path.join(packagesDir, entry.name);\n const file = path.join(dir, \"sidecar.json\");\n if (!fs.existsSync(file)) continue;\n const raw = readJson(file);\n if (!raw || typeof raw.id !== \"string\" || typeof raw.entry !== \"string\") continue;\n const lock = readJson(path.join(root, \"modules\", \"module-lock.json\"));\n const modules = lock?.modules && typeof lock.modules === \"object\" ? (lock.modules as Record<string, unknown>) : {};\n const row = modules[raw.id];\n const enabled = !row || typeof row !== \"object\" || (row as { enabled?: boolean }).enabled !== false;\n if (!enabled) continue;\n const spec: SidecarSpec = { id: raw.id, entry: raw.entry };\n if (typeof raw.configFile === \"string\") spec.configFile = raw.configFile;\n if (typeof raw.when === \"string\") spec.when = raw.when;\n found.push({ spec, dir });\n }\n return found;\n}\n\n/**\n * \u5728 BDS \u8FDB\u7A0B\u62C9\u8D77\u4E4B\u524D\u542F\u52A8\u9644\u5C5E\u8FDB\u7A0B\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1Aservices.ts \u91CC bds \u7684 start\uFF0C\u5728 beforeStart \u4E4B\u540E\u8C03\u7528\u3002\n */\nexport async function startModuleSidecars(\n root: string,\n log: (line: string, stream: \"stdout\" | \"stderr\") => void\n): Promise<void> {\n runtimeRoot = root;\n for (const { spec, dir } of loadSpecs(root)) {\n if (children.has(spec.id)) continue;\n if (!isEnabled(root, spec)) continue;\n const entry = path.join(dir, spec.entry);\n if (!fs.existsSync(entry)) {\n log(`[${spec.id}] \u672A\u627E\u5230\u9644\u5C5E\u8FDB\u7A0B\u5165\u53E3: ${entry}`, \"stderr\");\n continue;\n }\n const port = configuredPort(root, spec);\n if (await portOpen(port)) {\n log(`[${spec.id}] \u7AEF\u53E3 ${port} \u5DF2\u5728\u76D1\u542C\uFF0C\u8DF3\u8FC7\u542F\u52A8\u3002`, \"stdout\");\n continue;\n }\n const child = spawn(process.execPath, [entry], {\n cwd: dir,\n env: { ...process.env, SFMC_ROOT: root },\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n children.set(spec.id, child);\n log(`[${spec.id}] \u5DF2\u968F\u670D\u52A1\u5668\u542F\u52A8\u9644\u5C5E\u8FDB\u7A0B (PID ${child.pid ?? 0})`, \"stdout\");\n child.on(\"exit\", (code) => {\n if (children.get(spec.id) === child) children.delete(spec.id);\n persistSidecars();\n log(`[${spec.id}] \u9644\u5C5E\u8FDB\u7A0B\u9000\u51FA (code ${code ?? \"?\"})`, code === 0 ? \"stdout\" : \"stderr\");\n });\n child.on(\"error\", (err) => {\n log(`[${spec.id}] \u9644\u5C5E\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${err.message}`, \"stderr\");\n });\n persistSidecars();\n }\n}\n\n/**\n * \u7ED3\u675F\u672C\u8F6E\u7531\u5F00\u670D\u62C9\u8D77\u7684\u9644\u5C5E\u8FDB\u7A0B\u3002\n * \u4F7F\u7528\u573A\u666F\uFF1ABDS \u670D\u52A1 cleanup \u65F6\u8C03\u7528\u3002\u7528\u6237\u81EA\u5DF1\u53E6\u5F00\u7684\u5730\u56FE\u8FDB\u7A0B\u4E0D\u4F1A\u88AB\u5173\u6389\u3002\n */\nexport function stopModuleSidecars(): void {\n for (const [id, child] of children) {\n children.delete(id);\n try {\n child.kill();\n } catch {\n /* \u8FDB\u7A0B\u5DF2\u7ECF\u7ED3\u675F\u65F6\u5FFD\u7565\u3002 */\n }\n }\n persistSidecars();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/registry.d.ts
CHANGED
|
@@ -19,13 +19,19 @@ export interface RegistryEntry {
|
|
|
19
19
|
sdk?: string;
|
|
20
20
|
repo?: string;
|
|
21
21
|
tag?: string;
|
|
22
|
+
/** 索引里的展示名。旧缓存可能没有。 */
|
|
23
|
+
name?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
category?: string;
|
|
26
|
+
license?: string;
|
|
27
|
+
official?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 安装前必须已经启用的模块 id。
|
|
30
|
+
* 字段缺失表示这份索引没有声明依赖,调用方应拒绝安装。
|
|
31
|
+
*/
|
|
32
|
+
requires?: string[];
|
|
22
33
|
}
|
|
23
34
|
export type RegistryIndex = Record<string, RegistryEntry>;
|
|
24
|
-
/**
|
|
25
|
-
* 解析 first-party index.json。
|
|
26
|
-
* 契约与 scripts/module-install/lib/registry-index.mjs#parseRegistryIndex 保持一致:
|
|
27
|
-
* `{ modules: { <id>: { npm? | repo+tag } } }`。忽略 `_` 前缀元数据键。
|
|
28
|
-
*/
|
|
29
35
|
export declare function parseRegistryIndex(json: unknown): RegistryIndex;
|
|
30
36
|
export interface RegistryResult {
|
|
31
37
|
index: RegistryIndex;
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AA8C1D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA2C/D;AAWD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB9F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAIpD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlF;AAED,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC"}
|
package/dist/registry.js
CHANGED
|
@@ -23,6 +23,18 @@ function writeCache(cache) {
|
|
|
23
23
|
} catch {
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
+
function optionalText(value) {
|
|
27
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
28
|
+
}
|
|
29
|
+
function optionalRequires(value) {
|
|
30
|
+
if (!Array.isArray(value)) return void 0;
|
|
31
|
+
const items = [];
|
|
32
|
+
for (const item of value) {
|
|
33
|
+
if (typeof item !== "string" || !item.trim()) return void 0;
|
|
34
|
+
items.push(item.trim());
|
|
35
|
+
}
|
|
36
|
+
return items;
|
|
37
|
+
}
|
|
26
38
|
function parseRegistryIndex(json) {
|
|
27
39
|
if (typeof json !== "object" || json === null || Array.isArray(json)) {
|
|
28
40
|
throw new Error("registry index must be a JSON object with a 'modules' field");
|
|
@@ -37,19 +49,31 @@ function parseRegistryIndex(json) {
|
|
|
37
49
|
if (k.startsWith("_")) continue;
|
|
38
50
|
if (typeof v !== "object" || v === null || Array.isArray(v)) continue;
|
|
39
51
|
const entry = v;
|
|
40
|
-
const
|
|
41
|
-
const
|
|
52
|
+
const npm = optionalText(entry.npm);
|
|
53
|
+
const repo = optionalText(entry.repo);
|
|
54
|
+
const tag = optionalText(entry.tag);
|
|
55
|
+
const hasNpm = Boolean(npm);
|
|
56
|
+
const hasGh = Boolean(repo && tag);
|
|
42
57
|
if (!hasNpm && !hasGh) continue;
|
|
43
58
|
const out = {};
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
59
|
+
if (npm) out.npm = npm;
|
|
60
|
+
const version = optionalText(entry.version);
|
|
61
|
+
const sdk = optionalText(entry.sdk);
|
|
62
|
+
const name = optionalText(entry.name);
|
|
63
|
+
const description = optionalText(entry.description);
|
|
64
|
+
const category = optionalText(entry.category);
|
|
65
|
+
const license = optionalText(entry.license);
|
|
66
|
+
const requires = optionalRequires(entry.requires);
|
|
67
|
+
if (version) out.version = version;
|
|
68
|
+
if (sdk) out.sdk = sdk;
|
|
69
|
+
if (repo) out.repo = repo;
|
|
70
|
+
if (repo && tag) out.tag = tag;
|
|
71
|
+
if (name) out.name = name;
|
|
72
|
+
if (description) out.description = description;
|
|
73
|
+
if (category) out.category = category;
|
|
74
|
+
if (license) out.license = license;
|
|
75
|
+
if (typeof entry.official === "boolean") out.official = entry.official;
|
|
76
|
+
if (requires !== void 0) out.requires = requires;
|
|
53
77
|
filtered[k] = out;
|
|
54
78
|
}
|
|
55
79
|
return filtered;
|