@juxtapose/core 0.4.0 → 0.6.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 (153) hide show
  1. package/dist/agent/handoff.d.ts +8 -1
  2. package/dist/agent/handoff.js +75 -7
  3. package/dist/agent/handoff.js.map +1 -1
  4. package/dist/analysis/affected.d.ts +37 -0
  5. package/dist/analysis/affected.js +97 -22
  6. package/dist/analysis/affected.js.map +1 -1
  7. package/dist/analysis/cause.d.ts +32 -0
  8. package/dist/analysis/cause.js +187 -0
  9. package/dist/analysis/cause.js.map +1 -0
  10. package/dist/baseline/approve.d.ts +24 -0
  11. package/dist/baseline/approve.js +54 -0
  12. package/dist/baseline/approve.js.map +1 -0
  13. package/dist/baseline/git-store.d.ts +4 -0
  14. package/dist/baseline/git-store.js +22 -0
  15. package/dist/baseline/git-store.js.map +1 -1
  16. package/dist/browser/acquire.d.ts +15 -0
  17. package/dist/browser/acquire.js +26 -0
  18. package/dist/browser/acquire.js.map +1 -0
  19. package/dist/browser/browser.d.ts +53 -0
  20. package/dist/browser/browser.js +122 -0
  21. package/dist/browser/browser.js.map +1 -0
  22. package/dist/browser/cdp.d.ts +81 -0
  23. package/dist/browser/cdp.js +230 -0
  24. package/dist/browser/cdp.js.map +1 -0
  25. package/dist/browser/daemon/client.d.ts +145 -0
  26. package/dist/browser/daemon/client.js +764 -0
  27. package/dist/browser/daemon/client.js.map +1 -0
  28. package/dist/browser/daemon/state.d.ts +99 -0
  29. package/dist/browser/daemon/state.js +297 -0
  30. package/dist/browser/daemon/state.js.map +1 -0
  31. package/dist/browser/daemon/supervisor-main.d.ts +1 -0
  32. package/dist/browser/daemon/supervisor-main.js +54 -0
  33. package/dist/browser/daemon/supervisor-main.js.map +1 -0
  34. package/dist/browser/daemon/supervisor.d.ts +37 -0
  35. package/dist/browser/daemon/supervisor.js +777 -0
  36. package/dist/browser/daemon/supervisor.js.map +1 -0
  37. package/dist/{capture/launch.d.ts → browser/flags.d.ts} +19 -1
  38. package/dist/browser/flags.js +146 -0
  39. package/dist/browser/flags.js.map +1 -0
  40. package/dist/browser/index.d.ts +14 -0
  41. package/dist/browser/index.js +14 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/browser/install.d.ts +33 -0
  44. package/dist/browser/install.js +167 -0
  45. package/dist/browser/install.js.map +1 -0
  46. package/dist/browser/launch.d.ts +37 -0
  47. package/dist/browser/launch.js +254 -0
  48. package/dist/browser/launch.js.map +1 -0
  49. package/dist/browser/page.d.ts +125 -0
  50. package/dist/browser/page.js +564 -0
  51. package/dist/browser/page.js.map +1 -0
  52. package/dist/browser/pins.d.ts +12 -0
  53. package/dist/browser/pins.js +57 -0
  54. package/dist/browser/pins.js.map +1 -0
  55. package/dist/browser/private-dir.d.ts +7 -0
  56. package/dist/browser/private-dir.js +24 -0
  57. package/dist/browser/private-dir.js.map +1 -0
  58. package/dist/browser/resolve.d.ts +31 -0
  59. package/dist/browser/resolve.js +126 -0
  60. package/dist/browser/resolve.js.map +1 -0
  61. package/dist/browser/selectors.d.ts +10 -0
  62. package/dist/browser/selectors.js +60 -0
  63. package/dist/browser/selectors.js.map +1 -0
  64. package/dist/browser/transport.d.ts +51 -0
  65. package/dist/browser/transport.js +124 -0
  66. package/dist/browser/transport.js.map +1 -0
  67. package/dist/browser/types.d.ts +4 -0
  68. package/dist/browser/types.js +2 -0
  69. package/dist/browser/types.js.map +1 -0
  70. package/dist/browser/zip.d.ts +27 -0
  71. package/dist/browser/zip.js +241 -0
  72. package/dist/browser/zip.js.map +1 -0
  73. package/dist/capture/capture.d.ts +7 -1
  74. package/dist/capture/capture.js +25 -8
  75. package/dist/capture/capture.js.map +1 -1
  76. package/dist/capture/env.d.ts +1 -1
  77. package/dist/capture/pool.d.ts +1 -1
  78. package/dist/capture/pool.js +41 -8
  79. package/dist/capture/pool.js.map +1 -1
  80. package/dist/capture/settle.d.ts +1 -1
  81. package/dist/capture/settle.js +2 -0
  82. package/dist/capture/settle.js.map +1 -1
  83. package/dist/capture/snap.d.ts +43 -0
  84. package/dist/capture/snap.js +103 -0
  85. package/dist/capture/snap.js.map +1 -0
  86. package/dist/capture/structure.d.ts +77 -0
  87. package/dist/capture/structure.js +498 -0
  88. package/dist/capture/structure.js.map +1 -0
  89. package/dist/diff/compare.d.ts +19 -0
  90. package/dist/diff/compare.js +19 -0
  91. package/dist/diff/compare.js.map +1 -0
  92. package/dist/diff/crops.d.ts +26 -0
  93. package/dist/diff/crops.js +92 -0
  94. package/dist/diff/crops.js.map +1 -0
  95. package/dist/diff/structural/classify.d.ts +29 -0
  96. package/dist/diff/structural/classify.js +113 -0
  97. package/dist/diff/structural/classify.js.map +1 -0
  98. package/dist/diff/structural/coverage.d.ts +11 -0
  99. package/dist/diff/structural/coverage.js +37 -0
  100. package/dist/diff/structural/coverage.js.map +1 -0
  101. package/dist/diff/structural/deltas.d.ts +29 -0
  102. package/dist/diff/structural/deltas.js +218 -0
  103. package/dist/diff/structural/deltas.js.map +1 -0
  104. package/dist/diff/structural/disambiguate.d.ts +3 -0
  105. package/dist/diff/structural/disambiguate.js +89 -0
  106. package/dist/diff/structural/disambiguate.js.map +1 -0
  107. package/dist/diff/structural/label.d.ts +15 -0
  108. package/dist/diff/structural/label.js +64 -0
  109. package/dist/diff/structural/label.js.map +1 -0
  110. package/dist/diff/structural/match.d.ts +13 -0
  111. package/dist/diff/structural/match.js +135 -0
  112. package/dist/diff/structural/match.js.map +1 -0
  113. package/dist/diff/structural/shift.d.ts +2 -0
  114. package/dist/diff/structural/shift.js +144 -0
  115. package/dist/diff/structural/shift.js.map +1 -0
  116. package/dist/diff/structural/summary.d.ts +31 -0
  117. package/dist/diff/structural/summary.js +420 -0
  118. package/dist/diff/structural/summary.js.map +1 -0
  119. package/dist/diff/structural.d.ts +40 -0
  120. package/dist/diff/structural.js +219 -0
  121. package/dist/diff/structural.js.map +1 -0
  122. package/dist/index.d.ts +28 -4
  123. package/dist/index.js +32 -3
  124. package/dist/index.js.map +1 -1
  125. package/dist/platform.d.ts +1 -1
  126. package/dist/platforms/urls.d.ts +3 -0
  127. package/dist/platforms/urls.js +89 -0
  128. package/dist/platforms/urls.js.map +1 -0
  129. package/dist/report/comment.js +9 -3
  130. package/dist/report/comment.js.map +1 -1
  131. package/dist/report/format.d.ts +18 -0
  132. package/dist/report/format.js +20 -0
  133. package/dist/report/format.js.map +1 -1
  134. package/dist/report/html.js +2 -2
  135. package/dist/report/html.js.map +1 -1
  136. package/dist/run/groups.d.ts +2 -0
  137. package/dist/run/groups.js +45 -0
  138. package/dist/run/groups.js.map +1 -0
  139. package/dist/run/run.d.ts +6 -2
  140. package/dist/run/run.js +74 -6
  141. package/dist/run/run.js.map +1 -1
  142. package/dist/shell-quote.d.ts +2 -0
  143. package/dist/shell-quote.js +10 -0
  144. package/dist/shell-quote.js.map +1 -0
  145. package/dist/types.d.ts +201 -5
  146. package/dist/types.js +0 -2
  147. package/dist/types.js.map +1 -1
  148. package/dist/url-platform.d.ts +2 -2
  149. package/dist/url-platform.js +2 -2
  150. package/dist/url-platform.js.map +1 -1
  151. package/package.json +6 -10
  152. package/dist/capture/launch.js +0 -56
  153. package/dist/capture/launch.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/browser/daemon/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ export interface DaemonState {
2
+ pid: number;
3
+ socket: string;
4
+ binary: string;
5
+ version: string;
6
+ key: string;
7
+ startedAt: string;
8
+ idleMinutes: number;
9
+ }
10
+ export interface Fingerprint {
11
+ binary: string;
12
+ /**
13
+ * Size and mtime of the binary: an auto-updating Chrome behind --chrome or
14
+ * JUX_CHROME is replaced in place, same path and same pin.
15
+ */
16
+ binaryId?: string;
17
+ version: string;
18
+ /** The full Chrome command line the supervisor launches with. */
19
+ args: string[];
20
+ env: NodeJS.ProcessEnv;
21
+ /** This jux build: package version plus a hash of the supervisor's code. */
22
+ jux?: string;
23
+ uid?: number;
24
+ }
25
+ export interface DaemonPaths {
26
+ /** Holds the state and lock files. */
27
+ dir: string;
28
+ state: string;
29
+ socket: string;
30
+ lock: string;
31
+ /** Directory holding the socket: `dir`, or a short private fallback. */
32
+ socketDir: string;
33
+ }
34
+ /** dev/ino of the verified directories, to detect a swap after the check. */
35
+ export interface DirIdentity {
36
+ dir: {
37
+ dev: number;
38
+ ino: number;
39
+ };
40
+ socketDir: {
41
+ dev: number;
42
+ ino: number;
43
+ };
44
+ }
45
+ /**
46
+ * Ruling 22: no daemon on Windows. A named pipe lives in the global
47
+ * `\\.\pipe` namespace, any user can squat a name, and Node cannot set a
48
+ * pipe ACL, so another user could read captured pages or forge screenshots.
49
+ * Callers fall back to a fresh launch.
50
+ */
51
+ export declare function daemonSupported(platform?: NodeJS.Platform): boolean;
52
+ export declare function daemonKey(fp: Fingerprint): string;
53
+ export declare function daemonPaths(stateDir: string, key: string, opts?: {
54
+ platform?: NodeJS.Platform;
55
+ uid?: number;
56
+ shortBase?: string;
57
+ }): DaemonPaths;
58
+ /** Creates (0700) and verifies the daemon directories; returns their identity. */
59
+ export declare function ensureDaemonDirs(paths: DaemonPaths): Promise<DirIdentity>;
60
+ /**
61
+ * Re-lstat the directories and refuse if either is no longer the one we
62
+ * verified. Call right before rename/listen. Residual risk: a swap between
63
+ * this check and the syscall that follows is still possible; closing it needs
64
+ * dirfd-relative syscalls Node does not expose. The 0700 owner-only parent
65
+ * makes the swapper the same user in practice.
66
+ */
67
+ export declare function recheckDaemonDirs(paths: DaemonPaths, id: DirIdentity): Promise<void>;
68
+ export declare function readState(paths: DaemonPaths): Promise<DaemonState | null>;
69
+ export declare function writeState(paths: DaemonPaths, state: DaemonState,
70
+ /** Test seam: runs after the temp file is open, before the final checks. */
71
+ hooks?: {
72
+ afterTempOpen?: () => Promise<void>;
73
+ }): Promise<void>;
74
+ export declare function clearState(paths: DaemonPaths): Promise<void>;
75
+ /**
76
+ * True while someone else's launch is in progress: the lock exists and is not
77
+ * stale. A client that lost the lock waits on this, up to the 30 s stale
78
+ * window, instead of launching a second daemon (Task 11 review).
79
+ */
80
+ export declare function lockHeld(paths: DaemonPaths): Promise<boolean>;
81
+ /**
82
+ * O_EXCL lock for "who launches". Returns a release function, or null if
83
+ * held. Stale when older than 30 s or when the pid inside is dead, so a
84
+ * crashed holder cannot wedge every later invocation. A stale lock is
85
+ * renamed aside by the one racer holding the reclaim guard; everyone then
86
+ * competes on O_EXCL creation, so exactly one holder results.
87
+ */
88
+ export declare function acquireLock(paths: DaemonPaths): Promise<(() => Promise<void>) | null>;
89
+ /**
90
+ * Pass a lock this process holds to `pid` (the supervisor it just spawned).
91
+ * The lock then lives as long as the supervisor's start, not the client's
92
+ * 2 s patience: with a 2.5 s cold Chrome the client used to release it
93
+ * mid-start and the next client spawned a second supervisor (review probe
94
+ * race.mjs: "spawned 2"). A holder that dies is still reclaimed (dead pid).
95
+ */
96
+ export declare function handOffLock(paths: DaemonPaths, pid: number): Promise<boolean>;
97
+ /** Remove the lock if `pid` holds it: the supervisor once listening (or failed). */
98
+ export declare function releaseLockHeldBy(paths: DaemonPaths, pid: number): Promise<void>;
99
+ export declare function pidAlive(pid: number): boolean;
@@ -0,0 +1,297 @@
1
+ // packages/core/src/browser/daemon/state.ts
2
+ //
3
+ // One small JSON file says where the warm browser is. Access control is the
4
+ // private directory (verified with lstat, Ruling 17) plus 0600 files: a
5
+ // process that cannot read the file cannot find the socket, and one that can
6
+ // is the same user. There is no TCP debugging port anywhere; the daemon is
7
+ // reached over a Unix socket or named pipe only.
8
+ //
9
+ // The key is an environment fingerprint, not just the binary: TZ, LANG and
10
+ // LC_ALL change what a page renders (dates, number formats, font fallback),
11
+ // so two invocations with different ones must not share a browser, or the
12
+ // pixels would depend on which one started it.
13
+ import { createHash } from 'node:crypto';
14
+ import { lstat, open, readdir, readFile, rename, rm, stat, unlink, writeFile, } from 'node:fs/promises';
15
+ import { userInfo } from 'node:os';
16
+ import { randomBytes } from 'node:crypto';
17
+ import path from 'node:path';
18
+ import { ensurePrivateDir } from '../private-dir.js';
19
+ const LOCK_STALE_MS = 30_000;
20
+ // sun_path is 104 bytes on macOS, 108 on Linux; stay under both.
21
+ const MAX_SOCKET_BYTES = 100;
22
+ // Everything that can change fonts, locale formatting or text shaping. HOME
23
+ // and XDG_CONFIG_HOME are here because fontconfig on Linux reads
24
+ // ~/.fonts, ~/.fonts.conf and $XDG_CONFIG_HOME/fontconfig/fonts.conf (hinting,
25
+ // antialiasing, aliases); the uid alone does not pin them.
26
+ const RENDER_ENV = [
27
+ 'HOME',
28
+ 'XDG_CONFIG_HOME',
29
+ 'TZ',
30
+ 'LANG',
31
+ 'LC_ALL',
32
+ 'LC_CTYPE',
33
+ 'LC_MESSAGES',
34
+ 'LANGUAGE',
35
+ 'FONTCONFIG_FILE',
36
+ 'FONTCONFIG_PATH',
37
+ 'FONTCONFIG_SYSROOT',
38
+ 'XDG_DATA_HOME',
39
+ 'XDG_DATA_DIRS',
40
+ ];
41
+ /**
42
+ * Ruling 22: no daemon on Windows. A named pipe lives in the global
43
+ * `\\.\pipe` namespace, any user can squat a name, and Node cannot set a
44
+ * pipe ACL, so another user could read captured pages or forge screenshots.
45
+ * Callers fall back to a fresh launch.
46
+ */
47
+ export function daemonSupported(platform = process.platform) {
48
+ return platform !== 'win32';
49
+ }
50
+ export function daemonKey(fp) {
51
+ const uid = fp.uid ?? safeUid();
52
+ const env = RENDER_ENV.map((k) => `${k}=${fp.env[k] ?? ''}`).join('\n');
53
+ return createHash('sha256')
54
+ .update([
55
+ fp.binary,
56
+ fp.binaryId ?? '',
57
+ fp.version,
58
+ JSON.stringify(fp.args),
59
+ env,
60
+ fp.jux ?? '',
61
+ String(uid),
62
+ ].join('\n\n'))
63
+ .digest('hex')
64
+ .slice(0, 16);
65
+ }
66
+ export function daemonPaths(stateDir, key, opts = {}) {
67
+ if (!daemonSupported(opts.platform ?? process.platform))
68
+ throw new Error(`jux: the warm browser daemon is not supported on win32`);
69
+ const dir = path.join(stateDir, 'browser');
70
+ let socketDir = dir;
71
+ let socket = path.join(dir, `${key}.sock`);
72
+ if (Buffer.byteLength(socket) > MAX_SOCKET_BYTES) {
73
+ socketDir = path.join(opts.shortBase ?? '/tmp', `jux-${opts.uid ?? safeUid()}`);
74
+ socket = path.join(socketDir, `${key}.sock`);
75
+ if (Buffer.byteLength(socket) > MAX_SOCKET_BYTES)
76
+ throw new Error(`jux: no socket path under ${MAX_SOCKET_BYTES} bytes (state dir ${stateDir}). Set JUX_STATE_DIR to a shorter path, or pass --no-daemon.`);
77
+ }
78
+ return {
79
+ dir,
80
+ state: path.join(dir, `${key}.json`),
81
+ socket,
82
+ lock: path.join(dir, `${key}.lock`),
83
+ socketDir,
84
+ };
85
+ }
86
+ async function ensureOne(dir) {
87
+ const uid = process.getuid?.();
88
+ await ensurePrivateDir(dir, uid, (why) => new Error(`jux: refusing to use ${dir}: ${why}. Remove it (rm -rf ${dir}) and run jux again, or pass --no-daemon.`));
89
+ const st = await lstat(dir);
90
+ return { dev: st.dev, ino: st.ino };
91
+ }
92
+ /** Creates (0700) and verifies the daemon directories; returns their identity. */
93
+ export async function ensureDaemonDirs(paths) {
94
+ const dir = await ensureOne(paths.dir);
95
+ const socketDir = paths.socketDir === paths.dir ? dir : await ensureOne(paths.socketDir);
96
+ return { dir, socketDir };
97
+ }
98
+ /**
99
+ * Re-lstat the directories and refuse if either is no longer the one we
100
+ * verified. Call right before rename/listen. Residual risk: a swap between
101
+ * this check and the syscall that follows is still possible; closing it needs
102
+ * dirfd-relative syscalls Node does not expose. The 0700 owner-only parent
103
+ * makes the swapper the same user in practice.
104
+ */
105
+ export async function recheckDaemonDirs(paths, id) {
106
+ const pairs = [[paths.dir, id.dir]];
107
+ if (paths.socketDir !== paths.dir)
108
+ pairs.push([paths.socketDir, id.socketDir]);
109
+ for (const [dir, want] of pairs) {
110
+ const st = await lstat(dir).catch(() => null);
111
+ if (!st || st.isSymbolicLink() || st.dev !== want.dev || st.ino !== want.ino)
112
+ throw new Error(`jux: refusing to use ${dir}: it changed while in use.`);
113
+ }
114
+ }
115
+ function isState(v) {
116
+ if (typeof v !== 'object' || v === null || Array.isArray(v))
117
+ return false;
118
+ const s = v;
119
+ return (typeof s['pid'] === 'number' &&
120
+ Number.isInteger(s['pid']) &&
121
+ typeof s['socket'] === 'string' &&
122
+ typeof s['binary'] === 'string' &&
123
+ typeof s['version'] === 'string' &&
124
+ typeof s['key'] === 'string' &&
125
+ typeof s['startedAt'] === 'string' &&
126
+ typeof s['idleMinutes'] === 'number');
127
+ }
128
+ export async function readState(paths) {
129
+ try {
130
+ const s = JSON.parse(await readFile(paths.state, 'utf8'));
131
+ return isState(s) ? s : null;
132
+ }
133
+ catch {
134
+ return null;
135
+ }
136
+ }
137
+ async function sweepTempFiles(dir) {
138
+ for (const name of await readdir(dir).catch(() => [])) {
139
+ const m = /\.json\.(\d+)\.tmp$/.exec(name);
140
+ if (!m || pidAlive(Number(m[1])))
141
+ continue;
142
+ const file = path.join(dir, name);
143
+ if ((await lstat(file).catch(() => null))?.isFile())
144
+ await rm(file, { force: true });
145
+ }
146
+ }
147
+ export async function writeState(paths, state,
148
+ /** Test seam: runs after the temp file is open, before the final checks. */
149
+ hooks = {}) {
150
+ const id = await ensureDaemonDirs(paths);
151
+ await sweepTempFiles(paths.dir);
152
+ const tmp = `${paths.state}.${process.pid}.tmp`;
153
+ // 'wx': never write through a pre-planted file or symlink; 0600 at creation.
154
+ await rm(tmp, { force: true });
155
+ const fh = await open(tmp, 'wx', 0o600);
156
+ try {
157
+ const st = await fh.stat();
158
+ const uid = process.getuid?.();
159
+ if (uid !== undefined && (st.uid !== uid || (st.mode & 0o777) !== 0o600))
160
+ throw new Error(`jux: refusing to write ${tmp}: not a private file of ours.`);
161
+ await hooks.afterTempOpen?.();
162
+ await fh.writeFile(JSON.stringify(state) + '\n');
163
+ await recheckDaemonDirs(paths, id);
164
+ }
165
+ catch (err) {
166
+ await fh.close();
167
+ await rm(tmp, { force: true });
168
+ throw err;
169
+ }
170
+ await fh.close();
171
+ await rename(tmp, paths.state);
172
+ }
173
+ export async function clearState(paths) {
174
+ await rm(paths.state, { force: true });
175
+ await rm(paths.socket, { force: true });
176
+ }
177
+ async function lockIsStale(file) {
178
+ const age = Date.now() - (await stat(file)).mtimeMs;
179
+ const holder = Number.parseInt(await readFile(file, 'utf8').catch(() => ''), 10);
180
+ // An unreadable/empty lock is a holder mid-write: only age can condemn it.
181
+ const dead = Number.isInteger(holder) && holder > 0 && !pidAlive(holder);
182
+ return age > LOCK_STALE_MS || dead;
183
+ }
184
+ /**
185
+ * True while someone else's launch is in progress: the lock exists and is not
186
+ * stale. A client that lost the lock waits on this, up to the 30 s stale
187
+ * window, instead of launching a second daemon (Task 11 review).
188
+ */
189
+ export async function lockHeld(paths) {
190
+ return lockIsStale(paths.lock).then((stale) => !stale, () => false);
191
+ }
192
+ /**
193
+ * O_EXCL lock for "who launches". Returns a release function, or null if
194
+ * held. Stale when older than 30 s or when the pid inside is dead, so a
195
+ * crashed holder cannot wedge every later invocation. A stale lock is
196
+ * renamed aside by the one racer holding the reclaim guard; everyone then
197
+ * competes on O_EXCL creation, so exactly one holder results.
198
+ */
199
+ export async function acquireLock(paths) {
200
+ await ensureDaemonDirs(paths);
201
+ if (await lockIsStale(paths.lock).catch(() => false)) {
202
+ // Reclaim under a guard file so the staleness verdict and the rename are
203
+ // one step: a bare rename can move a fresh lock that a faster racer just
204
+ // created. Losing the guard means someone else is reclaiming: report held.
205
+ const guard = `${paths.lock}.reclaim`;
206
+ try {
207
+ await removeIfStale(guard);
208
+ await (await open(guard, 'wx', 0o600)).close();
209
+ }
210
+ catch {
211
+ return null;
212
+ }
213
+ try {
214
+ if (await lockIsStale(paths.lock).catch(() => false)) {
215
+ const aside = `${paths.lock}.stale.${process.pid}.${randomBytes(4).toString('hex')}`;
216
+ await rename(paths.lock, aside).catch(() => { });
217
+ await unlink(aside).catch(() => { });
218
+ }
219
+ }
220
+ finally {
221
+ await unlink(guard).catch(() => { });
222
+ }
223
+ }
224
+ try {
225
+ const fh = await open(paths.lock, 'wx', 0o600);
226
+ try {
227
+ await fh.writeFile(String(process.pid));
228
+ }
229
+ finally {
230
+ await fh.close();
231
+ }
232
+ // Never remove a lock someone else took over (we were deemed stale) or
233
+ // one handed to a supervisor.
234
+ return () => releaseLockHeldBy(paths, process.pid);
235
+ }
236
+ catch (err) {
237
+ if (err.code === 'EEXIST')
238
+ return null;
239
+ throw err;
240
+ }
241
+ }
242
+ /**
243
+ * Unlink a crashed reclaimer's guard, but only the file that was judged
244
+ * stale: two racers that both judged the old guard stale used to unlink each
245
+ * other's fresh one and both "hold" it. Comparing the inode before unlinking
246
+ * shrinks that to the few microseconds between the second lstat and the
247
+ * unlink. POSIX has no compare-and-unlink and Node exposes no flock, so it
248
+ * cannot close entirely; a second holder then only means a second
249
+ * supervisor, which loses on EADDRINUSE (Ruling 21) and exits.
250
+ */
251
+ async function removeIfStale(file) {
252
+ const before = await lstat(file).catch(() => null);
253
+ if (!before || !(await lockIsStale(file).catch(() => false)))
254
+ return;
255
+ const now = await lstat(file).catch(() => null);
256
+ if (now && now.ino === before.ino && now.dev === before.dev)
257
+ await unlink(file).catch(() => { });
258
+ }
259
+ async function lockHolder(paths) {
260
+ return Number.parseInt(await readFile(paths.lock, 'utf8').catch(() => ''), 10);
261
+ }
262
+ /**
263
+ * Pass a lock this process holds to `pid` (the supervisor it just spawned).
264
+ * The lock then lives as long as the supervisor's start, not the client's
265
+ * 2 s patience: with a 2.5 s cold Chrome the client used to release it
266
+ * mid-start and the next client spawned a second supervisor (review probe
267
+ * race.mjs: "spawned 2"). A holder that dies is still reclaimed (dead pid).
268
+ */
269
+ export async function handOffLock(paths, pid) {
270
+ if ((await lockHolder(paths)) !== process.pid)
271
+ return false;
272
+ await writeFile(paths.lock, String(pid));
273
+ return true;
274
+ }
275
+ /** Remove the lock if `pid` holds it: the supervisor once listening (or failed). */
276
+ export async function releaseLockHeldBy(paths, pid) {
277
+ if ((await lockHolder(paths)) === pid)
278
+ await unlink(paths.lock).catch(() => { });
279
+ }
280
+ export function pidAlive(pid) {
281
+ try {
282
+ process.kill(pid, 0);
283
+ return true;
284
+ }
285
+ catch (err) {
286
+ return err.code === 'EPERM';
287
+ }
288
+ }
289
+ function safeUid() {
290
+ try {
291
+ return userInfo().uid;
292
+ }
293
+ catch {
294
+ return -1;
295
+ }
296
+ }
297
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/browser/daemon/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ // packages/core/src/browser/daemon/supervisor-main.ts
2
+ //
3
+ // Entry for the detached daemon: `node supervisor-main.js '<json>'`, json =
4
+ // { executablePath, args, stateDir, key, idleMinutes }. The launcher (Task 13)
5
+ // detaches stdio; this process lives until it is idle, SIGTERM/SIGINT (`jux
6
+ // browser stop`), or the browser dies, and on each of those closes Chrome,
7
+ // removes the profile, clears the state and unlinks the socket.
8
+ //
9
+ // Losing the start race to another daemon (Ruling 21) exits 0: the client
10
+ // that spawned us connects to the winner.
11
+ //
12
+ // The spawning client hands us its launch lock (handOffLock). We remove it
13
+ // once we are listening with our state written, or once start failed, so
14
+ // clients that arrive while Chrome is still starting wait for us instead of
15
+ // spawning another supervisor. If we crash, our dead pid makes it stale.
16
+ import { startSupervisor, SupervisorLostRace } from './supervisor.js';
17
+ import { daemonPaths, releaseLockHeldBy } from './state.js';
18
+ function parseArgs(raw) {
19
+ const a = JSON.parse(raw ?? '');
20
+ if (typeof a.executablePath !== 'string' ||
21
+ !Array.isArray(a.args) ||
22
+ !a.args.every((x) => typeof x === 'string') ||
23
+ typeof a.stateDir !== 'string' ||
24
+ typeof a.key !== 'string' ||
25
+ typeof a.idleMinutes !== 'number' ||
26
+ !(a.idleMinutes > 0))
27
+ throw new Error(`jux: supervisor-main: bad arguments ${raw ?? '(none)'}`);
28
+ return a;
29
+ }
30
+ let paths = null;
31
+ try {
32
+ const args = parseArgs(process.argv[2]);
33
+ paths = daemonPaths(args.stateDir, args.key);
34
+ const sup = await startSupervisor({
35
+ executablePath: args.executablePath,
36
+ args: args.args,
37
+ paths,
38
+ key: args.key,
39
+ idleMinutes: args.idleMinutes,
40
+ onExit: () => process.exit(0),
41
+ });
42
+ await releaseLockHeldBy(paths, process.pid);
43
+ for (const sig of ['SIGTERM', 'SIGINT'])
44
+ process.on(sig, () => void sup.stop());
45
+ }
46
+ catch (e) {
47
+ if (paths)
48
+ await releaseLockHeldBy(paths, process.pid).catch(() => { });
49
+ if (e instanceof SupervisorLostRace)
50
+ process.exit(0);
51
+ process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
52
+ process.exit(1);
53
+ }
54
+ //# sourceMappingURL=supervisor-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor-main.js","sourceRoot":"","sources":["../../../src/browser/daemon/supervisor-main.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,gEAAgE;AAChE,EAAE;AACF,0EAA0E;AAC1E,0CAA0C;AAC1C,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,4EAA4E;AAC5E,yEAAyE;AAEzE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAU5D,SAAS,SAAS,CAAC,GAAuB;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAsB,CAAC;IACrD,IACE,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;QACpC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QAC3C,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;QACjC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;QAEpB,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAa,CAAC;AACvB,CAAC;AAED,IAAI,KAAK,GAA0C,IAAI,CAAC;AACxD,IAAI,CAAC;IACH,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;QAChC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KAC9B,CAAC,CAAC;IACH,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAU;QAC9C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,KAAK;QAAE,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,YAAY,kBAAkB;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type DaemonPaths, type DaemonState } from './state.js';
2
+ /**
3
+ * Another daemon owns the socket (Ruling 21: the stale-lock reclaim race is
4
+ * backstopped here). The loser has closed its own Chrome and touched none of
5
+ * the winner's files; its process should exit 0 and the client connect to
6
+ * the winner.
7
+ */
8
+ export declare class SupervisorLostRace extends Error {
9
+ /** The loser's Chrome, already closed; undefined when none was launched. */
10
+ readonly chromePid?: number | undefined;
11
+ constructor(
12
+ /** The loser's Chrome, already closed; undefined when none was launched. */
13
+ chromePid?: number | undefined);
14
+ }
15
+ export interface Supervisor {
16
+ state: DaemonState;
17
+ chromePid: number;
18
+ stop(): Promise<void>;
19
+ /** Proxied commands still awaiting Chrome's reply; a leak test's yardstick. */
20
+ readonly inFlight: number;
21
+ /** Test seam: every context in the browser, unfiltered by owner. */
22
+ browserContextIds(): Promise<string[]>;
23
+ }
24
+ export interface SupervisorOptions {
25
+ executablePath: string;
26
+ args?: string[];
27
+ paths: DaemonPaths;
28
+ key: string;
29
+ idleMinutes: number;
30
+ /** Called once after any shutdown: idle, stop(), or Chrome exiting. */
31
+ onExit?: () => void;
32
+ /** Test seam: runs after the liveness probe, right before listen. */
33
+ beforeListen?: () => Promise<void>;
34
+ /** Largest frame a client may send; default MAX_BACKLOG_CHARS. Test seam. */
35
+ maxFrameChars?: number;
36
+ }
37
+ export declare function startSupervisor(opts: SupervisorOptions): Promise<Supervisor>;