@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,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const ws_1 = require("ws");
|
|
5
|
-
const node_fs_1 = require("node:fs");
|
|
6
|
-
const node_os_1 = require("node:os");
|
|
7
|
-
const node_path_1 = require("node:path");
|
|
8
|
-
const raw_cdp_js_1 = require("../raw-cdp.js");
|
|
9
|
-
/** Minimal fake CDP browser endpoint: answers exactly the methods the backend may send. */
|
|
10
|
-
function fakeCdp(opts = {}) {
|
|
11
|
-
const wss = new ws_1.WebSocketServer({ port: 0, path: '/devtools/browser/fake' });
|
|
12
|
-
const seen = [];
|
|
13
|
-
const created = [];
|
|
14
|
-
const closed = [];
|
|
15
|
-
wss.on('connection', (sock) => {
|
|
16
|
-
sock.on('message', (buf) => {
|
|
17
|
-
const m = JSON.parse(String(buf));
|
|
18
|
-
seen.push(m.method);
|
|
19
|
-
if (opts.wedgeAfterConnect)
|
|
20
|
-
return; // never answer: simulates a zombie handshake
|
|
21
|
-
const reply = (result) => sock.send(JSON.stringify({ id: m.id, result }));
|
|
22
|
-
switch (m.method) {
|
|
23
|
-
case 'Target.getTargets':
|
|
24
|
-
return reply({ targetInfos: (opts.pages ?? []).map((p) => ({ ...p, type: 'page' })) });
|
|
25
|
-
case 'Target.createTarget': {
|
|
26
|
-
const targetId = `created-${created.length + 1}`;
|
|
27
|
-
created.push(targetId);
|
|
28
|
-
return reply({ targetId });
|
|
29
|
-
}
|
|
30
|
-
case 'Target.attachToTarget':
|
|
31
|
-
return reply({ sessionId: 'sess-1' });
|
|
32
|
-
case 'Target.closeTarget':
|
|
33
|
-
closed.push(m.params.targetId);
|
|
34
|
-
return reply({ success: true });
|
|
35
|
-
case 'Page.enable':
|
|
36
|
-
case 'Runtime.enable':
|
|
37
|
-
return reply({});
|
|
38
|
-
case 'Page.navigate':
|
|
39
|
-
return reply({ frameId: 'f1' });
|
|
40
|
-
case 'Runtime.evaluate':
|
|
41
|
-
return reply({
|
|
42
|
-
result: { value: m.params.expression.includes('location.href') ? 'https://example.com/' : 'evaluated' },
|
|
43
|
-
});
|
|
44
|
-
default:
|
|
45
|
-
return reply({});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
return { wss, seen, created, closed, port: () => wss.address().port };
|
|
50
|
-
}
|
|
51
|
-
/** Profile root whose DevToolsActivePort points at the fake server. */
|
|
52
|
-
function profileRootFor(port) {
|
|
53
|
-
const d = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-prof-'));
|
|
54
|
-
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(d, 'DevToolsActivePort'), `${port}\n/devtools/browser/fake`);
|
|
55
|
-
return d;
|
|
56
|
-
}
|
|
57
|
-
const cleanup = [];
|
|
58
|
-
(0, vitest_1.afterEach)(() => {
|
|
59
|
-
for (const f of cleanup.splice(0))
|
|
60
|
-
f();
|
|
61
|
-
});
|
|
62
|
-
(0, vitest_1.describe)('RawCdpBackend', () => {
|
|
63
|
-
(0, vitest_1.it)('attaches to exactly ONE created target and never closes foreign targets', async () => {
|
|
64
|
-
const srv = fakeCdp({
|
|
65
|
-
pages: [{ targetId: 'user-tab-1', url: 'https://mail.google.com/', title: 'Inbox - user@gmail.com - Gmail' }],
|
|
66
|
-
});
|
|
67
|
-
cleanup.push(() => srv.wss.close());
|
|
68
|
-
const prof = profileRootFor(srv.port());
|
|
69
|
-
cleanup.push(() => (0, node_fs_1.rmSync)(prof, { recursive: true, force: true }));
|
|
70
|
-
const be = new raw_cdp_js_1.RawCdpBackend({ profileRoot: prof, settleMs: 0 });
|
|
71
|
-
await be.connect();
|
|
72
|
-
const tab = await be.claimAgentTab();
|
|
73
|
-
(0, vitest_1.expect)(srv.created).toContain(tab);
|
|
74
|
-
(0, vitest_1.expect)(await be.gotoTab(tab, 'https://example.com/')).toBe('https://example.com/');
|
|
75
|
-
(0, vitest_1.expect)(await be.readTab(tab)).toBe('evaluated');
|
|
76
|
-
await be.disconnectTransport();
|
|
77
|
-
(0, vitest_1.expect)(srv.seen).not.toContain('Browser.close');
|
|
78
|
-
(0, vitest_1.expect)(srv.closed).toEqual([tab]); // ONLY our own created tab, ever
|
|
79
|
-
});
|
|
80
|
-
(0, vitest_1.it)('probeIdentity reads target metadata only (no attach, no navigation)', async () => {
|
|
81
|
-
const srv = fakeCdp({
|
|
82
|
-
pages: [{ targetId: 'user-tab-1', url: 'https://mail.google.com/mail/u/0', title: 'Inbox - user@gmail.com - Gmail' }],
|
|
83
|
-
});
|
|
84
|
-
cleanup.push(() => srv.wss.close());
|
|
85
|
-
const prof = profileRootFor(srv.port());
|
|
86
|
-
cleanup.push(() => (0, node_fs_1.rmSync)(prof, { recursive: true, force: true }));
|
|
87
|
-
const be = new raw_cdp_js_1.RawCdpBackend({ profileRoot: prof });
|
|
88
|
-
await be.connect();
|
|
89
|
-
const before = srv.seen.length;
|
|
90
|
-
const identity = await be.probeIdentity();
|
|
91
|
-
(0, vitest_1.expect)(identity).toContain('user@gmail.com');
|
|
92
|
-
(0, vitest_1.expect)(srv.seen.slice(before)).toEqual(['Target.getTargets']); // metadata only
|
|
93
|
-
await be.disconnectTransport();
|
|
94
|
-
});
|
|
95
|
-
(0, vitest_1.it)('missing DevToolsActivePort throws CDP_UNAVAILABLE without any connection', async () => {
|
|
96
|
-
const d = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-noprof-'));
|
|
97
|
-
cleanup.push(() => (0, node_fs_1.rmSync)(d, { recursive: true, force: true }));
|
|
98
|
-
const be = new raw_cdp_js_1.RawCdpBackend({ profileRoot: d });
|
|
99
|
-
await (0, vitest_1.expect)(be.connect()).rejects.toMatchObject({ code: 'CDP_UNAVAILABLE' });
|
|
100
|
-
});
|
|
101
|
-
(0, vitest_1.it)('malformed DevToolsActivePort throws STALE_PORT_FILE', async () => {
|
|
102
|
-
const d = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-badprof-'));
|
|
103
|
-
cleanup.push(() => (0, node_fs_1.rmSync)(d, { recursive: true, force: true }));
|
|
104
|
-
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(d, 'DevToolsActivePort'), 'garbage\n');
|
|
105
|
-
const be = new raw_cdp_js_1.RawCdpBackend({ profileRoot: d });
|
|
106
|
-
await (0, vitest_1.expect)(be.connect()).rejects.toMatchObject({ code: 'STALE_PORT_FILE' });
|
|
107
|
-
});
|
|
108
|
-
(0, vitest_1.it)('a wedged endpoint times out with CDP_TIMEOUT instead of hanging', async () => {
|
|
109
|
-
const srv = fakeCdp({ wedgeAfterConnect: true });
|
|
110
|
-
cleanup.push(() => srv.wss.close());
|
|
111
|
-
const prof = profileRootFor(srv.port());
|
|
112
|
-
cleanup.push(() => (0, node_fs_1.rmSync)(prof, { recursive: true, force: true }));
|
|
113
|
-
const be = new raw_cdp_js_1.RawCdpBackend({ profileRoot: prof, commandTimeoutMs: 300 });
|
|
114
|
-
await be.connect();
|
|
115
|
-
await (0, vitest_1.expect)(be.claimAgentTab()).rejects.toMatchObject({ code: 'CDP_TIMEOUT' });
|
|
116
|
-
await be.disconnectTransport();
|
|
117
|
-
});
|
|
118
|
-
(0, vitest_1.it)('an unexpected transport drop fails pending commands and fires onUnexpectedClose once', async () => {
|
|
119
|
-
const srv = fakeCdp({ wedgeAfterConnect: true });
|
|
120
|
-
cleanup.push(() => srv.wss.close());
|
|
121
|
-
const prof = profileRootFor(srv.port());
|
|
122
|
-
cleanup.push(() => (0, node_fs_1.rmSync)(prof, { recursive: true, force: true }));
|
|
123
|
-
const be = new raw_cdp_js_1.RawCdpBackend({ profileRoot: prof, commandTimeoutMs: 5000 });
|
|
124
|
-
const drops = [];
|
|
125
|
-
be.onUnexpectedClose = (err) => drops.push(err.message);
|
|
126
|
-
await be.connect();
|
|
127
|
-
const inflight = be.claimAgentTab();
|
|
128
|
-
srv.wss.clients.forEach((c) => c.terminate());
|
|
129
|
-
await (0, vitest_1.expect)(inflight).rejects.toMatchObject({ code: 'CDP_UNAVAILABLE' });
|
|
130
|
-
(0, vitest_1.expect)(drops).toHaveLength(1);
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
//# sourceMappingURL=raw-cdp.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"raw-cdp.test.js","sourceRoot":"","sources":["../../../../src/attach/backends/__tests__/raw-cdp.test.ts"],"names":[],"mappings":";;AAAA,mCAAyD;AACzD,2BAAqC;AACrC,qCAA6D;AAC7D,qCAAiC;AACjC,yCAAiC;AACjC,8CAA8C;AAE9C,2FAA2F;AAC3F,SAAS,OAAO,CAAC,OAAyG,EAAE;IAC1H,MAAM,GAAG,GAAG,IAAI,oBAAe,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACpB,IAAI,IAAI,CAAC,iBAAiB;gBAAE,OAAO,CAAC,6CAA6C;YACjF,MAAM,KAAK,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACnF,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,mBAAmB;oBACtB,OAAO,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzF,KAAK,qBAAqB,CAAC,CAAC,CAAC;oBAC3B,MAAM,QAAQ,GAAG,WAAW,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvB,OAAO,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7B,CAAC;gBACD,KAAK,uBAAuB;oBAC1B,OAAO,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxC,KAAK,oBAAoB;oBACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClC,KAAK,aAAa,CAAC;gBACnB,KAAK,gBAAgB;oBACnB,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;gBACnB,KAAK,eAAe;oBAClB,OAAO,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClC,KAAK,kBAAkB;oBACrB,OAAO,KAAK,CAAC;wBACX,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,WAAW,EAAE;qBACxG,CAAC,CAAC;gBACL;oBACE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAE,GAAG,CAAC,OAAO,EAAuB,CAAC,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED,uEAAuE;AACvE,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,CAAC,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACtD,IAAA,uBAAa,EAAC,IAAA,gBAAI,EAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAChF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,GAAsB,EAAE,CAAC;AACtC,IAAA,kBAAS,EAAC,GAAG,EAAE;IACb,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,0BAA0B,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;SAC9G,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,0BAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QACrC,IAAA,eAAM,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnC,IAAA,eAAM,EAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnF,IAAA,eAAM,EAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAC/B,IAAA,eAAM,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iCAAiC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,kCAAkC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;SACtH,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,0BAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QAC1C,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAC/E,MAAM,EAAE,CAAC,mBAAmB,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,CAAC,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,IAAI,0BAAa,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,IAAA,eAAM,EAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,IAAA,uBAAa,EAAC,IAAA,gBAAI,EAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAG,IAAI,0BAAa,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,IAAA,eAAM,EAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,0BAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAA,eAAM,EAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QAChF,MAAM,EAAE,CAAC,mBAAmB,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,0BAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAK,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,EAAE,CAAC,iBAAiB,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC1E,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/client.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const node_fs_1 = require("node:fs");
|
|
5
|
-
const node_os_1 = require("node:os");
|
|
6
|
-
const node_path_1 = require("node:path");
|
|
7
|
-
const client_js_1 = require("../client.js");
|
|
8
|
-
const harness_js_1 = require("./harness.js");
|
|
9
|
-
const cleanups = [];
|
|
10
|
-
(0, vitest_1.afterEach)(() => {
|
|
11
|
-
for (const f of cleanups.splice(0))
|
|
12
|
-
f();
|
|
13
|
-
});
|
|
14
|
-
(0, vitest_1.describe)('AttachDaemonClient', () => {
|
|
15
|
-
(0, vitest_1.it)('drives the full session lifecycle over the queue', async () => {
|
|
16
|
-
const { dir, backend, run } = (0, harness_js_1.daemonUnderTest)();
|
|
17
|
-
cleanups.push(() => (0, node_fs_1.rmSync)(dir, { recursive: true, force: true }));
|
|
18
|
-
const client = new client_js_1.AttachDaemonClient({ ipcDir: (0, node_path_1.join)(dir, 'ipc'), client: 'test', pollMs: 25 });
|
|
19
|
-
(0, vitest_1.expect)((await client.ping()).pong).toBe(true);
|
|
20
|
-
(0, vitest_1.expect)(client.daemonLooksAlive()).toBe(true);
|
|
21
|
-
const claimed = await client.claim();
|
|
22
|
-
(0, vitest_1.expect)(String(claimed.identity)).toContain('user@gmail.com');
|
|
23
|
-
(0, vitest_1.expect)((await client.goto('https://example.com/', { settle: 0 })).url).toBe('https://example.com/');
|
|
24
|
-
(0, vitest_1.expect)(backend.calls).toContain('goto:https://example.com/');
|
|
25
|
-
const read = await client.read();
|
|
26
|
-
(0, vitest_1.expect)(read.untrusted).toBe(true);
|
|
27
|
-
(0, vitest_1.expect)(read.text).toBe('PAGE TEXT');
|
|
28
|
-
const extracted = await client.extract({ perks: 'li' });
|
|
29
|
-
(0, vitest_1.expect)(extracted.untrusted).toBe(true);
|
|
30
|
-
const evaluated = await client.evaluate('1+1');
|
|
31
|
-
(0, vitest_1.expect)(evaluated.untrusted).toBe(true);
|
|
32
|
-
(0, vitest_1.expect)(evaluated.value).toBe('evaluated');
|
|
33
|
-
const controlled = await client.control('pause');
|
|
34
|
-
(0, vitest_1.expect)(controlled.paused).toBe(true);
|
|
35
|
-
await client.control('resume');
|
|
36
|
-
await client.release();
|
|
37
|
-
await client.quit();
|
|
38
|
-
await run;
|
|
39
|
-
(0, vitest_1.expect)(client.daemonLooksAlive()).toBe(false); // stopped state
|
|
40
|
-
}, 60000);
|
|
41
|
-
(0, vitest_1.it)('structured errors rethrow with their code', async () => {
|
|
42
|
-
const { dir, run } = (0, harness_js_1.daemonUnderTest)();
|
|
43
|
-
cleanups.push(() => (0, node_fs_1.rmSync)(dir, { recursive: true, force: true }));
|
|
44
|
-
const client = new client_js_1.AttachDaemonClient({ ipcDir: (0, node_path_1.join)(dir, 'ipc'), client: 'test', pollMs: 25 });
|
|
45
|
-
await (0, vitest_1.expect)(client.goto('https://example.com/')).rejects.toMatchObject({ code: 'NOT_CLAIMANT' });
|
|
46
|
-
await client.claim();
|
|
47
|
-
await (0, vitest_1.expect)(client.goto('http://insecure.example/')).rejects.toMatchObject({ code: 'POLICY_BLOCKED' });
|
|
48
|
-
await client.quit();
|
|
49
|
-
await run;
|
|
50
|
-
}, 60000);
|
|
51
|
-
(0, vitest_1.it)('reports DAEMON_UNAVAILABLE fast when nothing serves the ipc dir', async () => {
|
|
52
|
-
const empty = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-nodaemon-'));
|
|
53
|
-
cleanups.push(() => (0, node_fs_1.rmSync)(empty, { recursive: true, force: true }));
|
|
54
|
-
const client = new client_js_1.AttachDaemonClient({ ipcDir: empty, client: 'test', pollMs: 25, opTimeoutMs: 500 });
|
|
55
|
-
await (0, vitest_1.expect)(client.ping()).rejects.toMatchObject({ code: 'DAEMON_UNAVAILABLE' });
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
//# sourceMappingURL=client.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-lock.test.d.ts","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/daemon-lock.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const node_fs_1 = require("node:fs");
|
|
5
|
-
const node_os_1 = require("node:os");
|
|
6
|
-
const node_path_1 = require("node:path");
|
|
7
|
-
const daemon_lock_js_1 = require("../daemon-lock.js");
|
|
8
|
-
const errors_js_1 = require("../../errors.js");
|
|
9
|
-
const dirs = [];
|
|
10
|
-
const tdir = () => {
|
|
11
|
-
const d = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-lock-'));
|
|
12
|
-
dirs.push(d);
|
|
13
|
-
return d;
|
|
14
|
-
};
|
|
15
|
-
(0, vitest_1.afterEach)(() => {
|
|
16
|
-
for (const d of dirs.splice(0))
|
|
17
|
-
(0, node_fs_1.rmSync)(d, { recursive: true, force: true });
|
|
18
|
-
});
|
|
19
|
-
// Pids far above any realistic pid ceiling: never live on the CI box.
|
|
20
|
-
const DEAD_PID = 4190000;
|
|
21
|
-
(0, vitest_1.describe)('acquireDaemonLock', () => {
|
|
22
|
-
(0, vitest_1.it)('winner writes {pid, startedAt}; loser gets DAEMON_RUNNING naming the winner pid', () => {
|
|
23
|
-
const pidFile = (0, node_path_1.join)(tdir(), 'daemon.pid');
|
|
24
|
-
const lock = (0, daemon_lock_js_1.acquireDaemonLock)(pidFile);
|
|
25
|
-
const body = JSON.parse((0, node_fs_1.readFileSync)(pidFile, 'utf8'));
|
|
26
|
-
(0, vitest_1.expect)(body.pid).toBe(process.pid);
|
|
27
|
-
(0, vitest_1.expect)(body.startedAt).toBeGreaterThan(0);
|
|
28
|
-
try {
|
|
29
|
-
(0, daemon_lock_js_1.acquireDaemonLock)(pidFile);
|
|
30
|
-
vitest_1.expect.unreachable('second acquisition must throw');
|
|
31
|
-
}
|
|
32
|
-
catch (err) {
|
|
33
|
-
(0, vitest_1.expect)(err).toBeInstanceOf(errors_js_1.AttachError);
|
|
34
|
-
(0, vitest_1.expect)(err.code).toBe('DAEMON_RUNNING');
|
|
35
|
-
(0, vitest_1.expect)(err.message).toContain(String(process.pid));
|
|
36
|
-
}
|
|
37
|
-
lock.release();
|
|
38
|
-
});
|
|
39
|
-
(0, vitest_1.it)('reclaims a stale lock whose pid is dead, regardless of age', () => {
|
|
40
|
-
const pidFile = (0, node_path_1.join)(tdir(), 'daemon.pid');
|
|
41
|
-
(0, node_fs_1.writeFileSync)(pidFile, JSON.stringify({ pid: DEAD_PID, startedAt: Date.now() - 60000 }));
|
|
42
|
-
const lock = (0, daemon_lock_js_1.acquireDaemonLock)(pidFile);
|
|
43
|
-
(0, vitest_1.expect)(JSON.parse((0, node_fs_1.readFileSync)(pidFile, 'utf8')).pid).toBe(process.pid);
|
|
44
|
-
lock.release();
|
|
45
|
-
});
|
|
46
|
-
(0, vitest_1.it)('reclaims a torn/unreadable pidfile body', () => {
|
|
47
|
-
const pidFile = (0, node_path_1.join)(tdir(), 'daemon.pid');
|
|
48
|
-
(0, node_fs_1.writeFileSync)(pidFile, '{not json');
|
|
49
|
-
const lock = (0, daemon_lock_js_1.acquireDaemonLock)(pidFile);
|
|
50
|
-
(0, vitest_1.expect)(JSON.parse((0, node_fs_1.readFileSync)(pidFile, 'utf8')).pid).toBe(process.pid);
|
|
51
|
-
lock.release();
|
|
52
|
-
});
|
|
53
|
-
(0, vitest_1.it)('refuses to reclaim a live pid no matter how old the file is', () => {
|
|
54
|
-
const pidFile = (0, node_path_1.join)(tdir(), 'daemon.pid');
|
|
55
|
-
(0, node_fs_1.writeFileSync)(pidFile, JSON.stringify({ pid: process.pid, startedAt: 0 }));
|
|
56
|
-
(0, vitest_1.expect)(() => (0, daemon_lock_js_1.acquireDaemonLock)(pidFile)).toThrowError(/already running/);
|
|
57
|
-
});
|
|
58
|
-
(0, vitest_1.it)('release removes the pidfile only if it still owns it', () => {
|
|
59
|
-
const pidFile = (0, node_path_1.join)(tdir(), 'daemon.pid');
|
|
60
|
-
const lock = (0, daemon_lock_js_1.acquireDaemonLock)(pidFile);
|
|
61
|
-
(0, node_fs_1.writeFileSync)(pidFile, JSON.stringify({ pid: DEAD_PID + 1, startedAt: Date.now() }));
|
|
62
|
-
lock.release(); // must NOT delete a file now owned by someone else
|
|
63
|
-
(0, vitest_1.expect)(JSON.parse((0, node_fs_1.readFileSync)(pidFile, 'utf8')).pid).toBe(DEAD_PID + 1);
|
|
64
|
-
});
|
|
65
|
-
(0, vitest_1.it)('release is idempotent and never throws once the file is gone', () => {
|
|
66
|
-
const pidFile = (0, node_path_1.join)(tdir(), 'daemon.pid');
|
|
67
|
-
const lock = (0, daemon_lock_js_1.acquireDaemonLock)(pidFile);
|
|
68
|
-
lock.release();
|
|
69
|
-
(0, vitest_1.expect)(() => lock.release()).not.toThrow();
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=daemon-lock.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-lock.test.js","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/daemon-lock.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-loop.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/daemon-loop.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const node_fs_1 = require("node:fs");
|
|
5
|
-
const node_path_1 = require("node:path");
|
|
6
|
-
const protocol_js_1 = require("../protocol.js");
|
|
7
|
-
const AttachController_js_1 = require("../../AttachController.js");
|
|
8
|
-
const daemon_js_1 = require("../daemon.js");
|
|
9
|
-
const harness_js_1 = require("./harness.js");
|
|
10
|
-
const cleanups = [];
|
|
11
|
-
(0, vitest_1.afterEach)(() => {
|
|
12
|
-
for (const f of cleanups.splice(0))
|
|
13
|
-
f();
|
|
14
|
-
});
|
|
15
|
-
(0, vitest_1.describe)('AttachDaemon loop', () => {
|
|
16
|
-
(0, vitest_1.it)('serves the full op set with claim gating, then quits leaving no queue litter', async () => {
|
|
17
|
-
const { dir, backend, run } = (0, harness_js_1.daemonUnderTest)();
|
|
18
|
-
cleanups.push(() => (0, node_fs_1.rmSync)(dir, { recursive: true, force: true }));
|
|
19
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'a', 'ping')).ok).toBe(true);
|
|
20
|
-
const denied = await (0, harness_js_1.op)(dir, 'a', 'goto', { url: 'https://example.com/' });
|
|
21
|
-
(0, vitest_1.expect)(denied.ok).toBe(false);
|
|
22
|
-
if (!denied.ok)
|
|
23
|
-
(0, vitest_1.expect)(denied.error.code).toBe('NOT_CLAIMANT');
|
|
24
|
-
const claimed = await (0, harness_js_1.op)(dir, 'a', 'claim');
|
|
25
|
-
(0, vitest_1.expect)(claimed.ok).toBe(true);
|
|
26
|
-
if (claimed.ok)
|
|
27
|
-
(0, vitest_1.expect)(claimed.data.identity).toContain('user@gmail.com');
|
|
28
|
-
const busy = await (0, harness_js_1.op)(dir, 'b', 'claim');
|
|
29
|
-
(0, vitest_1.expect)(busy.ok).toBe(false);
|
|
30
|
-
if (!busy.ok)
|
|
31
|
-
(0, vitest_1.expect)(busy.error.code).toBe('LEASE_DENIED');
|
|
32
|
-
const nav = await (0, harness_js_1.op)(dir, 'a', 'goto', { url: 'https://example.com/', settle: 0 });
|
|
33
|
-
(0, vitest_1.expect)(nav.ok).toBe(true);
|
|
34
|
-
(0, vitest_1.expect)(backend.calls).toContain('goto:https://example.com/');
|
|
35
|
-
const blocked = await (0, harness_js_1.op)(dir, 'a', 'goto', { url: 'http://insecure.example/' });
|
|
36
|
-
(0, vitest_1.expect)(blocked.ok).toBe(false);
|
|
37
|
-
if (!blocked.ok)
|
|
38
|
-
(0, vitest_1.expect)(blocked.error.code).toBe('POLICY_BLOCKED');
|
|
39
|
-
const read = await (0, harness_js_1.op)(dir, 'a', 'read', {});
|
|
40
|
-
(0, vitest_1.expect)(read.ok).toBe(true);
|
|
41
|
-
if (read.ok)
|
|
42
|
-
(0, vitest_1.expect)(read.data).toMatchObject({ untrusted: true, text: 'PAGE TEXT' });
|
|
43
|
-
const extracted = await (0, harness_js_1.op)(dir, 'a', 'extract', { fields: { perks: 'li' } });
|
|
44
|
-
(0, vitest_1.expect)(extracted.ok).toBe(true);
|
|
45
|
-
if (extracted.ok)
|
|
46
|
-
(0, vitest_1.expect)(extracted.data).toMatchObject({ untrusted: true });
|
|
47
|
-
const evaluated = await (0, harness_js_1.op)(dir, 'a', 'eval', { expression: '1+1' });
|
|
48
|
-
(0, vitest_1.expect)(evaluated.ok).toBe(true);
|
|
49
|
-
if (evaluated.ok)
|
|
50
|
-
(0, vitest_1.expect)(evaluated.data).toMatchObject({ untrusted: true, value: 'evaluated' });
|
|
51
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'a', 'release')).ok).toBe(true);
|
|
52
|
-
(0, vitest_1.expect)(backend.calls).toContain('goto:about:blank');
|
|
53
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'b', 'claim')).ok).toBe(true); // freed for the next claimant
|
|
54
|
-
const status = (0, protocol_js_1.readJson)((0, protocol_js_1.statusPath)((0, node_path_1.join)(dir, 'ipc')));
|
|
55
|
-
(0, vitest_1.expect)(status?.state).toBe('connected');
|
|
56
|
-
(0, vitest_1.expect)(status?.pid).toBe(process.pid);
|
|
57
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'b', 'quit')).ok).toBe(true);
|
|
58
|
-
await run;
|
|
59
|
-
(0, vitest_1.expect)(backend.calls).toContain('disconnect');
|
|
60
|
-
const litter = (0, node_fs_1.readdirSync)((0, node_path_1.join)(dir, 'ipc')).filter((n) => n.startsWith('cmd-') || n.startsWith('resp-'));
|
|
61
|
-
(0, vitest_1.expect)(litter).toEqual([]);
|
|
62
|
-
(0, vitest_1.expect)((0, node_fs_1.existsSync)((0, node_path_1.join)(dir, 'daemon.pid'))).toBe(false);
|
|
63
|
-
const finalStatus = (0, protocol_js_1.readJson)((0, protocol_js_1.statusPath)((0, node_path_1.join)(dir, 'ipc')));
|
|
64
|
-
(0, vitest_1.expect)(finalStatus?.state).toBe('stopped');
|
|
65
|
-
}, 60000);
|
|
66
|
-
(0, vitest_1.it)('expired claim ttl auto-releases and parks the tab; daemon stays up', async () => {
|
|
67
|
-
const { dir, backend, run } = (0, harness_js_1.daemonUnderTest)({ claimTtlMs: 100 });
|
|
68
|
-
cleanups.push(() => (0, node_fs_1.rmSync)(dir, { recursive: true, force: true }));
|
|
69
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'a', 'claim', { ttlMs: 100 })).ok).toBe(true);
|
|
70
|
-
await new Promise((r) => setTimeout(r, 400)); // ttl passes without activity
|
|
71
|
-
const denied = await (0, harness_js_1.op)(dir, 'a', 'goto', { url: 'https://example.com/' });
|
|
72
|
-
(0, vitest_1.expect)(denied.ok).toBe(false);
|
|
73
|
-
if (!denied.ok)
|
|
74
|
-
(0, vitest_1.expect)(denied.error.code).toBe('NOT_CLAIMANT');
|
|
75
|
-
(0, vitest_1.expect)(backend.calls).toContain('goto:about:blank'); // parked
|
|
76
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'a', 'claim')).ok).toBe(true); // reclaim works after expiry
|
|
77
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'a', 'quit')).ok).toBe(true);
|
|
78
|
-
await run;
|
|
79
|
-
}, 60000);
|
|
80
|
-
(0, vitest_1.it)('second daemon on the same pidfile refuses with DAEMON_RUNNING', async () => {
|
|
81
|
-
const { dir, run } = (0, harness_js_1.daemonUnderTest)();
|
|
82
|
-
cleanups.push(() => (0, node_fs_1.rmSync)(dir, { recursive: true, force: true }));
|
|
83
|
-
await (0, harness_js_1.op)(dir, 'a', 'ping'); // daemon is up and looping
|
|
84
|
-
const backend2 = (0, harness_js_1.fakeBackend)();
|
|
85
|
-
const controller2 = new AttachController_js_1.AttachController({
|
|
86
|
-
backend: backend2,
|
|
87
|
-
leaseFile: (0, node_path_1.join)(dir, 'lease2'),
|
|
88
|
-
expectedIdentity: 'user@gmail.com',
|
|
89
|
-
});
|
|
90
|
-
const dup = new daemon_js_1.AttachDaemon({
|
|
91
|
-
controller: controller2,
|
|
92
|
-
backend: backend2,
|
|
93
|
-
ipcDir: (0, node_path_1.join)(dir, 'ipc'),
|
|
94
|
-
pidFile: (0, node_path_1.join)(dir, 'daemon.pid'),
|
|
95
|
-
pollMs: 25,
|
|
96
|
-
});
|
|
97
|
-
await (0, vitest_1.expect)(dup.run()).rejects.toMatchObject({ code: 'DAEMON_RUNNING' });
|
|
98
|
-
(0, vitest_1.expect)((await (0, harness_js_1.op)(dir, 'a', 'quit')).ok).toBe(true);
|
|
99
|
-
await run;
|
|
100
|
-
}, 60000);
|
|
101
|
-
});
|
|
102
|
-
//# sourceMappingURL=daemon-loop.integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-loop.integration.test.js","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/daemon-loop.integration.test.ts"],"names":[],"mappings":";;AAAA,mCAAyD;AACzD,qCAA0D;AAC1D,yCAAiC;AACjC,gDAA6E;AAC7E,mEAA6D;AAC7D,4CAA4C;AAC5C,6CAAgE;AAEhE,MAAM,QAAQ,GAAsB,EAAE,CAAC;AACvC,IAAA,kBAAS,EAAC,GAAG,EAAE;IACb,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAA,4BAAe,GAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnE,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,OAAO,CAAC,EAAE;YAAE,IAAA,eAAM,EAAE,OAAO,CAAC,IAA8B,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAErG,MAAM,IAAI,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3D,MAAM,GAAG,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACnF,IAAA,eAAM,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAChF,IAAA,eAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEnE,MAAM,IAAI,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAErF,MAAM,SAAS,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7E,IAAA,eAAM,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,SAAS,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,MAAM,SAAS,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,IAAA,eAAM,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,SAAS,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAEhG,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,8BAA8B;QAEnF,MAAM,MAAM,GAAG,IAAA,sBAAQ,EAAmB,IAAA,wBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,IAAA,eAAM,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,GAAG,CAAC;QACV,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1G,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,IAAA,sBAAQ,EAAmB,IAAA,wBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAA,eAAM,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,EAAE,KAAM,CAAC,CAAC;IAEX,IAAA,WAAE,EAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAA,4BAAe,EAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnE,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B;QAE5E,MAAM,MAAM,GAAG,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QAE9D,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B;QAClF,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC,EAAE,KAAM,CAAC,CAAC;IAEX,IAAA,WAAE,EAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAA,4BAAe,GAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,gBAAM,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,2BAA2B;QAEvD,MAAM,QAAQ,GAAG,IAAA,wBAAW,GAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,sCAAgB,CAAC;YACvC,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,IAAA,gBAAI,EAAC,GAAG,EAAE,QAAQ,CAAC;YAC9B,gBAAgB,EAAE,gBAAgB;SACnC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,wBAAY,CAAC;YAC3B,UAAU,EAAE,WAAW;YACvB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,IAAA,gBAAI,EAAC,GAAG,EAAE,KAAK,CAAC;YACxB,OAAO,EAAE,IAAA,gBAAI,EAAC,GAAG,EAAE,YAAY,CAAC;YAChC,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,MAAM,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAE1E,IAAA,eAAM,EAAC,CAAC,MAAM,IAAA,eAAE,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC,EAAE,KAAM,CAAC,CAAC;AACb,CAAC,CAAC,CAAC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { AttachController } from '../../AttachController.js';
|
|
2
|
-
import { AttachDaemon } from '../daemon.js';
|
|
3
|
-
import { type AttachResp, type AttachOp } from '../protocol.js';
|
|
4
|
-
/** Recording fake backend satisfying AttachBackend + evalInTab. */
|
|
5
|
-
export declare function fakeBackend(): {
|
|
6
|
-
calls: string[];
|
|
7
|
-
kind: "cdp";
|
|
8
|
-
onUnexpectedClose: ((err: Error) => void) | null;
|
|
9
|
-
connect(): Promise<void>;
|
|
10
|
-
disconnectTransport(): Promise<void>;
|
|
11
|
-
claimAgentTab(): Promise<string>;
|
|
12
|
-
probeIdentity(): Promise<string>;
|
|
13
|
-
gotoTab(_t: string, url: string): Promise<string>;
|
|
14
|
-
readTab(): Promise<string>;
|
|
15
|
-
evalInTab(_t: string, expression: string): Promise<"evaluated" | {
|
|
16
|
-
extracted: boolean;
|
|
17
|
-
}>;
|
|
18
|
-
};
|
|
19
|
-
/** An in-process daemon over a fresh temp dir; caller owns cleanup + `await run`. */
|
|
20
|
-
export declare function daemonUnderTest(opts?: {
|
|
21
|
-
claimTtlMs?: number;
|
|
22
|
-
}): {
|
|
23
|
-
dir: string;
|
|
24
|
-
backend: {
|
|
25
|
-
calls: string[];
|
|
26
|
-
kind: "cdp";
|
|
27
|
-
onUnexpectedClose: ((err: Error) => void) | null;
|
|
28
|
-
connect(): Promise<void>;
|
|
29
|
-
disconnectTransport(): Promise<void>;
|
|
30
|
-
claimAgentTab(): Promise<string>;
|
|
31
|
-
probeIdentity(): Promise<string>;
|
|
32
|
-
gotoTab(_t: string, url: string): Promise<string>;
|
|
33
|
-
readTab(): Promise<string>;
|
|
34
|
-
evalInTab(_t: string, expression: string): Promise<"evaluated" | {
|
|
35
|
-
extracted: boolean;
|
|
36
|
-
}>;
|
|
37
|
-
};
|
|
38
|
-
controller: AttachController;
|
|
39
|
-
daemon: AttachDaemon;
|
|
40
|
-
run: Promise<void>;
|
|
41
|
-
};
|
|
42
|
-
/** Raw file-level op driver; deletes the response after reading (client contract). */
|
|
43
|
-
export declare function op(dir: string, client: string, opName: AttachOp, args?: Record<string, unknown>): Promise<AttachResp>;
|
|
44
|
-
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/harness.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAA0D,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAExH,mEAAmE;AACnE,wBAAgB,WAAW;;;uBAKI,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI;;;;;gBAetC,MAAM,OAAO,MAAM;;kBAQjB,MAAM,cAAc,MAAM;;;EAQjD;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;2BAlCnC,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI;;;;;oBAetC,MAAM,OAAO,MAAM;;sBAQjB,MAAM,cAAc,MAAM;;;;;;;EA6BjD;AAED,sFAAsF;AACtF,wBAAsB,EAAE,CACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC,CAiBrB"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fakeBackend = fakeBackend;
|
|
4
|
-
exports.daemonUnderTest = daemonUnderTest;
|
|
5
|
-
exports.op = op;
|
|
6
|
-
/**
|
|
7
|
-
* @fileoverview Shared test harness for daemon-lane suites: a recording fake
|
|
8
|
-
* backend, an in-process daemon over real queue files, and a raw file-level op
|
|
9
|
-
* driver mirroring the client contract (responses are deleted after reading).
|
|
10
|
-
*/
|
|
11
|
-
const node_fs_1 = require("node:fs");
|
|
12
|
-
const node_fs_2 = require("node:fs");
|
|
13
|
-
const node_os_1 = require("node:os");
|
|
14
|
-
const node_path_1 = require("node:path");
|
|
15
|
-
const AttachController_js_1 = require("../../AttachController.js");
|
|
16
|
-
const daemon_js_1 = require("../daemon.js");
|
|
17
|
-
const protocol_js_1 = require("../protocol.js");
|
|
18
|
-
/** Recording fake backend satisfying AttachBackend + evalInTab. */
|
|
19
|
-
function fakeBackend() {
|
|
20
|
-
const calls = [];
|
|
21
|
-
const backend = {
|
|
22
|
-
calls,
|
|
23
|
-
kind: 'cdp',
|
|
24
|
-
onUnexpectedClose: null,
|
|
25
|
-
async connect() {
|
|
26
|
-
calls.push('connect');
|
|
27
|
-
},
|
|
28
|
-
async disconnectTransport() {
|
|
29
|
-
calls.push('disconnect');
|
|
30
|
-
},
|
|
31
|
-
async claimAgentTab() {
|
|
32
|
-
calls.push('claim');
|
|
33
|
-
return 'tab-1';
|
|
34
|
-
},
|
|
35
|
-
async probeIdentity() {
|
|
36
|
-
calls.push('probe');
|
|
37
|
-
return 'Inbox - user@gmail.com - Gmail';
|
|
38
|
-
},
|
|
39
|
-
async gotoTab(_t, url) {
|
|
40
|
-
calls.push(`goto:${url}`);
|
|
41
|
-
return url;
|
|
42
|
-
},
|
|
43
|
-
async readTab() {
|
|
44
|
-
calls.push('read');
|
|
45
|
-
return 'PAGE TEXT';
|
|
46
|
-
},
|
|
47
|
-
async evalInTab(_t, expression) {
|
|
48
|
-
calls.push('eval');
|
|
49
|
-
return expression.includes('querySelectorAll') || expression.includes('location.href')
|
|
50
|
-
? { extracted: true }
|
|
51
|
-
: 'evaluated';
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
return backend;
|
|
55
|
-
}
|
|
56
|
-
/** An in-process daemon over a fresh temp dir; caller owns cleanup + `await run`. */
|
|
57
|
-
function daemonUnderTest(opts = {}) {
|
|
58
|
-
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'attach-daemon-'));
|
|
59
|
-
const backend = fakeBackend();
|
|
60
|
-
const controller = new AttachController_js_1.AttachController({
|
|
61
|
-
backend,
|
|
62
|
-
leaseFile: (0, node_path_1.join)(dir, 'lease'),
|
|
63
|
-
expectedIdentity: 'user@gmail.com',
|
|
64
|
-
});
|
|
65
|
-
const daemon = new daemon_js_1.AttachDaemon({
|
|
66
|
-
controller,
|
|
67
|
-
backend,
|
|
68
|
-
ipcDir: (0, node_path_1.join)(dir, 'ipc'),
|
|
69
|
-
pidFile: (0, node_path_1.join)(dir, 'daemon.pid'),
|
|
70
|
-
pollMs: 25,
|
|
71
|
-
claimTtlMs: opts.claimTtlMs ?? 60000,
|
|
72
|
-
});
|
|
73
|
-
const run = daemon.run();
|
|
74
|
-
return { dir, backend, controller, daemon, run };
|
|
75
|
-
}
|
|
76
|
-
/** Raw file-level op driver; deletes the response after reading (client contract). */
|
|
77
|
-
async function op(dir, client, opName, args) {
|
|
78
|
-
const ipc = (0, node_path_1.join)(dir, 'ipc');
|
|
79
|
-
const id = (0, protocol_js_1.newCmdId)(client);
|
|
80
|
-
(0, protocol_js_1.writeAtomicJson)((0, protocol_js_1.cmdPath)(ipc, id), { id, client, op: opName, args });
|
|
81
|
-
for (let i = 0; i < 400; i++) {
|
|
82
|
-
await new Promise((r) => setTimeout(r, 25));
|
|
83
|
-
const resp = (0, protocol_js_1.readJson)((0, protocol_js_1.respPath)(ipc, id));
|
|
84
|
-
if (resp) {
|
|
85
|
-
try {
|
|
86
|
-
(0, node_fs_2.unlinkSync)((0, protocol_js_1.respPath)(ipc, id));
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
/* raced */
|
|
90
|
-
}
|
|
91
|
-
return resp;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
throw new Error(`no response to ${opName}`);
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=harness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../../../../src/attach/daemon/__tests__/protocol.test.ts"],"names":[],"mappings":""}
|