mslxdff 0.1.74 → 0.1.76

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/autostart.js +41 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mslxdff",
3
- "version": "0.1.74",
3
+ "version": "0.1.76",
4
4
  "description": "测试项目,请勿使用。",
5
5
  "type": "module",
6
6
  "bin": {
package/src/autostart.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { existsSync, mkdirSync, writeFileSync, readFileSync, rmSync } from "node:fs";
3
- import { homedir } from "node:os";
3
+ import { homedir, userInfo } from "node:os";
4
4
  import { join, dirname } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
 
@@ -127,7 +127,8 @@ After=network.target
127
127
 
128
128
  [Service]
129
129
  Type=simple
130
- ExecStart=${node} ${script}
130
+ Environment=MSLXDFF_DAEMON=1
131
+ ExecStart=${node} ${script} --daemon
131
132
  Restart=always
132
133
  RestartSec=3
133
134
 
@@ -144,13 +145,48 @@ async function linuxEnable() {
144
145
  } catch (e) {
145
146
  return { ok: false, error: `write unit failed: ${e.message}` };
146
147
  }
148
+ // best-effort: enable linger so user service survives logout/SSH disconnect
149
+ let lingerRes = null;
150
+ try {
151
+ let who = "";
152
+ try { who = userInfo().username; } catch {}
153
+ who = who || process.env.USER || process.env.USERNAME || process.env.LOGNAME || "";
154
+ if (who) {
155
+ const lr = await execAsync("loginctl", ["enable-linger", who]);
156
+ lingerRes = lr.err ? (lr.stderr || lr.stdout || lr.err.message || "").slice(0, 200) : "ok";
157
+ }
158
+ } catch {}
159
+ // stop bare detached daemon that may hold the port, let systemd take over (best-effort)
160
+ try {
161
+ const { readPid, isPidAlive } = await import("../daemon.js");
162
+ const { existsSync: exists2, readFileSync: read2 } = await import("node:fs");
163
+ // Only stop if pid exists and is alive and not already managed by systemd
164
+ const pidFile = join(homedir(), ".config", "mslxdff", "daemon.pid");
165
+ if (exists2(pidFile)) {
166
+ const raw = read2(pidFile, "utf8").trim().split("\n")[0];
167
+ const pid = Number(raw);
168
+ if (Number.isInteger(pid) && pid > 0) {
169
+ try { if (isPidAlive(pid)) { const { stopDaemon } = await import("../daemon.js"); stopDaemon(); await new Promise((r2) => setTimeout(r2, 600)); } } catch {}
170
+ }
171
+ } else {
172
+ // No pid file, try generic stop (no-op if none)
173
+ try { const { stopDaemon } = await import("../daemon.js"); stopDaemon(); } catch {}
174
+ }
175
+ } catch {}
147
176
  let r = await execAsync("systemctl", ["--user", "daemon-reload"]);
148
177
  if (r.err) return { ok: false, error: (r.stderr || r.stdout).slice(0, 500) };
149
178
  r = await execAsync("systemctl", ["--user", "enable", SERVICE_NAME]);
150
179
  if (r.err) return { ok: false, error: (r.stderr || r.stdout).slice(0, 500) };
151
- // 可选立即拉起(不强求)
152
- await execAsync("systemctl", ["--user", "start", SERVICE_NAME]);
153
- return { ok: true, method: "systemd:user", unit };
180
+ r = await execAsync("systemctl", ["--user", "start", SERVICE_NAME]);
181
+ // Verify actually active; if not, surface journal hint
182
+ const chk = await execAsync("systemctl", ["--user", "is-active", SERVICE_NAME]);
183
+ const active = !chk.err && /active/i.test(chk.stdout);
184
+ if (!active) {
185
+ const st = await execAsync("systemctl", ["--user", "status", SERVICE_NAME, "--no-pager", "-l"]);
186
+ const hint = (st.stdout || st.stderr || r.stderr || r.stdout || "").slice(0, 600);
187
+ return { ok: false, error: `start failed (not active): ${hint || "check journalctl --user -u mslxdff"}`, unit, linger: lingerRes };
188
+ }
189
+ return { ok: true, method: "systemd:user", unit, linger: lingerRes };
154
190
  }
155
191
 
156
192
  async function linuxDisable() {