@markus-global/cli 0.7.7 → 0.7.8-rc.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/tray.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * Launches the server on start, provides "Open Console" and "Quit" controls.
4
4
  */
5
5
  import { spawn, exec, execSync } from 'node:child_process';
6
- import { readFileSync, existsSync, mkdirSync, appendFileSync, openSync } from 'node:fs';
6
+ import { readFileSync, existsSync, mkdirSync, appendFileSync, openSync, writeFileSync, unlinkSync } from 'node:fs';
7
7
  import { get as httpGet } from 'node:http';
8
8
  import { createConnection } from 'node:net';
9
9
  import { resolve, dirname, join } from 'node:path';
@@ -18,6 +18,8 @@ const BIN_DIR = __dirname;
18
18
  const APP_DIR = resolve(BIN_DIR, '..');
19
19
  const LOG_DIR = resolve(homedir(), '.markus', 'logs');
20
20
  const LOG_FILE = join(LOG_DIR, 'tray-stderr.log');
21
+ const MARKUS_DIR = resolve(homedir(), '.markus');
22
+ const LOCK_FILE = join(MARKUS_DIR, 'tray.lock');
21
23
  const STRINGS = {
22
24
  en: {
23
25
  openUI: 'Open Console',
@@ -46,6 +48,14 @@ function detectLocale() {
46
48
  }
47
49
  catch { /* ignore */ }
48
50
  }
51
+ if (platform() === 'win32') {
52
+ try {
53
+ const winLang = execSync('powershell -NoProfile -Command "(Get-Culture).Name"', { encoding: 'utf-8' }).trim();
54
+ if (winLang.startsWith('zh'))
55
+ return 'zh';
56
+ }
57
+ catch { /* ignore */ }
58
+ }
49
59
  return 'en';
50
60
  }
51
61
  const t = STRINGS[detectLocale()];
@@ -77,6 +87,121 @@ function openBrowser(url) {
77
87
  trayLog(`openBrowser failed: ${err.message}`);
78
88
  });
79
89
  }
90
+ // ── Singleton lock ────────────────────────────────────────────────────────────
91
+ function isProcessAlive(pid) {
92
+ try {
93
+ process.kill(pid, 0);
94
+ return true;
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ function acquireLock() {
101
+ try {
102
+ mkdirSync(MARKUS_DIR, { recursive: true });
103
+ if (existsSync(LOCK_FILE)) {
104
+ const pid = parseInt(readFileSync(LOCK_FILE, 'utf-8').trim(), 10);
105
+ if (pid && !isNaN(pid) && isProcessAlive(pid)) {
106
+ return false;
107
+ }
108
+ }
109
+ writeFileSync(LOCK_FILE, String(process.pid));
110
+ return true;
111
+ }
112
+ catch {
113
+ return true;
114
+ }
115
+ }
116
+ function releaseLock() {
117
+ try {
118
+ if (existsSync(LOCK_FILE)) {
119
+ const pid = parseInt(readFileSync(LOCK_FILE, 'utf-8').trim(), 10);
120
+ if (pid === process.pid)
121
+ unlinkSync(LOCK_FILE);
122
+ }
123
+ }
124
+ catch { /* ignore */ }
125
+ }
126
+ // ── Port / process helpers ────────────────────────────────────────────────────
127
+ function getPortOccupant(port) {
128
+ try {
129
+ if (platform() === 'win32') {
130
+ const out = execSync(`netstat -ano | findstr ":${port}" | findstr "LISTENING"`, { encoding: 'utf-8', timeout: 5000 }).trim();
131
+ const firstLine = out.split('\n')[0]?.trim();
132
+ if (!firstLine)
133
+ return 'unknown';
134
+ const pid = firstLine.split(/\s+/).pop();
135
+ if (!pid || pid === '0')
136
+ return 'unknown';
137
+ const taskInfo = execSync(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`, { encoding: 'utf-8', timeout: 5000 }).trim();
138
+ return taskInfo.split(',')[0]?.replace(/"/g, '') || 'unknown';
139
+ }
140
+ else {
141
+ return execSync(`lsof -i :${port} -sTCP:LISTEN -t 2>/dev/null | head -1 | xargs ps -p -o comm= 2>/dev/null`, { encoding: 'utf-8', timeout: 5000 }).trim() || 'unknown';
142
+ }
143
+ }
144
+ catch {
145
+ return 'unknown';
146
+ }
147
+ }
148
+ function getPidsByPort(port) {
149
+ try {
150
+ if (platform() === 'win32') {
151
+ const out = execSync(`netstat -ano | findstr ":${port}" | findstr "LISTENING"`, { encoding: 'utf-8', timeout: 5000 }).trim();
152
+ if (!out)
153
+ return [];
154
+ const pids = new Set();
155
+ for (const line of out.split('\n')) {
156
+ const pid = parseInt(line.trim().split(/\s+/).pop() ?? '', 10);
157
+ if (pid && !isNaN(pid) && pid !== 0)
158
+ pids.add(pid);
159
+ }
160
+ return [...pids];
161
+ }
162
+ else {
163
+ const out = execSync(`lsof -i :${port} -sTCP:LISTEN -t 2>/dev/null`, { encoding: 'utf-8', timeout: 5000 }).trim();
164
+ if (!out)
165
+ return [];
166
+ return out.split('\n').map(s => parseInt(s.trim(), 10)).filter(n => n && !isNaN(n));
167
+ }
168
+ }
169
+ catch {
170
+ return [];
171
+ }
172
+ }
173
+ function killPid(pid) {
174
+ try {
175
+ if (platform() === 'win32') {
176
+ execSync(`taskkill /PID ${pid} /F`, { stdio: 'ignore', timeout: 5000 });
177
+ }
178
+ else {
179
+ process.kill(pid, 'SIGTERM');
180
+ }
181
+ }
182
+ catch { /* ignore */ }
183
+ }
184
+ function forceKillPid(pid) {
185
+ try {
186
+ if (platform() === 'win32') {
187
+ execSync(`taskkill /PID ${pid} /F`, { stdio: 'ignore', timeout: 5000 });
188
+ }
189
+ else {
190
+ process.kill(pid, 'SIGKILL');
191
+ }
192
+ }
193
+ catch { /* ignore */ }
194
+ }
195
+ function showPortConflictDialog(port, occupant) {
196
+ const msg = t.portConflictMsg(port, occupant);
197
+ if (platform() === 'darwin') {
198
+ exec(`osascript -e 'display dialog "${msg}" with title "${t.portConflictTitle}" buttons {"OK"} default button "OK" with icon stop'`, () => { });
199
+ }
200
+ else if (platform() === 'win32') {
201
+ const escaped = msg.replace(/'/g, "''");
202
+ exec(`powershell -NoProfile -Command "Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.MessageBox]::Show('${escaped}','${t.portConflictTitle}','OK','Error')"`, () => { });
203
+ }
204
+ }
80
205
  function isPortListening(port) {
81
206
  return new Promise((res) => {
82
207
  const socket = createConnection({ port, host: '127.0.0.1' }, () => { socket.destroy(); res(true); });
@@ -123,6 +248,11 @@ function resolveMarkusCommand() {
123
248
  const wrapper = resolve(APP_DIR, 'markus');
124
249
  if (existsSync(wrapper))
125
250
  return { cmd: wrapper, args: ['start'] };
251
+ if (platform() === 'win32') {
252
+ const wrapperCmd = resolve(APP_DIR, 'markus.cmd');
253
+ if (existsSync(wrapperCmd))
254
+ return { cmd: wrapperCmd, args: ['start'] };
255
+ }
126
256
  const markusBin = resolve(BIN_DIR, 'Markus');
127
257
  const nodeBin = platform() === 'darwin' && existsSync(markusBin) ? markusBin : resolve(BIN_DIR, platform() === 'win32' ? 'node.exe' : 'node');
128
258
  const markusMjs = resolve(BIN_DIR, 'markus.mjs');
@@ -138,19 +268,11 @@ async function ensureServerRunning() {
138
268
  openBrowser(WEB_UI_URL);
139
269
  return;
140
270
  }
141
- // Port occupied by a non-Markus process
142
- let occupant = 'unknown';
143
- try {
144
- occupant = execSync(`lsof -i :${WEB_UI_PORT} -sTCP:LISTEN -t 2>/dev/null | head -1 | xargs ps -p -o comm= 2>/dev/null`, { encoding: 'utf-8' }).trim() || 'unknown';
145
- }
146
- catch { /* ignore */ }
271
+ const occupant = getPortOccupant(WEB_UI_PORT);
147
272
  trayLog(`Port ${WEB_UI_PORT} occupied by "${occupant}"`);
148
- if (platform() === 'darwin') {
149
- exec(`osascript -e 'display dialog "${t.portConflictMsg(WEB_UI_PORT, occupant)}" with title "${t.portConflictTitle}" buttons {"OK"} default button "OK" with icon stop'`, () => { });
150
- }
273
+ showPortConflictDialog(WEB_UI_PORT, occupant);
151
274
  return;
152
275
  }
153
- // Start the server
154
276
  mkdirSync(LOG_DIR, { recursive: true });
155
277
  const { cmd, args } = resolveMarkusCommand();
156
278
  trayLog(`Starting server: ${cmd} ${args.join(' ')}`);
@@ -160,6 +282,7 @@ async function ensureServerRunning() {
160
282
  stdio: ['ignore', outFd, errFd],
161
283
  detached: false,
162
284
  env: { ...process.env, NO_BROWSER: '1' },
285
+ windowsHide: true,
163
286
  });
164
287
  serverProcess.on('exit', (code) => {
165
288
  if (code && code !== 0)
@@ -182,7 +305,6 @@ async function ensureServerRunning() {
182
305
  /** Stop all Markus server processes and prevent LaunchAgent from restarting. */
183
306
  function killServer() {
184
307
  trayLog('Stopping server...');
185
- // Unload LaunchAgent first so launchd won't auto-restart the process
186
308
  if (platform() === 'darwin') {
187
309
  try {
188
310
  const uid = execSync('id -u', { encoding: 'utf-8' }).trim();
@@ -191,36 +313,44 @@ function killServer() {
191
313
  }
192
314
  catch { /* not loaded or already unloaded */ }
193
315
  }
194
- // Kill the child process we spawned (if any)
195
316
  if (serverProcess) {
196
- serverProcess.kill('SIGTERM');
317
+ if (platform() === 'win32') {
318
+ try {
319
+ execSync(`taskkill /PID ${serverProcess.pid} /T /F`, { stdio: 'ignore', timeout: 5000 });
320
+ }
321
+ catch { /* ignore */ }
322
+ }
323
+ else {
324
+ serverProcess.kill('SIGTERM');
325
+ }
197
326
  serverProcess = null;
198
327
  }
199
- // Also find and kill any Markus process on the port (may have been started
200
- // externally, by LaunchAgent, or a previous tray session)
201
- const killByPort = (signal) => {
202
- try {
203
- const pids = execSync(`lsof -i :${WEB_UI_PORT} -sTCP:LISTEN -t 2>/dev/null`, { encoding: 'utf-8' }).trim();
204
- if (!pids)
205
- return;
206
- for (const pid of pids.split('\n')) {
207
- const p = pid.trim();
208
- if (p && p !== String(process.pid)) {
209
- trayLog(`Sending ${signal} to server process ${p}`);
210
- process.kill(Number(p), signal);
211
- }
212
- }
328
+ const pids = getPidsByPort(WEB_UI_PORT).filter(p => p !== process.pid);
329
+ for (const pid of pids) {
330
+ trayLog(`Killing server process ${pid}`);
331
+ killPid(pid);
332
+ }
333
+ setTimeout(() => {
334
+ const remaining = getPidsByPort(WEB_UI_PORT).filter(p => p !== process.pid);
335
+ for (const pid of remaining) {
336
+ trayLog(`Force killing server process ${pid}`);
337
+ forceKillPid(pid);
213
338
  }
214
- catch { /* no process on port */ }
215
- };
216
- killByPort('SIGTERM');
217
- // Force kill after 3 seconds if still alive
218
- setTimeout(() => killByPort('SIGKILL'), 3000);
339
+ }, 3000);
219
340
  }
220
341
  // ── Tray setup ───────────────────────────────────────────────────────────────
221
342
  let tray = null;
222
343
  async function main() {
223
344
  trayLog(`Tray starting (locale=${detectLocale()}, pid=${process.pid})`);
345
+ if (!acquireLock()) {
346
+ trayLog('Another tray instance is already running — opening browser and exiting');
347
+ openBrowser(WEB_UI_URL);
348
+ setTimeout(() => process.exit(0), 1000);
349
+ return;
350
+ }
351
+ process.on('exit', releaseLock);
352
+ process.on('SIGINT', () => { releaseLock(); process.exit(0); });
353
+ process.on('SIGTERM', () => { releaseLock(); process.exit(0); });
224
354
  tray = new SysTray({
225
355
  menu: {
226
356
  icon: loadIconBase64(),
@@ -244,6 +374,7 @@ async function main() {
244
374
  trayLog('Quit requested');
245
375
  killServer();
246
376
  setTimeout(async () => {
377
+ releaseLock();
247
378
  if (tray)
248
379
  await tray.kill(false);
249
380
  process.exit(0);
@@ -257,6 +388,7 @@ async function main() {
257
388
  }
258
389
  main().catch((err) => {
259
390
  trayLog(`Tray failed to start: ${err}`);
391
+ releaseLock();
260
392
  process.exit(1);
261
393
  });
262
394
  //# sourceMappingURL=tray.js.map
package/dist/tray.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tray.js","sourceRoot":"","sources":["../src/tray.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tray.js","sourceRoot":"","sources":["../src/tray.ts"],"names":[],"mappings":"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"}
package/dist/tray.mjs CHANGED
@@ -3,7 +3,7 @@ const require = createRequire(import.meta.url);
3
3
 
4
4
  // src/tray.ts
5
5
  import { spawn, exec, execSync } from "node:child_process";
6
- import { readFileSync, existsSync, mkdirSync, appendFileSync, openSync } from "node:fs";
6
+ import { readFileSync, existsSync, mkdirSync, appendFileSync, openSync, writeFileSync, unlinkSync } from "node:fs";
7
7
  import { get as httpGet } from "node:http";
8
8
  import { createConnection } from "node:net";
9
9
  import { resolve, dirname, join } from "node:path";
@@ -18,6 +18,8 @@ var BIN_DIR = __dirname;
18
18
  var APP_DIR = resolve(BIN_DIR, "..");
19
19
  var LOG_DIR = resolve(homedir(), ".markus", "logs");
20
20
  var LOG_FILE = join(LOG_DIR, "tray-stderr.log");
21
+ var MARKUS_DIR = resolve(homedir(), ".markus");
22
+ var LOCK_FILE = join(MARKUS_DIR, "tray.lock");
21
23
  var STRINGS = {
22
24
  en: {
23
25
  openUI: "Open Console",
@@ -44,6 +46,13 @@ function detectLocale() {
44
46
  } catch {
45
47
  }
46
48
  }
49
+ if (platform() === "win32") {
50
+ try {
51
+ const winLang = execSync('powershell -NoProfile -Command "(Get-Culture).Name"', { encoding: "utf-8" }).trim();
52
+ if (winLang.startsWith("zh")) return "zh";
53
+ } catch {
54
+ }
55
+ }
47
56
  return "en";
48
57
  }
49
58
  var t = STRINGS[detectLocale()];
@@ -70,6 +79,124 @@ function openBrowser(url) {
70
79
  if (err) trayLog(`openBrowser failed: ${err.message}`);
71
80
  });
72
81
  }
82
+ function isProcessAlive(pid) {
83
+ try {
84
+ process.kill(pid, 0);
85
+ return true;
86
+ } catch {
87
+ return false;
88
+ }
89
+ }
90
+ function acquireLock() {
91
+ try {
92
+ mkdirSync(MARKUS_DIR, { recursive: true });
93
+ if (existsSync(LOCK_FILE)) {
94
+ const pid = parseInt(readFileSync(LOCK_FILE, "utf-8").trim(), 10);
95
+ if (pid && !isNaN(pid) && isProcessAlive(pid)) {
96
+ return false;
97
+ }
98
+ }
99
+ writeFileSync(LOCK_FILE, String(process.pid));
100
+ return true;
101
+ } catch {
102
+ return true;
103
+ }
104
+ }
105
+ function releaseLock() {
106
+ try {
107
+ if (existsSync(LOCK_FILE)) {
108
+ const pid = parseInt(readFileSync(LOCK_FILE, "utf-8").trim(), 10);
109
+ if (pid === process.pid) unlinkSync(LOCK_FILE);
110
+ }
111
+ } catch {
112
+ }
113
+ }
114
+ function getPortOccupant(port) {
115
+ try {
116
+ if (platform() === "win32") {
117
+ const out = execSync(
118
+ `netstat -ano | findstr ":${port}" | findstr "LISTENING"`,
119
+ { encoding: "utf-8", timeout: 5e3 }
120
+ ).trim();
121
+ const firstLine = out.split("\n")[0]?.trim();
122
+ if (!firstLine) return "unknown";
123
+ const pid = firstLine.split(/\s+/).pop();
124
+ if (!pid || pid === "0") return "unknown";
125
+ const taskInfo = execSync(
126
+ `tasklist /FI "PID eq ${pid}" /FO CSV /NH`,
127
+ { encoding: "utf-8", timeout: 5e3 }
128
+ ).trim();
129
+ return taskInfo.split(",")[0]?.replace(/"/g, "") || "unknown";
130
+ } else {
131
+ return execSync(
132
+ `lsof -i :${port} -sTCP:LISTEN -t 2>/dev/null | head -1 | xargs ps -p -o comm= 2>/dev/null`,
133
+ { encoding: "utf-8", timeout: 5e3 }
134
+ ).trim() || "unknown";
135
+ }
136
+ } catch {
137
+ return "unknown";
138
+ }
139
+ }
140
+ function getPidsByPort(port) {
141
+ try {
142
+ if (platform() === "win32") {
143
+ const out = execSync(
144
+ `netstat -ano | findstr ":${port}" | findstr "LISTENING"`,
145
+ { encoding: "utf-8", timeout: 5e3 }
146
+ ).trim();
147
+ if (!out) return [];
148
+ const pids = /* @__PURE__ */ new Set();
149
+ for (const line of out.split("\n")) {
150
+ const pid = parseInt(line.trim().split(/\s+/).pop() ?? "", 10);
151
+ if (pid && !isNaN(pid) && pid !== 0) pids.add(pid);
152
+ }
153
+ return [...pids];
154
+ } else {
155
+ const out = execSync(
156
+ `lsof -i :${port} -sTCP:LISTEN -t 2>/dev/null`,
157
+ { encoding: "utf-8", timeout: 5e3 }
158
+ ).trim();
159
+ if (!out) return [];
160
+ return out.split("\n").map((s) => parseInt(s.trim(), 10)).filter((n) => n && !isNaN(n));
161
+ }
162
+ } catch {
163
+ return [];
164
+ }
165
+ }
166
+ function killPid(pid) {
167
+ try {
168
+ if (platform() === "win32") {
169
+ execSync(`taskkill /PID ${pid} /F`, { stdio: "ignore", timeout: 5e3 });
170
+ } else {
171
+ process.kill(pid, "SIGTERM");
172
+ }
173
+ } catch {
174
+ }
175
+ }
176
+ function forceKillPid(pid) {
177
+ try {
178
+ if (platform() === "win32") {
179
+ execSync(`taskkill /PID ${pid} /F`, { stdio: "ignore", timeout: 5e3 });
180
+ } else {
181
+ process.kill(pid, "SIGKILL");
182
+ }
183
+ } catch {
184
+ }
185
+ }
186
+ function showPortConflictDialog(port, occupant) {
187
+ const msg = t.portConflictMsg(port, occupant);
188
+ if (platform() === "darwin") {
189
+ exec(`osascript -e 'display dialog "${msg}" with title "${t.portConflictTitle}" buttons {"OK"} default button "OK" with icon stop'`, () => {
190
+ });
191
+ } else if (platform() === "win32") {
192
+ const escaped = msg.replace(/'/g, "''");
193
+ exec(
194
+ `powershell -NoProfile -Command "Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.MessageBox]::Show('${escaped}','${t.portConflictTitle}','OK','Error')"`,
195
+ () => {
196
+ }
197
+ );
198
+ }
199
+ }
73
200
  function isPortListening(port) {
74
201
  return new Promise((res) => {
75
202
  const socket = createConnection({ port, host: "127.0.0.1" }, () => {
@@ -129,6 +256,10 @@ function resolveMarkusCommand() {
129
256
  if (existsSync(symlink)) return { cmd: symlink, args: ["start"] };
130
257
  const wrapper = resolve(APP_DIR, "markus");
131
258
  if (existsSync(wrapper)) return { cmd: wrapper, args: ["start"] };
259
+ if (platform() === "win32") {
260
+ const wrapperCmd = resolve(APP_DIR, "markus.cmd");
261
+ if (existsSync(wrapperCmd)) return { cmd: wrapperCmd, args: ["start"] };
262
+ }
132
263
  const markusBin = resolve(BIN_DIR, "Markus");
133
264
  const nodeBin = platform() === "darwin" && existsSync(markusBin) ? markusBin : resolve(BIN_DIR, platform() === "win32" ? "node.exe" : "node");
134
265
  const markusMjs = resolve(BIN_DIR, "markus.mjs");
@@ -143,16 +274,9 @@ async function ensureServerRunning() {
143
274
  openBrowser(WEB_UI_URL);
144
275
  return;
145
276
  }
146
- let occupant = "unknown";
147
- try {
148
- occupant = execSync(`lsof -i :${WEB_UI_PORT} -sTCP:LISTEN -t 2>/dev/null | head -1 | xargs ps -p -o comm= 2>/dev/null`, { encoding: "utf-8" }).trim() || "unknown";
149
- } catch {
150
- }
277
+ const occupant = getPortOccupant(WEB_UI_PORT);
151
278
  trayLog(`Port ${WEB_UI_PORT} occupied by "${occupant}"`);
152
- if (platform() === "darwin") {
153
- exec(`osascript -e 'display dialog "${t.portConflictMsg(WEB_UI_PORT, occupant)}" with title "${t.portConflictTitle}" buttons {"OK"} default button "OK" with icon stop'`, () => {
154
- });
155
- }
279
+ showPortConflictDialog(WEB_UI_PORT, occupant);
156
280
  return;
157
281
  }
158
282
  mkdirSync(LOG_DIR, { recursive: true });
@@ -163,7 +287,8 @@ async function ensureServerRunning() {
163
287
  serverProcess = spawn(cmd, args, {
164
288
  stdio: ["ignore", outFd, errFd],
165
289
  detached: false,
166
- env: { ...process.env, NO_BROWSER: "1" }
290
+ env: { ...process.env, NO_BROWSER: "1" },
291
+ windowsHide: true
167
292
  });
168
293
  serverProcess.on("exit", (code) => {
169
294
  if (code && code !== 0) trayLog(`Server exited with code ${code}`);
@@ -192,29 +317,47 @@ function killServer() {
192
317
  }
193
318
  }
194
319
  if (serverProcess) {
195
- serverProcess.kill("SIGTERM");
320
+ if (platform() === "win32") {
321
+ try {
322
+ execSync(`taskkill /PID ${serverProcess.pid} /T /F`, { stdio: "ignore", timeout: 5e3 });
323
+ } catch {
324
+ }
325
+ } else {
326
+ serverProcess.kill("SIGTERM");
327
+ }
196
328
  serverProcess = null;
197
329
  }
198
- const killByPort = (signal) => {
199
- try {
200
- const pids = execSync(`lsof -i :${WEB_UI_PORT} -sTCP:LISTEN -t 2>/dev/null`, { encoding: "utf-8" }).trim();
201
- if (!pids) return;
202
- for (const pid of pids.split("\n")) {
203
- const p = pid.trim();
204
- if (p && p !== String(process.pid)) {
205
- trayLog(`Sending ${signal} to server process ${p}`);
206
- process.kill(Number(p), signal);
207
- }
208
- }
209
- } catch {
330
+ const pids = getPidsByPort(WEB_UI_PORT).filter((p) => p !== process.pid);
331
+ for (const pid of pids) {
332
+ trayLog(`Killing server process ${pid}`);
333
+ killPid(pid);
334
+ }
335
+ setTimeout(() => {
336
+ const remaining = getPidsByPort(WEB_UI_PORT).filter((p) => p !== process.pid);
337
+ for (const pid of remaining) {
338
+ trayLog(`Force killing server process ${pid}`);
339
+ forceKillPid(pid);
210
340
  }
211
- };
212
- killByPort("SIGTERM");
213
- setTimeout(() => killByPort("SIGKILL"), 3e3);
341
+ }, 3e3);
214
342
  }
215
343
  var tray = null;
216
344
  async function main() {
217
345
  trayLog(`Tray starting (locale=${detectLocale()}, pid=${process.pid})`);
346
+ if (!acquireLock()) {
347
+ trayLog("Another tray instance is already running \u2014 opening browser and exiting");
348
+ openBrowser(WEB_UI_URL);
349
+ setTimeout(() => process.exit(0), 1e3);
350
+ return;
351
+ }
352
+ process.on("exit", releaseLock);
353
+ process.on("SIGINT", () => {
354
+ releaseLock();
355
+ process.exit(0);
356
+ });
357
+ process.on("SIGTERM", () => {
358
+ releaseLock();
359
+ process.exit(0);
360
+ });
218
361
  tray = new SysTray({
219
362
  menu: {
220
363
  icon: loadIconBase64(),
@@ -237,6 +380,7 @@ async function main() {
237
380
  trayLog("Quit requested");
238
381
  killServer();
239
382
  setTimeout(async () => {
383
+ releaseLock();
240
384
  if (tray) await tray.kill(false);
241
385
  process.exit(0);
242
386
  }, 4e3);
@@ -249,5 +393,6 @@ async function main() {
249
393
  }
250
394
  main().catch((err) => {
251
395
  trayLog(`Tray failed to start: ${err}`);
396
+ releaseLock();
252
397
  process.exit(1);
253
398
  });