@framers/agentos-ext-browser-automation 0.2.0 → 0.2.1
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/README.md +80 -0
- package/dist/BrowserService.js +9 -45
- package/dist/BrowserService.js.map +1 -1
- package/dist/attach/AttachController.js +44 -41
- package/dist/attach/AttachController.js.map +1 -1
- package/dist/attach/backends/jxa.js +29 -62
- package/dist/attach/backends/jxa.js.map +1 -1
- package/dist/attach/backends/raw-cdp.js +32 -35
- package/dist/attach/backends/raw-cdp.js.map +1 -1
- package/dist/attach/daemon/client.js +23 -23
- package/dist/attach/daemon/client.js.map +1 -1
- package/dist/attach/daemon/daemon-lock.js +14 -17
- package/dist/attach/daemon/daemon-lock.js.map +1 -1
- package/dist/attach/daemon/daemon-main.d.ts +11 -0
- package/dist/attach/daemon/daemon-main.d.ts.map +1 -1
- package/dist/attach/daemon/daemon-main.js +37 -18
- package/dist/attach/daemon/daemon-main.js.map +1 -1
- package/dist/attach/daemon/daemon.d.ts.map +1 -1
- package/dist/attach/daemon/daemon.js +41 -32
- package/dist/attach/daemon/daemon.js.map +1 -1
- package/dist/attach/daemon/index.js +7 -25
- package/dist/attach/daemon/index.js.map +1 -1
- package/dist/attach/daemon/protocol.js +33 -45
- package/dist/attach/daemon/protocol.js.map +1 -1
- package/dist/attach/daemon/runner.js +1 -4
- package/dist/attach/daemon/runner.js.map +1 -1
- package/dist/attach/daemon/surface.js +12 -14
- package/dist/attach/daemon/surface.js.map +1 -1
- package/dist/attach/devtools-port.js +1 -4
- package/dist/attach/devtools-port.js.map +1 -1
- package/dist/attach/errors.js +4 -9
- package/dist/attach/errors.js.map +1 -1
- package/dist/attach/lease.js +18 -23
- package/dist/attach/lease.js.map +1 -1
- package/dist/attach/singleton-lock.js +1 -4
- package/dist/attach/singleton-lock.js.map +1 -1
- package/dist/attach/state.js +6 -13
- package/dist/attach/state.js.map +1 -1
- package/dist/attach/tools.js +84 -88
- package/dist/attach/tools.js.map +1 -1
- package/dist/attach/url-policy.js +2 -6
- package/dist/attach/url-policy.js.map +1 -1
- package/dist/attach.js +7 -23
- package/dist/attach.js.map +1 -1
- package/dist/captcha/CaptchaSolver.js +4 -7
- package/dist/captcha/CaptchaSolver.js.map +1 -1
- package/dist/captcha/ICaptchaProvider.js +1 -2
- package/dist/captcha/ICaptchaProvider.js.map +1 -1
- package/dist/index.js +55 -75
- package/dist/index.js.map +1 -1
- package/dist/proxy/IProxyProvider.js +1 -2
- package/dist/proxy/IProxyProvider.js.map +1 -1
- package/dist/proxy/ProxyManager.js +7 -10
- package/dist/proxy/ProxyManager.js.map +1 -1
- package/dist/tools/ClickTool.js +17 -20
- package/dist/tools/ClickTool.js.map +1 -1
- package/dist/tools/EvaluateTool.js +16 -19
- package/dist/tools/EvaluateTool.js.map +1 -1
- package/dist/tools/ExtractTool.js +23 -26
- package/dist/tools/ExtractTool.js.map +1 -1
- package/dist/tools/FillTool.js +17 -20
- package/dist/tools/FillTool.js.map +1 -1
- package/dist/tools/NavigateTool.js +31 -34
- package/dist/tools/NavigateTool.js.map +1 -1
- package/dist/tools/PageSnapshotTool.js +13 -16
- package/dist/tools/PageSnapshotTool.js.map +1 -1
- package/dist/tools/ScreenshotTool.js +16 -19
- package/dist/tools/ScreenshotTool.js.map +1 -1
- package/dist/tools/ScrollTool.js +17 -20
- package/dist/tools/ScrollTool.js.map +1 -1
- package/dist/tools/SessionTool.js +24 -27
- package/dist/tools/SessionTool.js.map +1 -1
- package/dist/tools/WaitTool.js +22 -25
- package/dist/tools/WaitTool.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +5 -4
- package/dist/attach/__tests__/AttachController.test.d.ts +0 -2
- package/dist/attach/__tests__/AttachController.test.d.ts.map +0 -1
- package/dist/attach/__tests__/AttachController.test.js +0 -278
- package/dist/attach/__tests__/AttachController.test.js.map +0 -1
- package/dist/attach/__tests__/attach-primitives.test.d.ts +0 -2
- package/dist/attach/__tests__/attach-primitives.test.d.ts.map +0 -1
- package/dist/attach/__tests__/attach-primitives.test.js +0 -158
- package/dist/attach/__tests__/attach-primitives.test.js.map +0 -1
- package/dist/attach/__tests__/jxa-args.test.d.ts +0 -2
- package/dist/attach/__tests__/jxa-args.test.d.ts.map +0 -1
- package/dist/attach/__tests__/jxa-args.test.js +0 -37
- package/dist/attach/__tests__/jxa-args.test.js.map +0 -1
- package/dist/attach/__tests__/pack-registration.test.d.ts +0 -2
- package/dist/attach/__tests__/pack-registration.test.d.ts.map +0 -1
- package/dist/attach/__tests__/pack-registration.test.js +0 -34
- package/dist/attach/__tests__/pack-registration.test.js.map +0 -1
- package/dist/attach/__tests__/tools.test.d.ts +0 -2
- package/dist/attach/__tests__/tools.test.d.ts.map +0 -1
- package/dist/attach/__tests__/tools.test.js +0 -155
- package/dist/attach/__tests__/tools.test.js.map +0 -1
- package/dist/attach/backends/__tests__/raw-cdp.test.d.ts +0 -2
- package/dist/attach/backends/__tests__/raw-cdp.test.d.ts.map +0 -1
- package/dist/attach/backends/__tests__/raw-cdp.test.js +0 -133
- package/dist/attach/backends/__tests__/raw-cdp.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/client.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/client.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/client.test.js +0 -58
- package/dist/attach/daemon/__tests__/client.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-lock.test.js +0 -72
- package/dist/attach/daemon/__tests__/daemon-lock.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js +0 -102
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/harness.d.ts +0 -44
- package/dist/attach/daemon/__tests__/harness.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/harness.js +0 -96
- package/dist/attach/daemon/__tests__/harness.js.map +0 -1
- package/dist/attach/daemon/__tests__/protocol.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/protocol.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/protocol.test.js +0 -71
- package/dist/attach/daemon/__tests__/protocol.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/runner.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/runner.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/runner.test.js +0 -67
- package/dist/attach/daemon/__tests__/runner.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jxa.js","sourceRoot":"","sources":["../../../src/attach/backends/jxa.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jxa.js","sourceRoot":"","sources":["../../../src/attach/backends/jxa.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RawCdpBackend = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Raw-CDP attach backend over Node's built-in WebSocket.
|
|
6
3
|
*
|
|
@@ -14,12 +11,12 @@ exports.RawCdpBackend = void 0;
|
|
|
14
11
|
*
|
|
15
12
|
* @module browser-automation/attach/backends/raw-cdp
|
|
16
13
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const DEFAULT_PROFILE_ROOT =
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { AttachError } from '../errors.js';
|
|
18
|
+
import { parseDevToolsActivePort } from '../devtools-port.js';
|
|
19
|
+
const DEFAULT_PROFILE_ROOT = join(homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
|
|
23
20
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
24
21
|
/**
|
|
25
22
|
* Raw single-target CDP backend (see fileoverview for the contract).
|
|
@@ -27,22 +24,23 @@ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
|
27
24
|
* Never sends `Browser.close`; `Target.closeTarget` is only ever issued for
|
|
28
25
|
* the tab this instance created.
|
|
29
26
|
*/
|
|
30
|
-
class RawCdpBackend {
|
|
27
|
+
export class RawCdpBackend {
|
|
28
|
+
kind = 'cdp';
|
|
29
|
+
opts;
|
|
30
|
+
ws = null;
|
|
31
|
+
nextId = 0;
|
|
32
|
+
pending = new Map();
|
|
33
|
+
sessionId = null;
|
|
34
|
+
createdTargetId = null;
|
|
35
|
+
/** Invoked once when the transport drops unexpectedly (daemon schedules backoff reconnect). */
|
|
36
|
+
onUnexpectedClose = null;
|
|
31
37
|
constructor(options = {}) {
|
|
32
|
-
this.kind = 'cdp';
|
|
33
|
-
this.ws = null;
|
|
34
|
-
this.nextId = 0;
|
|
35
|
-
this.pending = new Map();
|
|
36
|
-
this.sessionId = null;
|
|
37
|
-
this.createdTargetId = null;
|
|
38
|
-
/** Invoked once when the transport drops unexpectedly (daemon schedules backoff reconnect). */
|
|
39
|
-
this.onUnexpectedClose = null;
|
|
40
38
|
this.opts = {
|
|
41
39
|
profileRoot: options.profileRoot ?? DEFAULT_PROFILE_ROOT,
|
|
42
40
|
identityProbeUrl: options.identityProbeUrl ?? 'mail.google.com',
|
|
43
41
|
settleMs: options.settleMs ?? 1800,
|
|
44
|
-
commandTimeoutMs: options.commandTimeoutMs ??
|
|
45
|
-
connectTimeoutMs: options.connectTimeoutMs ??
|
|
42
|
+
commandTimeoutMs: options.commandTimeoutMs ?? 20_000,
|
|
43
|
+
connectTimeoutMs: options.connectTimeoutMs ?? 15_000,
|
|
46
44
|
evalMaxChars: options.evalMaxChars ?? 512 * 1024,
|
|
47
45
|
};
|
|
48
46
|
}
|
|
@@ -52,17 +50,17 @@ class RawCdpBackend {
|
|
|
52
50
|
return;
|
|
53
51
|
let raw;
|
|
54
52
|
try {
|
|
55
|
-
raw =
|
|
53
|
+
raw = readFileSync(join(this.opts.profileRoot, 'DevToolsActivePort'), 'utf8');
|
|
56
54
|
}
|
|
57
55
|
catch {
|
|
58
|
-
throw new
|
|
56
|
+
throw new AttachError('CDP_UNAVAILABLE', 'DevToolsActivePort absent — remote debugging is not enabled on the target browser');
|
|
59
57
|
}
|
|
60
58
|
let wsUrl;
|
|
61
59
|
try {
|
|
62
|
-
wsUrl =
|
|
60
|
+
wsUrl = parseDevToolsActivePort(raw).wsUrl;
|
|
63
61
|
}
|
|
64
62
|
catch (err) {
|
|
65
|
-
throw new
|
|
63
|
+
throw new AttachError('STALE_PORT_FILE', `DevToolsActivePort unusable: ${err.message}`);
|
|
66
64
|
}
|
|
67
65
|
const ws = new WebSocket(wsUrl);
|
|
68
66
|
ws.addEventListener('message', (ev) => this.onMessage(String(ev.data)));
|
|
@@ -74,7 +72,7 @@ class RawCdpBackend {
|
|
|
74
72
|
catch {
|
|
75
73
|
/* already dead */
|
|
76
74
|
}
|
|
77
|
-
reject(new
|
|
75
|
+
reject(new AttachError('CDP_TIMEOUT', `ws open timed out after ${this.opts.connectTimeoutMs}ms`));
|
|
78
76
|
}, this.opts.connectTimeoutMs);
|
|
79
77
|
ws.addEventListener('open', () => {
|
|
80
78
|
clearTimeout(timer);
|
|
@@ -82,7 +80,7 @@ class RawCdpBackend {
|
|
|
82
80
|
}, { once: true });
|
|
83
81
|
ws.addEventListener('error', () => {
|
|
84
82
|
clearTimeout(timer);
|
|
85
|
-
reject(new
|
|
83
|
+
reject(new AttachError('CDP_UNAVAILABLE', 'ws connection refused or failed'));
|
|
86
84
|
}, { once: true });
|
|
87
85
|
});
|
|
88
86
|
// Persistent drop handlers attach only AFTER a successful open, so a refused
|
|
@@ -149,19 +147,19 @@ class RawCdpBackend {
|
|
|
149
147
|
/** Runtime.evaluate in the agent tab (optional backend capability used by extract/evaluate). */
|
|
150
148
|
async evalInTab(tab, expression, timeoutMs) {
|
|
151
149
|
this.requireTab(tab);
|
|
152
|
-
const res = (await this.send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true }, this.sessionId, timeoutMs ??
|
|
150
|
+
const res = (await this.send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true }, this.sessionId, timeoutMs ?? 30_000));
|
|
153
151
|
if (res.exceptionDetails) {
|
|
154
|
-
throw new
|
|
152
|
+
throw new AttachError('UNKNOWN', `page evaluation failed: ${res.exceptionDetails.text ?? 'exception'}`);
|
|
155
153
|
}
|
|
156
154
|
const value = res.result?.value;
|
|
157
155
|
if (typeof value === 'string' && value.length > this.opts.evalMaxChars) {
|
|
158
|
-
throw new
|
|
156
|
+
throw new AttachError('UNKNOWN', `eval result exceeds ${this.opts.evalMaxChars} chars`);
|
|
159
157
|
}
|
|
160
158
|
return value;
|
|
161
159
|
}
|
|
162
160
|
requireTab(tab) {
|
|
163
161
|
if (!this.sessionId || tab !== this.createdTargetId) {
|
|
164
|
-
throw new
|
|
162
|
+
throw new AttachError('TAB_CLOSED', 'agent tab is not claimed on this transport');
|
|
165
163
|
}
|
|
166
164
|
}
|
|
167
165
|
onMessage(data) {
|
|
@@ -178,12 +176,12 @@ class RawCdpBackend {
|
|
|
178
176
|
this.pending.delete(m.id);
|
|
179
177
|
clearTimeout(p.timer);
|
|
180
178
|
if (m.error)
|
|
181
|
-
p.reject(new
|
|
179
|
+
p.reject(new AttachError('UNKNOWN', m.error.message));
|
|
182
180
|
else
|
|
183
181
|
p.resolve(m.result);
|
|
184
182
|
}
|
|
185
183
|
failAllPending(reason) {
|
|
186
|
-
const err = new
|
|
184
|
+
const err = new AttachError('CDP_UNAVAILABLE', reason);
|
|
187
185
|
for (const [, p] of this.pending) {
|
|
188
186
|
clearTimeout(p.timer);
|
|
189
187
|
p.reject(err);
|
|
@@ -198,13 +196,13 @@ class RawCdpBackend {
|
|
|
198
196
|
send(method, params = {}, sessionId, timeoutMs) {
|
|
199
197
|
const ws = this.ws;
|
|
200
198
|
if (!ws)
|
|
201
|
-
return Promise.reject(new
|
|
199
|
+
return Promise.reject(new AttachError('CDP_UNAVAILABLE', 'transport is not connected'));
|
|
202
200
|
const id = ++this.nextId;
|
|
203
201
|
const deadline = timeoutMs ?? this.opts.commandTimeoutMs;
|
|
204
202
|
return new Promise((resolve, reject) => {
|
|
205
203
|
const timer = setTimeout(() => {
|
|
206
204
|
if (this.pending.delete(id)) {
|
|
207
|
-
reject(new
|
|
205
|
+
reject(new AttachError('CDP_TIMEOUT', `${method} timed out after ${deadline}ms`));
|
|
208
206
|
}
|
|
209
207
|
}, deadline);
|
|
210
208
|
this.pending.set(id, { resolve, reject, timer });
|
|
@@ -212,5 +210,4 @@ class RawCdpBackend {
|
|
|
212
210
|
});
|
|
213
211
|
}
|
|
214
212
|
}
|
|
215
|
-
exports.RawCdpBackend = RawCdpBackend;
|
|
216
213
|
//# sourceMappingURL=raw-cdp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-cdp.js","sourceRoot":"","sources":["../../../src/attach/backends/raw-cdp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"raw-cdp.js","sourceRoot":"","sources":["../../../src/attach/backends/raw-cdp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AttachDaemonClient = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Typed client for the attach daemon's file queue.
|
|
6
3
|
*
|
|
@@ -15,28 +12,32 @@ exports.AttachDaemonClient = void 0;
|
|
|
15
12
|
*
|
|
16
13
|
* @module browser-automation/attach/daemon/client
|
|
17
14
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
import { unlinkSync, existsSync } from 'node:fs';
|
|
16
|
+
import { AttachError } from '../errors.js';
|
|
17
|
+
import { resolveIpcDir, newCmdId, writeAtomicJson, readJson, cmdPath, respPath, statusPath, HEARTBEAT_STALE_MS, } from './protocol.js';
|
|
21
18
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
22
19
|
/** See fileoverview. All failures throw {@link AttachError} with a structured code. */
|
|
23
|
-
class AttachDaemonClient {
|
|
20
|
+
export class AttachDaemonClient {
|
|
21
|
+
ipcDir;
|
|
22
|
+
client;
|
|
23
|
+
pollMs;
|
|
24
|
+
opTimeoutMs;
|
|
24
25
|
constructor(opts = {}) {
|
|
25
|
-
this.ipcDir =
|
|
26
|
+
this.ipcDir = resolveIpcDir(opts.ipcDir);
|
|
26
27
|
this.client = `${opts.client ?? 'client'}-${process.pid}`;
|
|
27
28
|
this.pollMs = opts.pollMs ?? 400;
|
|
28
|
-
this.opTimeoutMs = opts.opTimeoutMs ??
|
|
29
|
+
this.opTimeoutMs = opts.opTimeoutMs ?? 45_000;
|
|
29
30
|
}
|
|
30
31
|
/** Fast, round-trip-free snapshot of status.json (undefined when absent). */
|
|
31
32
|
statusFile() {
|
|
32
|
-
return
|
|
33
|
+
return readJson(statusPath(this.ipcDir));
|
|
33
34
|
}
|
|
34
35
|
/** True when status.json shows a fresh heartbeat or a live recorded pid. */
|
|
35
36
|
daemonLooksAlive() {
|
|
36
37
|
const s = this.statusFile();
|
|
37
38
|
if (!s || s.state === 'stopped' || s.state === 'failed')
|
|
38
39
|
return false;
|
|
39
|
-
if (Date.now() - s.t <=
|
|
40
|
+
if (Date.now() - s.t <= HEARTBEAT_STALE_MS)
|
|
40
41
|
return true;
|
|
41
42
|
try {
|
|
42
43
|
process.kill(s.pid, 0);
|
|
@@ -72,7 +73,7 @@ class AttachDaemonClient {
|
|
|
72
73
|
}
|
|
73
74
|
/** USER LANE ONLY: arbitrary page evaluation for user-authored scripts. */
|
|
74
75
|
async evaluate(expression, timeoutMs) {
|
|
75
|
-
return (await this.request('eval', { expression, timeoutMs }, this.opTimeoutMs + (timeoutMs ??
|
|
76
|
+
return (await this.request('eval', { expression, timeoutMs }, this.opTimeoutMs + (timeoutMs ?? 30_000)));
|
|
76
77
|
}
|
|
77
78
|
/** Give up driving rights (daemon parks the tab; its session persists). */
|
|
78
79
|
async release() {
|
|
@@ -88,33 +89,32 @@ class AttachDaemonClient {
|
|
|
88
89
|
}
|
|
89
90
|
async request(op, args = {}, timeoutMs) {
|
|
90
91
|
if (!this.daemonLooksAlive()) {
|
|
91
|
-
throw new
|
|
92
|
+
throw new AttachError('DAEMON_UNAVAILABLE', 'no live attach daemon behind this IPC dir; run `wunderland attach start`');
|
|
92
93
|
}
|
|
93
|
-
const id =
|
|
94
|
-
const cmdFile =
|
|
95
|
-
const respFile =
|
|
96
|
-
|
|
94
|
+
const id = newCmdId(this.client);
|
|
95
|
+
const cmdFile = cmdPath(this.ipcDir, id);
|
|
96
|
+
const respFile = respPath(this.ipcDir, id);
|
|
97
|
+
writeAtomicJson(cmdFile, { id, client: this.client, op, args });
|
|
97
98
|
const deadline = Date.now() + (timeoutMs ?? this.opTimeoutMs);
|
|
98
99
|
while (Date.now() < deadline) {
|
|
99
100
|
await sleep(this.pollMs);
|
|
100
|
-
const resp =
|
|
101
|
+
const resp = readJson(respFile);
|
|
101
102
|
if (!resp)
|
|
102
103
|
continue;
|
|
103
104
|
try {
|
|
104
|
-
|
|
105
|
+
unlinkSync(respFile);
|
|
105
106
|
}
|
|
106
107
|
catch {
|
|
107
108
|
/* raced with GC */
|
|
108
109
|
}
|
|
109
110
|
if (resp.ok)
|
|
110
111
|
return resp.data;
|
|
111
|
-
throw new
|
|
112
|
+
throw new AttachError(resp.error.code, resp.error.message);
|
|
112
113
|
}
|
|
113
|
-
const consumed = !
|
|
114
|
-
throw new
|
|
114
|
+
const consumed = !existsSync(cmdFile);
|
|
115
|
+
throw new AttachError(consumed ? 'CDP_TIMEOUT' : 'DAEMON_UNAVAILABLE', consumed
|
|
115
116
|
? `${op} timed out awaiting the daemon's response`
|
|
116
117
|
: `${op} was never consumed — daemon gone; run \`wunderland attach start\``);
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
|
-
exports.AttachDaemonClient = AttachDaemonClient;
|
|
120
120
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/attach/daemon/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/attach/daemon/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.acquireDaemonLock = acquireDaemonLock;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Atomic daemon singleton via an O_EXCL pidfile.
|
|
6
3
|
*
|
|
@@ -16,9 +13,9 @@ exports.acquireDaemonLock = acquireDaemonLock;
|
|
|
16
13
|
*
|
|
17
14
|
* @module browser-automation/attach/daemon/daemon-lock
|
|
18
15
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
import { openSync, writeSync, closeSync, readFileSync, unlinkSync, mkdirSync } from 'node:fs';
|
|
17
|
+
import { dirname } from 'node:path';
|
|
18
|
+
import { AttachError } from '../errors.js';
|
|
22
19
|
/** True when `pid` refers to a live process we may signal (EPERM counts as alive). */
|
|
23
20
|
function pidAlive(pid) {
|
|
24
21
|
try {
|
|
@@ -39,21 +36,21 @@ function pidAlive(pid) {
|
|
|
39
36
|
*
|
|
40
37
|
* @throws {AttachError} `DAEMON_RUNNING` when another live daemon holds the lock.
|
|
41
38
|
*/
|
|
42
|
-
function acquireDaemonLock(pidFile) {
|
|
43
|
-
|
|
39
|
+
export function acquireDaemonLock(pidFile) {
|
|
40
|
+
mkdirSync(dirname(pidFile), { recursive: true, mode: 0o700 });
|
|
44
41
|
const body = { pid: process.pid, startedAt: Date.now() };
|
|
45
42
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
46
43
|
try {
|
|
47
|
-
const fd =
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
const fd = openSync(pidFile, 'wx', 0o600);
|
|
45
|
+
writeSync(fd, JSON.stringify(body));
|
|
46
|
+
closeSync(fd);
|
|
50
47
|
return {
|
|
51
48
|
pidFile,
|
|
52
49
|
release() {
|
|
53
50
|
try {
|
|
54
|
-
const cur = JSON.parse(
|
|
51
|
+
const cur = JSON.parse(readFileSync(pidFile, 'utf8'));
|
|
55
52
|
if (cur.pid === process.pid)
|
|
56
|
-
|
|
53
|
+
unlinkSync(pidFile);
|
|
57
54
|
}
|
|
58
55
|
catch {
|
|
59
56
|
/* released best-effort: file gone or owned by a newer daemon */
|
|
@@ -66,22 +63,22 @@ function acquireDaemonLock(pidFile) {
|
|
|
66
63
|
throw err;
|
|
67
64
|
let holder;
|
|
68
65
|
try {
|
|
69
|
-
holder = JSON.parse(
|
|
66
|
+
holder = JSON.parse(readFileSync(pidFile, 'utf8'));
|
|
70
67
|
}
|
|
71
68
|
catch {
|
|
72
69
|
/* torn or unreadable body: treat as reclaimable */
|
|
73
70
|
}
|
|
74
71
|
if (holder && pidAlive(holder.pid)) {
|
|
75
|
-
throw new
|
|
72
|
+
throw new AttachError('DAEMON_RUNNING', `daemon already running (pid ${holder.pid})`);
|
|
76
73
|
}
|
|
77
74
|
try {
|
|
78
|
-
|
|
75
|
+
unlinkSync(pidFile);
|
|
79
76
|
}
|
|
80
77
|
catch {
|
|
81
78
|
/* raced with another reclaimer; the retry create decides the winner */
|
|
82
79
|
}
|
|
83
80
|
}
|
|
84
81
|
}
|
|
85
|
-
throw new
|
|
82
|
+
throw new AttachError('DAEMON_RUNNING', 'daemon lock contention: another process reclaimed the pidfile first');
|
|
86
83
|
}
|
|
87
84
|
//# sourceMappingURL=daemon-lock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-lock.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-lock.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB3C,sFAAsF;AACtF,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAa,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACnE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,OAAO;gBACL,OAAO;gBACP,OAAO;oBACL,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAa,CAAC;wBAClE,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;4BAAE,UAAU,CAAC,OAAO,CAAC,CAAC;oBACnD,CAAC;oBAAC,MAAM,CAAC;wBACP,gEAAgE;oBAClE,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,IAAI,MAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAa,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;YACD,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,+BAA+B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,CAAC;gBACH,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,qEAAqE,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -3,4 +3,15 @@
|
|
|
3
3
|
* code (0 clean stop, 2 failure). Exported for tests and for the CLI.
|
|
4
4
|
*/
|
|
5
5
|
export declare function main(env?: Record<string, string | undefined>): Promise<number>;
|
|
6
|
+
/**
|
|
7
|
+
* True when `moduleUrl` is the script Node was started with (`node <entryPath>`).
|
|
8
|
+
*
|
|
9
|
+
* Both sides resolve to a real path before the comparison: a file URL
|
|
10
|
+
* percent-encodes characters such as spaces, Node follows symlinks when it
|
|
11
|
+
* builds `import.meta.url` for the entry script but keeps them under
|
|
12
|
+
* `--preserve-symlinks-main`, and the entry path may be relative. A missing
|
|
13
|
+
* or unreadable entry path, or a module URL that is not a file, is not this
|
|
14
|
+
* module. Exported for tests.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isEntryPoint(moduleUrl: string, entryPath: string | undefined): boolean;
|
|
6
17
|
//# sourceMappingURL=daemon-main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-main.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-main.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,wBAAsB,IAAI,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOtF"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.main = main;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Runnable attach-daemon entry: `node .../daemon-main.js`.
|
|
6
3
|
*
|
|
@@ -11,20 +8,22 @@ exports.main = main;
|
|
|
11
8
|
*
|
|
12
9
|
* @module browser-automation/attach/daemon/daemon-main
|
|
13
10
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
import { realpathSync } from 'node:fs';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { AttachController } from '../AttachController.js';
|
|
16
|
+
import { RawCdpBackend } from '../backends/raw-cdp.js';
|
|
17
|
+
import { AttachDaemon } from './daemon.js';
|
|
18
|
+
import { resolveIpcDir, statusPath, writeAtomicJson, DEFAULT_PID_FILE } from './protocol.js';
|
|
20
19
|
/**
|
|
21
20
|
* Build and run the daemon from an environment map. Returns the process exit
|
|
22
21
|
* code (0 clean stop, 2 failure). Exported for tests and for the CLI.
|
|
23
22
|
*/
|
|
24
|
-
async function main(env = process.env) {
|
|
25
|
-
const ipcDir =
|
|
23
|
+
export async function main(env = process.env) {
|
|
24
|
+
const ipcDir = resolveIpcDir(undefined, env);
|
|
26
25
|
const fail = (msg) => {
|
|
27
|
-
|
|
26
|
+
writeAtomicJson(statusPath(ipcDir), { t: Date.now(), pid: process.pid, state: 'failed', lastError: msg });
|
|
28
27
|
console.error(`attach daemon: ${msg}`);
|
|
29
28
|
return 2;
|
|
30
29
|
};
|
|
@@ -37,7 +36,7 @@ async function main(env = process.env) {
|
|
|
37
36
|
if (!expectedIdentity) {
|
|
38
37
|
return fail('WUNDERLAND_ATTACH_IDENTITY is required (the profile identity the daemon must verify)');
|
|
39
38
|
}
|
|
40
|
-
const backend = new
|
|
39
|
+
const backend = new RawCdpBackend({
|
|
41
40
|
profileRoot: env.WUNDERLAND_ATTACH_PROFILE_ROOT?.trim() || undefined,
|
|
42
41
|
identityProbeUrl: env.WUNDERLAND_ATTACH_PROBE_URL?.trim() || undefined,
|
|
43
42
|
settleMs: 0, // settle is applied daemon-side per goto op (default 1800ms)
|
|
@@ -46,21 +45,21 @@ async function main(env = process.env) {
|
|
|
46
45
|
.map((s) => s.trim())
|
|
47
46
|
.filter(Boolean);
|
|
48
47
|
const deadlineMs = Number(env.WUNDERLAND_ATTACH_DEADLINE_MS);
|
|
49
|
-
const controller = new
|
|
48
|
+
const controller = new AttachController({
|
|
50
49
|
backend,
|
|
51
50
|
// Mirrors the pack default in src/index.ts so CLI-started and pack-embedded
|
|
52
51
|
// sessions contend on the SAME lease file.
|
|
53
|
-
leaseFile: env.WUNDERLAND_ATTACH_LEASE?.trim() ||
|
|
52
|
+
leaseFile: env.WUNDERLAND_ATTACH_LEASE?.trim() || join(homedir(), '.wunderland', 'attach.lease'),
|
|
54
53
|
expectedIdentity,
|
|
55
54
|
urlPolicy: allowHosts?.length ? { allowHosts } : undefined,
|
|
56
55
|
dryRun: env.WUNDERLAND_ATTACH_DRYRUN === '1' || env.WUNDERLAND_ATTACH_DRYRUN === 'true',
|
|
57
56
|
deadlineMs: Number.isFinite(deadlineMs) && deadlineMs > 0 ? deadlineMs : undefined,
|
|
58
57
|
});
|
|
59
|
-
const daemon = new
|
|
58
|
+
const daemon = new AttachDaemon({
|
|
60
59
|
controller,
|
|
61
60
|
backend,
|
|
62
61
|
ipcDir,
|
|
63
|
-
pidFile: env.WUNDERLAND_ATTACH_PID_FILE?.trim() ||
|
|
62
|
+
pidFile: env.WUNDERLAND_ATTACH_PID_FILE?.trim() || DEFAULT_PID_FILE,
|
|
64
63
|
log: (line) => console.error(`[attach-daemon] ${line}`),
|
|
65
64
|
});
|
|
66
65
|
process.on('SIGTERM', () => daemon.requestStop('SIGTERM'));
|
|
@@ -73,8 +72,28 @@ async function main(env = process.env) {
|
|
|
73
72
|
return fail(err.message);
|
|
74
73
|
}
|
|
75
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* True when `moduleUrl` is the script Node was started with (`node <entryPath>`).
|
|
77
|
+
*
|
|
78
|
+
* Both sides resolve to a real path before the comparison: a file URL
|
|
79
|
+
* percent-encodes characters such as spaces, Node follows symlinks when it
|
|
80
|
+
* builds `import.meta.url` for the entry script but keeps them under
|
|
81
|
+
* `--preserve-symlinks-main`, and the entry path may be relative. A missing
|
|
82
|
+
* or unreadable entry path, or a module URL that is not a file, is not this
|
|
83
|
+
* module. Exported for tests.
|
|
84
|
+
*/
|
|
85
|
+
export function isEntryPoint(moduleUrl, entryPath) {
|
|
86
|
+
if (!entryPath)
|
|
87
|
+
return false;
|
|
88
|
+
try {
|
|
89
|
+
return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(entryPath);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
76
95
|
// Invoked directly (not imported): run and exit with the returned code.
|
|
77
|
-
if (
|
|
96
|
+
if (isEntryPoint(import.meta.url, process.argv[1])) {
|
|
78
97
|
void main().then((code) => process.exit(code));
|
|
79
98
|
}
|
|
80
99
|
//# sourceMappingURL=daemon-main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-main.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-main.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAgB9E,2BAA2B;AAC3B,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,8FAA8F;IAC9F,OAAO,EAAE,aAAa,GAAG;QAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAQD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAE7C,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAqE;IACrF,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,IAAI,EAAE,mBAAmB;IAUrC,kDAAkD;IAClD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKjC,6EAA6E;IACvE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD1B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;YAOT,OAAO;YAuFP,QAAQ;CAgBvB"}
|