@sfmc-bds/bds-tools 0.1.0 → 0.2.0-beta.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.
Files changed (71) hide show
  1. package/dist/bds-manager.d.ts.map +1 -1
  2. package/dist/bds-manager.js +236 -263
  3. package/dist/bds-manager.js.map +7 -1
  4. package/dist/changelog.js +39 -50
  5. package/dist/changelog.js.map +7 -1
  6. package/dist/check-update.d.ts +2 -2
  7. package/dist/check-update.d.ts.map +1 -1
  8. package/dist/check-update.js +361 -401
  9. package/dist/check-update.js.map +7 -1
  10. package/dist/cli-pack-manager.d.ts +10 -6
  11. package/dist/cli-pack-manager.d.ts.map +1 -1
  12. package/dist/cli-pack-manager.js +226 -135
  13. package/dist/cli-pack-manager.js.map +7 -1
  14. package/dist/fsx.js +86 -100
  15. package/dist/fsx.js.map +7 -1
  16. package/dist/http.d.ts.map +1 -1
  17. package/dist/http.js +166 -185
  18. package/dist/http.js.map +7 -1
  19. package/dist/is-main.d.ts +17 -0
  20. package/dist/is-main.d.ts.map +1 -0
  21. package/dist/is-main.js +32 -0
  22. package/dist/is-main.js.map +7 -0
  23. package/dist/log.d.ts +2 -4
  24. package/dist/log.d.ts.map +1 -1
  25. package/dist/log.js +12 -19
  26. package/dist/log.js.map +7 -1
  27. package/dist/logger.js +6 -10
  28. package/dist/logger.js.map +7 -1
  29. package/dist/pack-manager.d.ts +88 -24
  30. package/dist/pack-manager.d.ts.map +1 -1
  31. package/dist/pack-manager.js +280 -245
  32. package/dist/pack-manager.js.map +7 -1
  33. package/dist/paths.d.ts +8 -3
  34. package/dist/paths.d.ts.map +1 -1
  35. package/dist/paths.js +53 -39
  36. package/dist/paths.js.map +7 -1
  37. package/dist/qqutil.d.ts.map +1 -1
  38. package/dist/qqutil.js +90 -87
  39. package/dist/qqutil.js.map +7 -1
  40. package/dist/recovery.js +26 -37
  41. package/dist/recovery.js.map +7 -1
  42. package/dist/rollback.d.ts +1 -1
  43. package/dist/rollback.js +55 -74
  44. package/dist/rollback.js.map +7 -1
  45. package/dist/server-properties.d.ts +12 -0
  46. package/dist/server-properties.d.ts.map +1 -0
  47. package/dist/server-properties.js +28 -0
  48. package/dist/server-properties.js.map +7 -0
  49. package/dist/taskbar.d.ts +2 -0
  50. package/dist/taskbar.d.ts.map +1 -1
  51. package/dist/taskbar.js +51 -82
  52. package/dist/taskbar.js.map +7 -1
  53. package/dist/types.js +1 -5
  54. package/dist/types.js.map +7 -1
  55. package/dist/update-result.d.ts +12 -0
  56. package/dist/update-result.d.ts.map +1 -0
  57. package/dist/update-result.js +15 -0
  58. package/dist/update-result.js.map +7 -0
  59. package/dist/upstream.js +94 -108
  60. package/dist/upstream.js.map +7 -1
  61. package/dist/version.js +63 -81
  62. package/dist/version.js.map +7 -1
  63. package/dist/world-packs.d.ts +112 -0
  64. package/dist/world-packs.d.ts.map +1 -0
  65. package/dist/world-packs.js +335 -0
  66. package/dist/world-packs.js.map +7 -0
  67. package/dist/zipx.d.ts +10 -0
  68. package/dist/zipx.d.ts.map +1 -0
  69. package/dist/zipx.js +48 -0
  70. package/dist/zipx.js.map +7 -0
  71. package/package.json +17 -6
@@ -1 +1 @@
1
- {"version":3,"file":"bds-manager.d.ts","sourceRoot":"","sources":["../src/bds-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAuK5E;AAED,eAAO,MAAM,SAAS,EAAE,YAAiC,CAAC;AAC1D,eAAO,MAAM,iBAAiB,QAAO,IAA2C,CAAC"}
1
+ {"version":3,"file":"bds-manager.d.ts","sourceRoot":"","sources":["../src/bds-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA0K5E;AAED,eAAO,MAAM,SAAS,EAAE,YAAiC,CAAC;AAC1D,eAAO,MAAM,iBAAiB,QAAO,IAA2C,CAAC"}
@@ -1,294 +1,267 @@
1
- /**
2
- * bds-manager.ts — BDS 进程管理器
3
- *
4
- * 改进:
5
- * - 优雅 stop (发送 stop 命令 → 等待退出 → SIGTERM → SIGKILL)
6
- * - watchdog (崩溃自动重启)
7
- * - 单例事件发射器
8
- * - 完全异步 (fs/promises)
9
- */
10
1
  import { spawn, exec } from "node:child_process";
11
2
  import { promisify } from "node:util";
12
3
  import fs from "node:fs";
13
4
  import path from "node:path";
14
5
  import { EventEmitter } from "node:events";
15
- import { loadConfig, PID_FILE } from "./paths.js";
6
+ import { isMainModule } from "./is-main.js";
7
+ import { ensureStateDir, loadConfig, PID_FILE } from "./paths.js";
16
8
  import { log } from "./log.js";
9
+ import { ensureEmitServerTelemetry } from "./server-properties.js";
17
10
  const execAsync = promisify(exec);
18
11
  let cached = null;
19
12
  function readPid() {
20
- try {
21
- return parseInt(fs.readFileSync(PID_FILE, "utf-8").trim(), 10) || 0;
22
- }
23
- catch {
24
- return 0;
25
- }
13
+ try {
14
+ return parseInt(fs.readFileSync(PID_FILE, "utf-8").trim(), 10) || 0;
15
+ } catch {
16
+ return 0;
17
+ }
26
18
  }
27
19
  function writePid(pid) {
28
- try {
29
- fs.writeFileSync(PID_FILE, String(pid));
30
- }
31
- catch {
32
- /* ignore */
33
- }
20
+ try {
21
+ ensureStateDir();
22
+ fs.writeFileSync(PID_FILE, String(pid));
23
+ } catch {
24
+ }
34
25
  }
35
26
  function clearPid() {
36
- try {
37
- if (fs.existsSync(PID_FILE))
38
- fs.unlinkSync(PID_FILE);
39
- }
40
- catch {
41
- /* ignore */
42
- }
27
+ try {
28
+ if (fs.existsSync(PID_FILE)) fs.unlinkSync(PID_FILE);
29
+ } catch {
30
+ }
43
31
  }
44
32
  async function isAlive(pid) {
45
- if (!pid)
46
- return false;
47
- try {
48
- if (process.platform === "win32") {
49
- const { stdout } = await execAsync(`tasklist /fi "PID eq ${pid}" /nh`, { windowsHide: true });
50
- return stdout.includes(String(pid));
51
- }
52
- process.kill(pid, 0);
53
- return true;
54
- }
55
- catch {
56
- return false;
33
+ if (!pid) return false;
34
+ try {
35
+ if (process.platform === "win32") {
36
+ const { stdout } = await execAsync(`tasklist /fi "PID eq ${pid}" /nh`, { windowsHide: true });
37
+ return stdout.includes(String(pid));
57
38
  }
39
+ process.kill(pid, 0);
40
+ return true;
41
+ } catch {
42
+ return false;
43
+ }
58
44
  }
59
45
  function ensureProc() {
60
- if (cached)
61
- return cached;
62
- const cfg = loadConfig();
63
- const bds_path = path.resolve(cfg.bds_path || process.cwd());
64
- const exePath = path.join(bds_path, "bedrock_server.exe");
65
- cached = {
66
- process: null,
67
- isManualStop: false,
68
- crashRestart: cfg.crash_restart !== false,
69
- crashDelayMs: (cfg.crash_restart_delay ?? 5) * 1000,
70
- exePath,
71
- bdsPath: bds_path,
72
- };
73
- return cached;
46
+ if (cached) return cached;
47
+ const cfg = loadConfig();
48
+ const bds_path = path.resolve(cfg.bds_path || process.cwd());
49
+ const exePath = path.join(bds_path, "bedrock_server.exe");
50
+ cached = {
51
+ process: null,
52
+ isManualStop: false,
53
+ crashRestart: cfg.crash_restart !== false,
54
+ crashDelayMs: (cfg.crash_restart_delay ?? 5) * 1e3,
55
+ exePath,
56
+ bdsPath: bds_path
57
+ };
58
+ return cached;
74
59
  }
75
- export function createBdsManager(options = {}) {
76
- const events = new EventEmitter();
77
- events.setMaxListeners(100);
78
- const sendCommand = (cmd) => {
79
- const p = ensureProc();
80
- const pid = readPid();
81
- if (!pid || !isAlive(pid)) {
82
- log.warn("BDS 未运行");
83
- return false;
84
- }
85
- if (p.process && p.process.pid === pid && p.process.stdin) {
86
- try {
87
- p.process.stdin.write(cmd + "\n");
88
- log.info(`已发送命令: ${cmd}`);
89
- return true;
90
- }
91
- catch {
92
- return false;
93
- }
94
- }
95
- log.warn("BDS 由外部启动,无法发送命令到 stdin");
60
+ function createBdsManager(options = {}) {
61
+ const events = new EventEmitter();
62
+ events.setMaxListeners(100);
63
+ const sendCommand = (cmd) => {
64
+ const p = ensureProc();
65
+ const pid = readPid();
66
+ if (!pid || !isAlive(pid)) {
67
+ log.warn("BDS \u672A\u8FD0\u884C");
68
+ return false;
69
+ }
70
+ if (p.process && p.process.pid === pid && p.process.stdin) {
71
+ try {
72
+ p.process.stdin.write(cmd + "\n");
73
+ log.info(`\u5DF2\u53D1\u9001\u547D\u4EE4: ${cmd}`);
74
+ return true;
75
+ } catch {
96
76
  return false;
97
- };
98
- const stop = async () => {
99
- const p = ensureProc();
100
- const pid = readPid();
101
- if (!pid || !(await isAlive(pid))) {
102
- log.info("BDS 未运行");
103
- clearPid();
104
- return;
105
- }
106
- if (p.process && p.process.pid === pid && p.process.stdin) {
107
- p.isManualStop = true;
108
- log.info("正在关闭 BDS...");
109
- try {
110
- p.process.stdin.write("stop\n");
111
- }
112
- catch (e) {
113
- log.warn(`发送 stop 命令失败: ${e.message}`);
114
- }
115
- await Promise.race([
116
- new Promise((resolve) => p.process?.once("exit", () => resolve())),
117
- new Promise((resolve) => setTimeout(() => {
118
- log.warn("30s 超时,强制终止...");
119
- try {
120
- p.process?.kill("SIGTERM");
121
- }
122
- catch { }
123
- setTimeout(resolve, 5000);
124
- }, 30_000)),
125
- ]);
126
- if (p.process && p.process.exitCode === null) {
127
- log.warn("强制结束进程...");
128
- try {
129
- p.process.kill("SIGKILL");
130
- }
131
- catch { }
132
- }
133
- }
134
- else {
135
- // 外部启动的 BDS — fallback 使用 taskkill / pkill
136
- log.info("BDS 由外部启动,使用 taskkill...");
77
+ }
78
+ }
79
+ log.warn("BDS \u7531\u5916\u90E8\u542F\u52A8\uFF0C\u65E0\u6CD5\u53D1\u9001\u547D\u4EE4\u5230 stdin");
80
+ return false;
81
+ };
82
+ const stop = async () => {
83
+ const p = ensureProc();
84
+ const pid = readPid();
85
+ if (!pid || !await isAlive(pid)) {
86
+ log.info("BDS \u672A\u8FD0\u884C");
87
+ clearPid();
88
+ return;
89
+ }
90
+ if (p.process && p.process.pid === pid && p.process.stdin) {
91
+ p.isManualStop = true;
92
+ log.info("\u6B63\u5728\u5173\u95ED BDS...");
93
+ try {
94
+ p.process.stdin.write("stop\n");
95
+ } catch (e) {
96
+ log.warn(`\u53D1\u9001 stop \u547D\u4EE4\u5931\u8D25: ${e.message}`);
97
+ }
98
+ await Promise.race([
99
+ new Promise((resolve) => p.process?.once("exit", () => resolve())),
100
+ new Promise(
101
+ (resolve) => setTimeout(() => {
102
+ log.warn("30s \u8D85\u65F6\uFF0C\u5F3A\u5236\u7EC8\u6B62...");
137
103
  try {
138
- if (process.platform === "win32") {
139
- await execAsync("taskkill /f /im bedrock_server.exe", { windowsHide: true });
140
- }
141
- else {
142
- await execAsync("pkill -f bedrock_server", { windowsHide: true });
143
- }
144
- }
145
- catch {
146
- /* ignore */
147
- }
148
- }
149
- clearPid();
150
- p.process = null;
151
- log.info("BDS 已停止");
152
- };
153
- const start = async () => {
154
- const p = ensureProc();
155
- const existing = readPid();
156
- if (existing && (await isAlive(existing))) {
157
- log.info("BDS 已在运行中");
158
- return;
159
- }
160
- if (!fs.existsSync(p.exePath)) {
161
- log.error(`未找到 ${p.exePath}`);
162
- throw new Error(`bedrock_server.exe 不存在: ${p.exePath}`);
163
- }
164
- log.info("正在启动 BDS...");
165
- const child = spawn(p.exePath, [], {
166
- cwd: p.bdsPath,
167
- stdio: options.detached ? "ignore" : ["pipe", "pipe", "pipe"],
168
- detached: options.detached,
169
- windowsHide: true,
170
- });
171
- if (options.detached)
172
- child.unref();
173
- p.process = child;
174
- writePid(child.pid ?? 0);
175
- log.info(`BDS 已启动 (PID: ${child.pid})`);
176
- child.stdout?.on("data", (chunk) => {
177
- const text = chunk.toString();
178
- events.emit("output", text);
179
- if (require.main === module)
180
- process.stdout.write(text);
181
- });
182
- child.stderr?.on("data", (chunk) => {
183
- const text = `[STDERR] ${chunk.toString()}`;
184
- events.emit("output", text);
185
- if (require.main === module)
186
- process.stderr.write(text);
187
- });
188
- child.on("exit", (code) => {
189
- log.info(`BDS 已退出 (code: ${code})`);
190
- clearPid();
191
- p.process = null;
192
- if (!p.isManualStop && p.crashRestart && isMain()) {
193
- log.info(`BDS 意外退出,${p.crashDelayMs / 1000}s 后自动重启...`);
194
- setTimeout(() => {
195
- start().catch((e) => log.error(`自动重启失败: ${e.message}`));
196
- }, p.crashDelayMs);
104
+ p.process?.kill("SIGTERM");
105
+ } catch {
197
106
  }
198
- p.isManualStop = false;
199
- });
200
- };
201
- const status = async () => {
202
- const pid = readPid();
203
- const alive = pid > 0 && (await isAlive(pid));
204
- if (alive) {
205
- console.log(`BDS 运行中 (PID: ${pid})`);
107
+ setTimeout(resolve, 5e3);
108
+ }, 3e4)
109
+ )
110
+ ]);
111
+ if (p.process && p.process.exitCode === null) {
112
+ log.warn("\u5F3A\u5236\u7ED3\u675F\u8FDB\u7A0B...");
113
+ try {
114
+ p.process.kill("SIGKILL");
115
+ } catch {
206
116
  }
207
- else {
208
- console.log("BDS 未运行");
209
- clearPid();
117
+ }
118
+ } else {
119
+ log.info("BDS \u7531\u5916\u90E8\u542F\u52A8\uFF0C\u4F7F\u7528 taskkill...");
120
+ try {
121
+ if (process.platform === "win32") {
122
+ await execAsync("taskkill /f /im bedrock_server.exe", { windowsHide: true });
123
+ } else {
124
+ await execAsync("pkill -f bedrock_server", { windowsHide: true });
210
125
  }
211
- return alive;
212
- };
213
- const watch = async () => {
214
- log.info("启动监护模式...");
215
- while (true) {
216
- const pid = readPid();
217
- if (!pid || !(await isAlive(pid))) {
218
- try {
219
- await start();
220
- }
221
- catch (e) {
222
- log.error(`自动启动失败: ${e.message}`);
223
- }
224
- }
225
- await new Promise((r) => setTimeout(r, 5_000));
126
+ } catch {
127
+ }
128
+ }
129
+ clearPid();
130
+ p.process = null;
131
+ log.info("BDS \u5DF2\u505C\u6B62");
132
+ };
133
+ const start = async () => {
134
+ const p = ensureProc();
135
+ const existing = readPid();
136
+ if (existing && await isAlive(existing)) {
137
+ log.info("BDS \u5DF2\u5728\u8FD0\u884C\u4E2D");
138
+ return;
139
+ }
140
+ if (!fs.existsSync(p.exePath)) {
141
+ log.error(`\u672A\u627E\u5230 ${p.exePath}`);
142
+ throw new Error(`bedrock_server.exe \u4E0D\u5B58\u5728: ${p.exePath}`);
143
+ }
144
+ ensureEmitServerTelemetry(p.bdsPath, log);
145
+ log.info("\u6B63\u5728\u542F\u52A8 BDS...");
146
+ const child = spawn(p.exePath, [], {
147
+ cwd: p.bdsPath,
148
+ stdio: options.detached ? "ignore" : ["pipe", "pipe", "pipe"],
149
+ detached: options.detached,
150
+ windowsHide: true
151
+ });
152
+ if (options.detached) child.unref();
153
+ p.process = child;
154
+ writePid(child.pid ?? 0);
155
+ log.info(`BDS \u5DF2\u542F\u52A8 (PID: ${child.pid})`);
156
+ child.stdout?.on("data", (chunk) => {
157
+ const text = chunk.toString();
158
+ events.emit("output", text);
159
+ if (isMain()) process.stdout.write(text);
160
+ });
161
+ child.stderr?.on("data", (chunk) => {
162
+ const text = `[STDERR] ${chunk.toString()}`;
163
+ events.emit("output", text);
164
+ if (isMain()) process.stderr.write(text);
165
+ });
166
+ child.on("exit", (code) => {
167
+ log.info(`BDS \u5DF2\u9000\u51FA (code: ${code})`);
168
+ clearPid();
169
+ p.process = null;
170
+ if (!p.isManualStop && p.crashRestart && isMain()) {
171
+ log.info(`BDS \u610F\u5916\u9000\u51FA\uFF0C${p.crashDelayMs / 1e3}s \u540E\u81EA\u52A8\u91CD\u542F...`);
172
+ setTimeout(() => {
173
+ start().catch((e) => log.error(`\u81EA\u52A8\u91CD\u542F\u5931\u8D25: ${e.message}`));
174
+ }, p.crashDelayMs);
175
+ }
176
+ p.isManualStop = false;
177
+ });
178
+ };
179
+ const status = async () => {
180
+ const pid = readPid();
181
+ const alive = pid > 0 && await isAlive(pid);
182
+ if (alive) {
183
+ console.log(`BDS \u8FD0\u884C\u4E2D (PID: ${pid})`);
184
+ } else {
185
+ console.log("BDS \u672A\u8FD0\u884C");
186
+ clearPid();
187
+ }
188
+ return alive;
189
+ };
190
+ const watch = async () => {
191
+ log.info("\u542F\u52A8\u76D1\u62A4\u6A21\u5F0F...");
192
+ while (true) {
193
+ const pid = readPid();
194
+ if (!pid || !await isAlive(pid)) {
195
+ try {
196
+ await start();
197
+ } catch (e) {
198
+ log.error(`\u81EA\u52A8\u542F\u52A8\u5931\u8D25: ${e.message}`);
226
199
  }
227
- };
228
- const getPid = () => {
229
- const p = ensureProc();
230
- return p.process?.pid ?? readPid();
231
- };
232
- return {
233
- start,
234
- stop,
235
- status,
236
- sendCommand,
237
- watch,
238
- events,
239
- isManualStop: false,
240
- getPid,
241
- };
200
+ }
201
+ await new Promise((r) => setTimeout(r, 5e3));
202
+ }
203
+ };
204
+ const getPid = () => {
205
+ const p = ensureProc();
206
+ return p.process?.pid ?? readPid();
207
+ };
208
+ return {
209
+ start,
210
+ stop,
211
+ status,
212
+ sendCommand,
213
+ watch,
214
+ events,
215
+ isManualStop: false,
216
+ getPid
217
+ };
242
218
  }
243
- export const bdsEvents = new EventEmitter();
244
- export const bdsEvents_enabled = () => { bdsEvents.setMaxListeners(100); };
219
+ const bdsEvents = new EventEmitter();
220
+ const bdsEvents_enabled = () => {
221
+ bdsEvents.setMaxListeners(100);
222
+ };
245
223
  bdsEvents_enabled();
246
- /** 判断当前是否作为 CLI 主入口运行 */
247
224
  function isMain() {
248
- if (require.main === module)
249
- return true;
250
- // 兼容 CJS 编译产物的 require.main 不等于当前 module 场景
251
- // 若 process.argv[1] 指向本文件 → 主入口
252
- const entry = process.argv[1] ?? "";
253
- return entry.endsWith("bds-manager.js") || entry.endsWith("bds-manager.ts");
225
+ if (process.env.SFMC_SERVICE === "manager") return true;
226
+ return isMainModule(import.meta.url);
254
227
  }
255
- // CLI 入口
256
228
  if (isMain()) {
257
- const cmd = process.argv[2];
258
- const bds = createBdsManager();
259
- const args = process.argv.slice(3);
260
- switch (cmd) {
261
- case "start":
262
- bds.start().catch((e) => log.error(`启动失败: ${e.message}`));
263
- break;
264
- case "stop":
265
- bds.stop().catch((e) => log.error(`停止失败: ${e.message}`));
266
- break;
267
- case "restart":
268
- bds.stop()
269
- .then(() => bds.start())
270
- .catch((e) => log.error(`重启失败: ${e.message}`));
271
- break;
272
- case "status":
273
- bds.status();
274
- break;
275
- case "send":
276
- if (args[0])
277
- bds.sendCommand(args.join(" "));
278
- else
279
- console.log("用法: node bds-manager.js send <command>");
280
- break;
281
- case "watch":
282
- bds.watch().catch((e) => log.error(`监护异常: ${e.message}`));
283
- break;
284
- default:
285
- console.log(`用法:
286
- start 启动 BDS
287
- stop 停止
288
- restart 重启
289
- status 检查状态
290
- send <cmd> 发送命令
291
- watch 监护模式(崩溃自动重启)`);
292
- }
229
+ const cmd = process.argv[2];
230
+ const bds = createBdsManager();
231
+ const args = process.argv.slice(3);
232
+ switch (cmd) {
233
+ case "start":
234
+ bds.start().catch((e) => log.error(`\u542F\u52A8\u5931\u8D25: ${e.message}`));
235
+ break;
236
+ case "stop":
237
+ bds.stop().catch((e) => log.error(`\u505C\u6B62\u5931\u8D25: ${e.message}`));
238
+ break;
239
+ case "restart":
240
+ bds.stop().then(() => bds.start()).catch((e) => log.error(`\u91CD\u542F\u5931\u8D25: ${e.message}`));
241
+ break;
242
+ case "status":
243
+ bds.status();
244
+ break;
245
+ case "send":
246
+ if (args[0]) bds.sendCommand(args.join(" "));
247
+ else console.log("\u7528\u6CD5: node bds-manager.js send <command>");
248
+ break;
249
+ case "watch":
250
+ bds.watch().catch((e) => log.error(`\u76D1\u62A4\u5F02\u5E38: ${e.message}`));
251
+ break;
252
+ default:
253
+ console.log(`\u7528\u6CD5:
254
+ start \u542F\u52A8 BDS
255
+ stop \u505C\u6B62
256
+ restart \u91CD\u542F
257
+ status \u68C0\u67E5\u72B6\u6001
258
+ send <cmd> \u53D1\u9001\u547D\u4EE4
259
+ watch \u76D1\u62A4\u6A21\u5F0F\uFF08\u5D29\u6E83\u81EA\u52A8\u91CD\u542F\uFF09`);
260
+ }
293
261
  }
294
- //# sourceMappingURL=bds-manager.js.map
262
+ export {
263
+ bdsEvents,
264
+ bdsEvents_enabled,
265
+ createBdsManager
266
+ };
267
+ //# sourceMappingURL=bds-manager.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"bds-manager.js","sourceRoot":"","sources":["../src/bds-manager.ts"],"names":[],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/bds-manager.ts"],
4
+ "sourcesContent": ["/**\n * bds-manager.ts \u2014 BDS \u8FDB\u7A0B\u7BA1\u7406\u5668\n *\n * \u6539\u8FDB:\n * - \u4F18\u96C5 stop (\u53D1\u9001 stop \u547D\u4EE4 \u2192 \u7B49\u5F85\u9000\u51FA \u2192 SIGTERM \u2192 SIGKILL)\n * - watchdog (\u5D29\u6E83\u81EA\u52A8\u91CD\u542F)\n * - \u5355\u4F8B\u4E8B\u4EF6\u53D1\u5C04\u5668\n * - \u5B8C\u5168\u5F02\u6B65 (fs/promises)\n */\n\nimport { spawn, exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport { isMainModule } from \"./is-main.js\";\nimport { ensureStateDir, loadConfig, PID_FILE } from \"./paths.js\";\nimport { log } from \"./log.js\";\nimport { ensureEmitServerTelemetry } from \"./server-properties.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface BdsManager {\n start(): Promise<void>;\n stop(): Promise<void>;\n status(): Promise<boolean>;\n sendCommand(cmd: string): boolean;\n watch(): Promise<void>;\n events: EventEmitter;\n isManualStop: boolean;\n getPid(): number;\n}\n\nexport interface BdsManagerOptions {\n detached?: boolean;\n}\n\ninterface CachedProc {\n process: ReturnType<typeof spawn> | null;\n isManualStop: boolean;\n crashRestart: boolean;\n crashDelayMs: number;\n exePath: string;\n bdsPath: string;\n}\n\nlet cached: CachedProc | null = null;\n\nfunction readPid(): number {\n try {\n return parseInt(fs.readFileSync(PID_FILE, \"utf-8\").trim(), 10) || 0;\n } catch {\n return 0;\n }\n}\n\nfunction writePid(pid: number): void {\n try {\n ensureStateDir();\n fs.writeFileSync(PID_FILE, String(pid));\n } catch {\n /* ignore */\n }\n}\n\nfunction clearPid(): void {\n try {\n if (fs.existsSync(PID_FILE)) fs.unlinkSync(PID_FILE);\n } catch {\n /* ignore */\n }\n}\n\nasync function isAlive(pid: number): Promise<boolean> {\n if (!pid) return false;\n try {\n if (process.platform === \"win32\") {\n const { stdout } = await execAsync(`tasklist /fi \"PID eq ${pid}\" /nh`, { windowsHide: true });\n return stdout.includes(String(pid));\n }\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction ensureProc(): CachedProc {\n if (cached) return cached;\n const cfg = loadConfig();\n const bds_path = path.resolve(cfg.bds_path || process.cwd());\n const exePath = path.join(bds_path, \"bedrock_server.exe\");\n\n cached = {\n process: null,\n isManualStop: false,\n crashRestart: cfg.crash_restart !== false,\n crashDelayMs: (cfg.crash_restart_delay ?? 5) * 1000,\n exePath,\n bdsPath: bds_path,\n };\n return cached;\n}\n\nexport function createBdsManager(options: BdsManagerOptions = {}): BdsManager {\n const events = new EventEmitter();\n events.setMaxListeners(100);\n\n const sendCommand = (cmd: string): boolean => {\n const p = ensureProc();\n const pid = readPid();\n if (!pid || !isAlive(pid)) {\n log.warn(\"BDS \u672A\u8FD0\u884C\");\n return false;\n }\n if (p.process && p.process.pid === pid && p.process.stdin) {\n try {\n p.process.stdin.write(cmd + \"\\n\");\n log.info(`\u5DF2\u53D1\u9001\u547D\u4EE4: ${cmd}`);\n return true;\n } catch {\n return false;\n }\n }\n log.warn(\"BDS \u7531\u5916\u90E8\u542F\u52A8\uFF0C\u65E0\u6CD5\u53D1\u9001\u547D\u4EE4\u5230 stdin\");\n return false;\n };\n\n const stop = async (): Promise<void> => {\n const p = ensureProc();\n const pid = readPid();\n if (!pid || !(await isAlive(pid))) {\n log.info(\"BDS \u672A\u8FD0\u884C\");\n clearPid();\n return;\n }\n\n if (p.process && p.process.pid === pid && p.process.stdin) {\n p.isManualStop = true;\n log.info(\"\u6B63\u5728\u5173\u95ED BDS...\");\n try {\n p.process.stdin.write(\"stop\\n\");\n } catch (e) {\n log.warn(`\u53D1\u9001 stop \u547D\u4EE4\u5931\u8D25: ${(e as Error).message}`);\n }\n\n await Promise.race([\n new Promise<void>((resolve) => p.process?.once(\"exit\", () => resolve())),\n new Promise<void>((resolve) =>\n setTimeout(() => {\n log.warn(\"30s \u8D85\u65F6\uFF0C\u5F3A\u5236\u7EC8\u6B62...\");\n try { p.process?.kill(\"SIGTERM\"); } catch {}\n setTimeout(resolve, 5000);\n }, 30_000)\n ),\n ]);\n\n if (p.process && p.process.exitCode === null) {\n log.warn(\"\u5F3A\u5236\u7ED3\u675F\u8FDB\u7A0B...\");\n try { p.process.kill(\"SIGKILL\"); } catch {}\n }\n } else {\n // \u5916\u90E8\u542F\u52A8\u7684 BDS \u2014 fallback \u4F7F\u7528 taskkill / pkill\n log.info(\"BDS \u7531\u5916\u90E8\u542F\u52A8\uFF0C\u4F7F\u7528 taskkill...\");\n try {\n if (process.platform === \"win32\") {\n await execAsync(\"taskkill /f /im bedrock_server.exe\", { windowsHide: true });\n } else {\n await execAsync(\"pkill -f bedrock_server\", { windowsHide: true });\n }\n } catch {\n /* ignore */\n }\n }\n\n clearPid();\n p.process = null;\n log.info(\"BDS \u5DF2\u505C\u6B62\");\n };\n\n const start = async (): Promise<void> => {\n const p = ensureProc();\n const existing = readPid();\n if (existing && (await isAlive(existing))) {\n log.info(\"BDS \u5DF2\u5728\u8FD0\u884C\u4E2D\");\n return;\n }\n\n if (!fs.existsSync(p.exePath)) {\n log.error(`\u672A\u627E\u5230 ${p.exePath}`);\n throw new Error(`bedrock_server.exe \u4E0D\u5B58\u5728: ${p.exePath}`);\n }\n\n // \u542F\u52A8\u524D\u5E42\u7B49\u786E\u4FDD\u9065\u6D4B\u5F00\u5173\uFF08\u5B89\u88C5\u9636\u6BB5\u4E5F\u4F1A\u5199\uFF1B\u65E7\u76EE\u5F55\u9996\u6B21\u542F\u52A8\u65F6\u8865\u4E0A\uFF09\n ensureEmitServerTelemetry(p.bdsPath, log);\n\n log.info(\"\u6B63\u5728\u542F\u52A8 BDS...\");\n const child = spawn(p.exePath, [], {\n cwd: p.bdsPath,\n stdio: options.detached ? \"ignore\" : [\"pipe\", \"pipe\", \"pipe\"],\n detached: options.detached,\n windowsHide: true,\n });\n\n if (options.detached) child.unref();\n\n p.process = child;\n writePid(child.pid ?? 0);\n log.info(`BDS \u5DF2\u542F\u52A8 (PID: ${child.pid})`);\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString();\n events.emit(\"output\", text);\n if (isMain()) process.stdout.write(text);\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n const text = `[STDERR] ${chunk.toString()}`;\n events.emit(\"output\", text);\n if (isMain()) process.stderr.write(text);\n });\n\n child.on(\"exit\", (code) => {\n log.info(`BDS \u5DF2\u9000\u51FA (code: ${code})`);\n clearPid();\n p.process = null;\n if (!p.isManualStop && p.crashRestart && isMain()) {\n log.info(`BDS \u610F\u5916\u9000\u51FA\uFF0C${p.crashDelayMs / 1000}s \u540E\u81EA\u52A8\u91CD\u542F...`);\n setTimeout(() => {\n start().catch((e) => log.error(`\u81EA\u52A8\u91CD\u542F\u5931\u8D25: ${e.message}`));\n }, p.crashDelayMs);\n }\n p.isManualStop = false;\n });\n };\n\n const status = async (): Promise<boolean> => {\n const pid = readPid();\n const alive = pid > 0 && (await isAlive(pid));\n if (alive) {\n console.log(`BDS \u8FD0\u884C\u4E2D (PID: ${pid})`);\n } else {\n console.log(\"BDS \u672A\u8FD0\u884C\");\n clearPid();\n }\n return alive;\n };\n\n const watch = async (): Promise<void> => {\n log.info(\"\u542F\u52A8\u76D1\u62A4\u6A21\u5F0F...\");\n while (true) {\n const pid = readPid();\n if (!pid || !(await isAlive(pid))) {\n try { await start(); }\n catch (e) { log.error(`\u81EA\u52A8\u542F\u52A8\u5931\u8D25: ${(e as Error).message}`); }\n }\n await new Promise((r) => setTimeout(r, 5_000));\n }\n };\n\n const getPid = (): number => {\n const p = ensureProc();\n return p.process?.pid ?? readPid();\n };\n\n return {\n start,\n stop,\n status,\n sendCommand,\n watch,\n events,\n isManualStop: false,\n getPid,\n };\n}\n\nexport const bdsEvents: EventEmitter = new EventEmitter();\nexport const bdsEvents_enabled = (): void => { bdsEvents.setMaxListeners(100); };\nbdsEvents_enabled();\n\n/** \u5224\u65AD\u5F53\u524D\u662F\u5426\u4F5C\u4E3A CLI \u4E3B\u5165\u53E3\u8FD0\u884C\uFF08\u88AB check-update \u7B49 import \u65F6\u4E3A false\uFF09 */\nfunction isMain(): boolean {\n // sfmc supervisor \u901A\u8FC7 SFMC_SERVICE \u62C9\u8D77\u5B50\u8FDB\u7A0B\u65F6\u4F18\u5148\u5224\u5B9A\uFF08\u4E0E check-update \u5BF9\u79F0\uFF09\n if (process.env.SFMC_SERVICE === \"manager\") return true;\n return isMainModule(import.meta.url);\n}\n\n// CLI \u5165\u53E3\nif (isMain()) {\n const cmd = process.argv[2];\n const bds = createBdsManager();\n const args = process.argv.slice(3);\n\n switch (cmd) {\n case \"start\":\n bds.start().catch((e) => log.error(`\u542F\u52A8\u5931\u8D25: ${e.message}`));\n break;\n case \"stop\":\n bds.stop().catch((e) => log.error(`\u505C\u6B62\u5931\u8D25: ${e.message}`));\n break;\n case \"restart\":\n bds.stop()\n .then(() => bds.start())\n .catch((e) => log.error(`\u91CD\u542F\u5931\u8D25: ${e.message}`));\n break;\n case \"status\":\n bds.status();\n break;\n case \"send\":\n if (args[0]) bds.sendCommand(args.join(\" \"));\n else console.log(\"\u7528\u6CD5: node bds-manager.js send <command>\");\n break;\n case \"watch\":\n bds.watch().catch((e) => log.error(`\u76D1\u62A4\u5F02\u5E38: ${e.message}`));\n break;\n default:\n console.log(`\u7528\u6CD5:\n start \u542F\u52A8 BDS\n stop \u505C\u6B62\n restart \u91CD\u542F\n status \u68C0\u67E5\u72B6\u6001\n send <cmd> \u53D1\u9001\u547D\u4EE4\n watch \u76D1\u62A4\u6A21\u5F0F\uFF08\u5D29\u6E83\u81EA\u52A8\u91CD\u542F\uFF09`);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }