@wendongfly/myhi 1.3.51 → 1.3.53
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/bin/daemon.js +31 -1
- package/dist/chat.html +6 -0
- package/dist/index.js +1 -1
- package/dist/index.min.js +101 -91
- package/package.json +1 -1
package/bin/daemon.js
CHANGED
|
@@ -17,6 +17,36 @@ const pidFile = join(configDir, 'daemon.pid');
|
|
|
17
17
|
const serverEntry = join(__dirname, '../dist/index.js');
|
|
18
18
|
|
|
19
19
|
mkdirSync(configDir, { recursive: true });
|
|
20
|
+
|
|
21
|
+
// 单例守卫:如果已有活 daemon,先 SIGTERM 它再启动。否则双 daemon 会让各自的
|
|
22
|
+
// server child 因互读 server.pid 而互杀,触发"连续崩溃 5 次"熔断(pc41 1.3.51 升级踩到)
|
|
23
|
+
(function killOldDaemon() {
|
|
24
|
+
let oldPid;
|
|
25
|
+
try { oldPid = parseInt(readFileSync(pidFile, 'utf8').trim(), 10); } catch { return; }
|
|
26
|
+
if (!oldPid || oldPid === process.pid) return;
|
|
27
|
+
let alive = false;
|
|
28
|
+
try { process.kill(oldPid, 0); alive = true; } catch {}
|
|
29
|
+
if (!alive) return;
|
|
30
|
+
process.stderr.write(`[daemon] 检测到已运行的 daemon (PID ${oldPid}),先停止...\n`);
|
|
31
|
+
try {
|
|
32
|
+
if (process.platform === 'win32') execSync(`taskkill /PID ${oldPid} /F /T`, { stdio: 'pipe', timeout: 5000 });
|
|
33
|
+
else process.kill(oldPid, 'SIGTERM');
|
|
34
|
+
} catch {}
|
|
35
|
+
// 等最多 5 秒
|
|
36
|
+
const deadline = Date.now() + 5000;
|
|
37
|
+
while (Date.now() < deadline) {
|
|
38
|
+
try { process.kill(oldPid, 0); } catch { return; }
|
|
39
|
+
const end = Date.now() + 200;
|
|
40
|
+
while (Date.now() < end) {} // busy-wait, 此处无事件循环可用
|
|
41
|
+
}
|
|
42
|
+
let stillAlive = false;
|
|
43
|
+
try { process.kill(oldPid, 0); stillAlive = true; } catch {}
|
|
44
|
+
if (stillAlive) {
|
|
45
|
+
process.stderr.write(`[daemon] 无法停止旧 daemon (PID ${oldPid}),本进程退出避免冲突\n`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
})();
|
|
49
|
+
|
|
20
50
|
writeFileSync(pidFile, String(process.pid));
|
|
21
51
|
|
|
22
52
|
let child = null;
|
|
@@ -35,7 +65,7 @@ function startServer() {
|
|
|
35
65
|
log('启动 server 子进程...');
|
|
36
66
|
child = fork(serverEntry, process.argv.slice(2), {
|
|
37
67
|
stdio: ['ignore', 'inherit', 'inherit', 'ipc'],
|
|
38
|
-
env: { ...process.env, MYHI_DAEMON: '1' },
|
|
68
|
+
env: { ...process.env, MYHI_DAEMON: '1', MYHI_DAEMON_PID: String(process.pid) },
|
|
39
69
|
windowsHide: true,
|
|
40
70
|
});
|
|
41
71
|
|
package/dist/chat.html
CHANGED
|
@@ -3007,6 +3007,12 @@
|
|
|
3007
3007
|
try {
|
|
3008
3008
|
const resp = await fetch('/api/update', { method: 'POST' });
|
|
3009
3009
|
const data = await resp.json();
|
|
3010
|
+
if (!data.ok) {
|
|
3011
|
+
addStatusMessage('更新失败:' + (data.error || '未知错误'));
|
|
3012
|
+
badge.textContent = '⬆ 更新失败';
|
|
3013
|
+
badge.style.color = '#f85149';
|
|
3014
|
+
return;
|
|
3015
|
+
}
|
|
3010
3016
|
addStatusMessage(data.message || '升级中...');
|
|
3011
3017
|
badge.textContent = '⬆ 重启中...';
|
|
3012
3018
|
// 等待服务重启后自动刷新
|