mslxdff 0.1.74 → 0.1.75

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 +39 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mslxdff",
3
- "version": "0.1.74",
3
+ "version": "0.1.75",
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
 
@@ -144,13 +144,48 @@ async function linuxEnable() {
144
144
  } catch (e) {
145
145
  return { ok: false, error: `write unit failed: ${e.message}` };
146
146
  }
147
+ // best-effort: enable linger so user service survives logout/SSH disconnect
148
+ let lingerRes = null;
149
+ try {
150
+ let who = "";
151
+ try { who = userInfo().username; } catch {}
152
+ who = who || process.env.USER || process.env.USERNAME || process.env.LOGNAME || "";
153
+ if (who) {
154
+ const lr = await execAsync("loginctl", ["enable-linger", who]);
155
+ lingerRes = lr.err ? (lr.stderr || lr.stdout || lr.err.message || "").slice(0, 200) : "ok";
156
+ }
157
+ } catch {}
158
+ // stop bare detached daemon that may hold the port, let systemd take over (best-effort)
159
+ try {
160
+ const { readPid, isPidAlive } = await import("../daemon.js");
161
+ const { existsSync: exists2, readFileSync: read2 } = await import("node:fs");
162
+ // Only stop if pid exists and is alive and not already managed by systemd
163
+ const pidFile = join(homedir(), ".config", "mslxdff", "daemon.pid");
164
+ if (exists2(pidFile)) {
165
+ const raw = read2(pidFile, "utf8").trim().split("\n")[0];
166
+ const pid = Number(raw);
167
+ if (Number.isInteger(pid) && pid > 0) {
168
+ try { if (isPidAlive(pid)) { const { stopDaemon } = await import("../daemon.js"); stopDaemon(); await new Promise((r2) => setTimeout(r2, 600)); } } catch {}
169
+ }
170
+ } else {
171
+ // No pid file, try generic stop (no-op if none)
172
+ try { const { stopDaemon } = await import("../daemon.js"); stopDaemon(); } catch {}
173
+ }
174
+ } catch {}
147
175
  let r = await execAsync("systemctl", ["--user", "daemon-reload"]);
148
176
  if (r.err) return { ok: false, error: (r.stderr || r.stdout).slice(0, 500) };
149
177
  r = await execAsync("systemctl", ["--user", "enable", SERVICE_NAME]);
150
178
  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 };
179
+ r = await execAsync("systemctl", ["--user", "start", SERVICE_NAME]);
180
+ // Verify actually active; if not, surface journal hint
181
+ const chk = await execAsync("systemctl", ["--user", "is-active", SERVICE_NAME]);
182
+ const active = !chk.err && /active/i.test(chk.stdout);
183
+ if (!active) {
184
+ const st = await execAsync("systemctl", ["--user", "status", SERVICE_NAME, "--no-pager", "-l"]);
185
+ const hint = (st.stdout || st.stderr || r.stderr || r.stdout || "").slice(0, 600);
186
+ return { ok: false, error: `start failed (not active): ${hint || "check journalctl --user -u mslxdff"}`, unit, linger: lingerRes };
187
+ }
188
+ return { ok: true, method: "systemd:user", unit, linger: lingerRes };
154
189
  }
155
190
 
156
191
  async function linuxDisable() {