@lhremote/core 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/cdp/client.d.ts +100 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.integration.test.d.ts +2 -0
- package/dist/cdp/client.integration.test.d.ts.map +1 -0
- package/dist/cdp/client.integration.test.js +70 -0
- package/dist/cdp/client.integration.test.js.map +1 -0
- package/dist/cdp/client.js +286 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/client.test.d.ts +2 -0
- package/dist/cdp/client.test.d.ts.map +1 -0
- package/dist/cdp/client.test.js +269 -0
- package/dist/cdp/client.test.js.map +1 -0
- package/dist/cdp/discovery.d.ts +14 -0
- package/dist/cdp/discovery.d.ts.map +1 -0
- package/dist/cdp/discovery.integration.test.d.ts +2 -0
- package/dist/cdp/discovery.integration.test.d.ts.map +1 -0
- package/dist/cdp/discovery.integration.test.js +25 -0
- package/dist/cdp/discovery.integration.test.js.map +1 -0
- package/dist/cdp/discovery.js +31 -0
- package/dist/cdp/discovery.js.map +1 -0
- package/dist/cdp/discovery.test.d.ts +2 -0
- package/dist/cdp/discovery.test.d.ts.map +1 -0
- package/dist/cdp/discovery.test.js +54 -0
- package/dist/cdp/discovery.test.js.map +1 -0
- package/dist/cdp/errors.d.ts +28 -0
- package/dist/cdp/errors.d.ts.map +1 -0
- package/dist/cdp/errors.js +40 -0
- package/dist/cdp/errors.js.map +1 -0
- package/dist/cdp/errors.test.d.ts +2 -0
- package/dist/cdp/errors.test.d.ts.map +1 -0
- package/dist/cdp/errors.test.js +35 -0
- package/dist/cdp/errors.test.js.map +1 -0
- package/dist/cdp/index.d.ts +5 -0
- package/dist/cdp/index.d.ts.map +1 -0
- package/dist/cdp/index.js +5 -0
- package/dist/cdp/index.js.map +1 -0
- package/dist/cdp/instance-discovery.d.ts +30 -0
- package/dist/cdp/instance-discovery.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.integration.test.d.ts +2 -0
- package/dist/cdp/instance-discovery.integration.test.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.integration.test.js +34 -0
- package/dist/cdp/instance-discovery.integration.test.js.map +1 -0
- package/dist/cdp/instance-discovery.js +130 -0
- package/dist/cdp/instance-discovery.js.map +1 -0
- package/dist/cdp/instance-discovery.test.d.ts +2 -0
- package/dist/cdp/instance-discovery.test.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.test.js +110 -0
- package/dist/cdp/instance-discovery.test.js.map +1 -0
- package/dist/cdp/testing/launch-chromium.d.ts +24 -0
- package/dist/cdp/testing/launch-chromium.d.ts.map +1 -0
- package/dist/cdp/testing/launch-chromium.js +90 -0
- package/dist/cdp/testing/launch-chromium.js.map +1 -0
- package/dist/db/client.d.ts +13 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.integration.test.d.ts +2 -0
- package/dist/db/client.integration.test.d.ts.map +1 -0
- package/dist/db/client.integration.test.js +59 -0
- package/dist/db/client.integration.test.js.map +1 -0
- package/dist/db/client.js +17 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/client.test.d.ts +2 -0
- package/dist/db/client.test.d.ts.map +1 -0
- package/dist/db/client.test.js +46 -0
- package/dist/db/client.test.js.map +1 -0
- package/dist/db/discovery.d.ts +14 -0
- package/dist/db/discovery.d.ts.map +1 -0
- package/dist/db/discovery.integration.test.d.ts +2 -0
- package/dist/db/discovery.integration.test.d.ts.map +1 -0
- package/dist/db/discovery.integration.test.js +99 -0
- package/dist/db/discovery.integration.test.js.map +1 -0
- package/dist/db/discovery.js +74 -0
- package/dist/db/discovery.js.map +1 -0
- package/dist/db/discovery.test.d.ts +2 -0
- package/dist/db/discovery.test.d.ts.map +1 -0
- package/dist/db/discovery.test.js +123 -0
- package/dist/db/discovery.test.js.map +1 -0
- package/dist/db/errors.d.ts +21 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +33 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/errors.test.d.ts +2 -0
- package/dist/db/errors.test.d.ts.map +1 -0
- package/dist/db/errors.test.js +32 -0
- package/dist/db/errors.test.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +2 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/profile.d.ts +32 -0
- package/dist/db/repositories/profile.d.ts.map +1 -0
- package/dist/db/repositories/profile.integration.test.d.ts +2 -0
- package/dist/db/repositories/profile.integration.test.d.ts.map +1 -0
- package/dist/db/repositories/profile.integration.test.js +119 -0
- package/dist/db/repositories/profile.integration.test.js.map +1 -0
- package/dist/db/repositories/profile.js +126 -0
- package/dist/db/repositories/profile.js.map +1 -0
- package/dist/db/repositories/profile.test.d.ts +2 -0
- package/dist/db/repositories/profile.test.d.ts.map +1 -0
- package/dist/db/repositories/profile.test.js +126 -0
- package/dist/db/repositories/profile.test.js.map +1 -0
- package/dist/db/testing/create-fixture.d.ts +8 -0
- package/dist/db/testing/create-fixture.d.ts.map +1 -0
- package/dist/db/testing/create-fixture.js +286 -0
- package/dist/db/testing/create-fixture.js.map +1 -0
- package/dist/db/testing/open-fixture.d.ts +14 -0
- package/dist/db/testing/open-fixture.d.ts.map +1 -0
- package/dist/db/testing/open-fixture.js +21 -0
- package/dist/db/testing/open-fixture.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/services/app.d.ts +62 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +198 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/app.test.d.ts +2 -0
- package/dist/services/app.test.d.ts.map +1 -0
- package/dist/services/app.test.js +265 -0
- package/dist/services/app.test.js.map +1 -0
- package/dist/services/errors.d.ts +45 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +66 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/errors.test.d.ts +2 -0
- package/dist/services/errors.test.d.ts.map +1 -0
- package/dist/services/errors.test.js +71 -0
- package/dist/services/errors.test.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/instance-lifecycle.d.ts +38 -0
- package/dist/services/instance-lifecycle.d.ts.map +1 -0
- package/dist/services/instance-lifecycle.js +87 -0
- package/dist/services/instance-lifecycle.js.map +1 -0
- package/dist/services/instance-lifecycle.test.d.ts +2 -0
- package/dist/services/instance-lifecycle.test.d.ts.map +1 -0
- package/dist/services/instance-lifecycle.test.js +152 -0
- package/dist/services/instance-lifecycle.test.js.map +1 -0
- package/dist/services/instance.d.ts +50 -0
- package/dist/services/instance.d.ts.map +1 -0
- package/dist/services/instance.js +121 -0
- package/dist/services/instance.js.map +1 -0
- package/dist/services/instance.test.d.ts +2 -0
- package/dist/services/instance.test.d.ts.map +1 -0
- package/dist/services/instance.test.js +181 -0
- package/dist/services/instance.test.js.map +1 -0
- package/dist/services/launcher.d.ts +51 -0
- package/dist/services/launcher.d.ts.map +1 -0
- package/dist/services/launcher.js +147 -0
- package/dist/services/launcher.js.map +1 -0
- package/dist/services/launcher.test.d.ts +2 -0
- package/dist/services/launcher.test.d.ts.map +1 -0
- package/dist/services/launcher.test.js +126 -0
- package/dist/services/launcher.test.js.map +1 -0
- package/dist/services/profile.d.ts +44 -0
- package/dist/services/profile.d.ts.map +1 -0
- package/dist/services/profile.js +83 -0
- package/dist/services/profile.js.map +1 -0
- package/dist/services/profile.test.d.ts +2 -0
- package/dist/services/profile.test.d.ts.map +1 -0
- package/dist/services/profile.test.js +145 -0
- package/dist/services/profile.test.js.map +1 -0
- package/dist/services/status.d.ts +33 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +76 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/status.test.d.ts +2 -0
- package/dist/services/status.test.d.ts.map +1 -0
- package/dist/services/status.test.js +207 -0
- package/dist/services/status.test.js.map +1 -0
- package/dist/testing/e2e-helpers.d.ts +41 -0
- package/dist/testing/e2e-helpers.d.ts.map +1 -0
- package/dist/testing/e2e-helpers.js +111 -0
- package/dist/testing/e2e-helpers.js.map +1 -0
- package/dist/types/account.d.ts +13 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +2 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/account.test.d.ts +2 -0
- package/dist/types/account.test.d.ts.map +1 -0
- package/dist/types/account.test.js +24 -0
- package/dist/types/account.test.js.map +1 -0
- package/dist/types/cdp.d.ts +18 -0
- package/dist/types/cdp.d.ts.map +1 -0
- package/dist/types/cdp.js +2 -0
- package/dist/types/cdp.js.map +1 -0
- package/dist/types/cdp.test.d.ts +2 -0
- package/dist/types/cdp.test.d.ts.map +1 -0
- package/dist/types/cdp.test.js +28 -0
- package/dist/types/cdp.test.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/instance.d.ts +36 -0
- package/dist/types/instance.d.ts.map +1 -0
- package/dist/types/instance.js +8 -0
- package/dist/types/instance.js.map +1 -0
- package/dist/types/instance.test.d.ts +2 -0
- package/dist/types/instance.test.d.ts.map +1 -0
- package/dist/types/instance.test.js +57 -0
- package/dist/types/instance.test.js.map +1 -0
- package/dist/types/profile.d.ts +50 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +8 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/profile.test.d.ts +2 -0
- package/dist/types/profile.test.d.ts.map +1 -0
- package/dist/types/profile.test.js +103 -0
- package/dist/types/profile.test.js.map +1 -0
- package/package.json +20 -8
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { CDPConnectionError, CDPEvaluationError, CDPTimeoutError, } from "./errors.js";
|
|
3
|
+
import { CDPClient } from "./client.js";
|
|
4
|
+
// Mock discovery so CDPClient.connect() resolves a WebSocket URL
|
|
5
|
+
// without actually hitting a real HTTP endpoint.
|
|
6
|
+
vi.mock("./discovery.js", () => ({
|
|
7
|
+
discoverTargets: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
import { discoverTargets } from "./discovery.js";
|
|
10
|
+
/**
|
|
11
|
+
* Minimal mock that simulates the browser-standard WebSocket API
|
|
12
|
+
* used by Node 22's global WebSocket.
|
|
13
|
+
*/
|
|
14
|
+
class MockWebSocket {
|
|
15
|
+
static instances = [];
|
|
16
|
+
eventHandlers = new Map();
|
|
17
|
+
url;
|
|
18
|
+
readyState = 0; // CONNECTING
|
|
19
|
+
constructor(url) {
|
|
20
|
+
this.url = typeof url === "string" ? url : url.toString();
|
|
21
|
+
MockWebSocket.instances.push(this);
|
|
22
|
+
// Simulate async open
|
|
23
|
+
queueMicrotask(() => {
|
|
24
|
+
this.readyState = 1; // OPEN
|
|
25
|
+
this.emit("open", {});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
addEventListener(event, handler) {
|
|
29
|
+
let set = this.eventHandlers.get(event);
|
|
30
|
+
if (!set) {
|
|
31
|
+
set = new Set();
|
|
32
|
+
this.eventHandlers.set(event, set);
|
|
33
|
+
}
|
|
34
|
+
set.add(handler);
|
|
35
|
+
}
|
|
36
|
+
send = () => {
|
|
37
|
+
// default no-op, overridden by tests
|
|
38
|
+
};
|
|
39
|
+
close() {
|
|
40
|
+
this.readyState = 3; // CLOSED
|
|
41
|
+
}
|
|
42
|
+
// Test helpers
|
|
43
|
+
emit(event, data) {
|
|
44
|
+
const set = this.eventHandlers.get(event);
|
|
45
|
+
if (set) {
|
|
46
|
+
for (const handler of set) {
|
|
47
|
+
handler(data);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Simulate receiving a CDP message from the server. */
|
|
52
|
+
receiveMessage(obj) {
|
|
53
|
+
this.emit("message", { data: JSON.stringify(obj) });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Replace the global WebSocket with our mock
|
|
57
|
+
vi.stubGlobal("WebSocket", MockWebSocket);
|
|
58
|
+
const MOCK_TARGETS = [
|
|
59
|
+
{
|
|
60
|
+
description: "",
|
|
61
|
+
devtoolsFrontendUrl: "",
|
|
62
|
+
id: "PAGE1",
|
|
63
|
+
type: "page",
|
|
64
|
+
title: "Test Page",
|
|
65
|
+
url: "about:blank",
|
|
66
|
+
webSocketDebuggerUrl: "ws://127.0.0.1:9222/devtools/page/PAGE1",
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
function lastMockWs() {
|
|
70
|
+
const ws = MockWebSocket.instances[MockWebSocket.instances.length - 1];
|
|
71
|
+
if (!ws) {
|
|
72
|
+
throw new Error("No MockWebSocket instance created");
|
|
73
|
+
}
|
|
74
|
+
return ws;
|
|
75
|
+
}
|
|
76
|
+
describe("CDPClient", () => {
|
|
77
|
+
let client;
|
|
78
|
+
beforeEach(() => {
|
|
79
|
+
MockWebSocket.instances = [];
|
|
80
|
+
vi.mocked(discoverTargets).mockResolvedValue(MOCK_TARGETS);
|
|
81
|
+
client = new CDPClient(9222, { timeout: 500 });
|
|
82
|
+
});
|
|
83
|
+
afterEach(() => {
|
|
84
|
+
client.disconnect();
|
|
85
|
+
vi.restoreAllMocks();
|
|
86
|
+
});
|
|
87
|
+
describe("connect", () => {
|
|
88
|
+
it("should connect to the first page target by default", async () => {
|
|
89
|
+
await client.connect();
|
|
90
|
+
expect(client.isConnected).toBe(true);
|
|
91
|
+
expect(discoverTargets).toHaveBeenCalledWith(9222, "127.0.0.1");
|
|
92
|
+
expect(MockWebSocket.instances).toHaveLength(1);
|
|
93
|
+
expect(lastMockWs().url).toBe("ws://127.0.0.1:9222/devtools/page/PAGE1");
|
|
94
|
+
});
|
|
95
|
+
it("should connect to a specific target by ID", async () => {
|
|
96
|
+
await client.connect("PAGE1");
|
|
97
|
+
expect(client.isConnected).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it("should throw when target ID not found", async () => {
|
|
100
|
+
await expect(client.connect("NONEXISTENT")).rejects.toThrow(CDPConnectionError);
|
|
101
|
+
});
|
|
102
|
+
it("should throw when target has no webSocketDebuggerUrl", async () => {
|
|
103
|
+
vi.mocked(discoverTargets).mockResolvedValue([
|
|
104
|
+
{
|
|
105
|
+
description: "",
|
|
106
|
+
devtoolsFrontendUrl: "",
|
|
107
|
+
id: "NOURL",
|
|
108
|
+
type: "page",
|
|
109
|
+
title: "No WS",
|
|
110
|
+
url: "about:blank",
|
|
111
|
+
},
|
|
112
|
+
]);
|
|
113
|
+
await expect(client.connect()).rejects.toThrow(/webSocketDebuggerUrl/);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("send", () => {
|
|
117
|
+
it("should throw when not connected", async () => {
|
|
118
|
+
await expect(client.send("Runtime.evaluate")).rejects.toThrow(CDPConnectionError);
|
|
119
|
+
});
|
|
120
|
+
it("should correlate request and response by message ID", async () => {
|
|
121
|
+
await client.connect();
|
|
122
|
+
const ws = lastMockWs();
|
|
123
|
+
let sentMessage;
|
|
124
|
+
ws.send = (data) => {
|
|
125
|
+
sentMessage = data;
|
|
126
|
+
};
|
|
127
|
+
const resultPromise = client.send("Runtime.evaluate", {
|
|
128
|
+
expression: "1+1",
|
|
129
|
+
});
|
|
130
|
+
// Wait for send to be called
|
|
131
|
+
await vi.waitFor(() => expect(sentMessage).toBeDefined());
|
|
132
|
+
const parsed = JSON.parse(sentMessage);
|
|
133
|
+
expect(parsed.method).toBe("Runtime.evaluate");
|
|
134
|
+
// Simulate response
|
|
135
|
+
ws.receiveMessage({
|
|
136
|
+
id: parsed.id,
|
|
137
|
+
result: { result: { type: "number", value: 2 } },
|
|
138
|
+
});
|
|
139
|
+
const result = await resultPromise;
|
|
140
|
+
expect(result).toEqual({ result: { type: "number", value: 2 } });
|
|
141
|
+
});
|
|
142
|
+
it("should reject on CDP error response", async () => {
|
|
143
|
+
await client.connect();
|
|
144
|
+
const ws = lastMockWs();
|
|
145
|
+
let sentId;
|
|
146
|
+
ws.send = (data) => {
|
|
147
|
+
sentId = JSON.parse(data).id;
|
|
148
|
+
};
|
|
149
|
+
const resultPromise = client.send("BadMethod");
|
|
150
|
+
await vi.waitFor(() => expect(sentId).toBeDefined());
|
|
151
|
+
ws.receiveMessage({
|
|
152
|
+
id: sentId,
|
|
153
|
+
error: { message: "Method not found" },
|
|
154
|
+
});
|
|
155
|
+
await expect(resultPromise).rejects.toThrow(CDPEvaluationError);
|
|
156
|
+
await expect(resultPromise).rejects.toThrow(/Method not found/);
|
|
157
|
+
});
|
|
158
|
+
it("should reject on timeout", async () => {
|
|
159
|
+
await client.connect();
|
|
160
|
+
const ws = lastMockWs();
|
|
161
|
+
ws.send = () => {
|
|
162
|
+
/* swallow, never respond */
|
|
163
|
+
};
|
|
164
|
+
await expect(client.send("Slow.method")).rejects.toThrow(CDPTimeoutError);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe("evaluate", () => {
|
|
168
|
+
it("should return evaluated value", async () => {
|
|
169
|
+
await client.connect();
|
|
170
|
+
const ws = lastMockWs();
|
|
171
|
+
ws.send = (data) => {
|
|
172
|
+
const msg = JSON.parse(data);
|
|
173
|
+
queueMicrotask(() => {
|
|
174
|
+
ws.receiveMessage({
|
|
175
|
+
id: msg.id,
|
|
176
|
+
result: { result: { type: "number", value: 42 } },
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const result = await client.evaluate("21 * 2");
|
|
181
|
+
expect(result).toBe(42);
|
|
182
|
+
});
|
|
183
|
+
it("should throw CDPEvaluationError on exception", async () => {
|
|
184
|
+
await client.connect();
|
|
185
|
+
const ws = lastMockWs();
|
|
186
|
+
ws.send = (data) => {
|
|
187
|
+
const msg = JSON.parse(data);
|
|
188
|
+
queueMicrotask(() => {
|
|
189
|
+
ws.receiveMessage({
|
|
190
|
+
id: msg.id,
|
|
191
|
+
result: {
|
|
192
|
+
exceptionDetails: {
|
|
193
|
+
exception: { description: "ReferenceError: x is not defined" },
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
await expect(client.evaluate("x")).rejects.toThrow(CDPEvaluationError);
|
|
200
|
+
await expect(client.evaluate("x")).rejects.toThrow(/ReferenceError/);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe("events", () => {
|
|
204
|
+
it("should dispatch CDP events to listeners", async () => {
|
|
205
|
+
await client.connect();
|
|
206
|
+
const ws = lastMockWs();
|
|
207
|
+
const received = [];
|
|
208
|
+
client.on("Page.loadEventFired", (params) => {
|
|
209
|
+
received.push(params);
|
|
210
|
+
});
|
|
211
|
+
ws.receiveMessage({
|
|
212
|
+
method: "Page.loadEventFired",
|
|
213
|
+
params: { timestamp: 12345 },
|
|
214
|
+
});
|
|
215
|
+
expect(received).toHaveLength(1);
|
|
216
|
+
expect(received[0]).toEqual({ timestamp: 12345 });
|
|
217
|
+
});
|
|
218
|
+
it("should remove listeners with off()", async () => {
|
|
219
|
+
await client.connect();
|
|
220
|
+
const ws = lastMockWs();
|
|
221
|
+
const received = [];
|
|
222
|
+
const handler = (params) => {
|
|
223
|
+
received.push(params);
|
|
224
|
+
};
|
|
225
|
+
client.on("Network.requestWillBeSent", handler);
|
|
226
|
+
ws.receiveMessage({
|
|
227
|
+
method: "Network.requestWillBeSent",
|
|
228
|
+
params: { requestId: "1" },
|
|
229
|
+
});
|
|
230
|
+
client.off("Network.requestWillBeSent", handler);
|
|
231
|
+
ws.receiveMessage({
|
|
232
|
+
method: "Network.requestWillBeSent",
|
|
233
|
+
params: { requestId: "2" },
|
|
234
|
+
});
|
|
235
|
+
expect(received).toHaveLength(1);
|
|
236
|
+
});
|
|
237
|
+
it("should resolve waitForEvent on event", async () => {
|
|
238
|
+
await client.connect();
|
|
239
|
+
const ws = lastMockWs();
|
|
240
|
+
const eventPromise = client.waitForEvent("Page.loadEventFired", 1000);
|
|
241
|
+
ws.receiveMessage({
|
|
242
|
+
method: "Page.loadEventFired",
|
|
243
|
+
params: { timestamp: 99 },
|
|
244
|
+
});
|
|
245
|
+
const result = await eventPromise;
|
|
246
|
+
expect(result).toEqual({ timestamp: 99 });
|
|
247
|
+
});
|
|
248
|
+
it("should reject waitForEvent on timeout", async () => {
|
|
249
|
+
await client.connect();
|
|
250
|
+
await expect(client.waitForEvent("Never.happens", 50)).rejects.toThrow(CDPTimeoutError);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe("disconnect", () => {
|
|
254
|
+
it("should reject pending requests on disconnect", async () => {
|
|
255
|
+
await client.connect();
|
|
256
|
+
const ws = lastMockWs();
|
|
257
|
+
ws.send = () => {
|
|
258
|
+
/* swallow */
|
|
259
|
+
};
|
|
260
|
+
const pendingPromise = client.send("Runtime.evaluate", {
|
|
261
|
+
expression: "1",
|
|
262
|
+
});
|
|
263
|
+
client.disconnect();
|
|
264
|
+
await expect(pendingPromise).rejects.toThrow(CDPConnectionError);
|
|
265
|
+
expect(client.isConnected).toBe(false);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/cdp/client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CdpTarget } from "../types/cdp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Discover Chrome DevTools Protocol targets exposed at the given port.
|
|
4
|
+
*
|
|
5
|
+
* Fetches the `/json/list` HTTP endpoint that Chromium-based browsers
|
|
6
|
+
* expose for debugging target enumeration.
|
|
7
|
+
*
|
|
8
|
+
* @param port - CDP debugging port (e.g. 9222 for the launcher process).
|
|
9
|
+
* @param host - Host to connect to (default `127.0.0.1`).
|
|
10
|
+
* @returns Array of discovered CDP targets.
|
|
11
|
+
* @throws {CDPConnectionError} When the endpoint is unreachable.
|
|
12
|
+
*/
|
|
13
|
+
export declare function discoverTargets(port: number, host?: string): Promise<CdpTarget[]>;
|
|
14
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/cdp/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQjD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAqB,GAC1B,OAAO,CAAC,SAAS,EAAE,CAAC,CAoBtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.integration.test.d.ts","sourceRoot":"","sources":["../../src/cdp/discovery.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { discoverTargets } from "./discovery.js";
|
|
3
|
+
import { launchChromium, } from "./testing/launch-chromium.js";
|
|
4
|
+
describe("discoverTargets (integration)", () => {
|
|
5
|
+
let chromium;
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
chromium = await launchChromium();
|
|
8
|
+
}, 30_000);
|
|
9
|
+
afterAll(async () => {
|
|
10
|
+
await chromium.close();
|
|
11
|
+
});
|
|
12
|
+
it("should return targets from a real Chromium instance", async () => {
|
|
13
|
+
const targets = await discoverTargets(chromium.port);
|
|
14
|
+
expect(targets.length).toBeGreaterThan(0);
|
|
15
|
+
});
|
|
16
|
+
it("should return targets with expected shape", async () => {
|
|
17
|
+
const targets = await discoverTargets(chromium.port);
|
|
18
|
+
const page = targets.find((t) => t.type === "page");
|
|
19
|
+
expect(page).toBeDefined();
|
|
20
|
+
expect(page?.id).toEqual(expect.any(String));
|
|
21
|
+
expect(page?.webSocketDebuggerUrl).toEqual(expect.any(String));
|
|
22
|
+
expect(page?.webSocketDebuggerUrl).toMatch(/^ws:\/\//);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=discovery.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.integration.test.js","sourceRoot":"","sources":["../../src/cdp/discovery.integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,cAAc,GAEf,MAAM,8BAA8B,CAAC;AAEtC,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,QAA0B,CAAC;IAE/B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAEpD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CDPConnectionError } from "./errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default host used for CDP target discovery.
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
6
|
+
/**
|
|
7
|
+
* Discover Chrome DevTools Protocol targets exposed at the given port.
|
|
8
|
+
*
|
|
9
|
+
* Fetches the `/json/list` HTTP endpoint that Chromium-based browsers
|
|
10
|
+
* expose for debugging target enumeration.
|
|
11
|
+
*
|
|
12
|
+
* @param port - CDP debugging port (e.g. 9222 for the launcher process).
|
|
13
|
+
* @param host - Host to connect to (default `127.0.0.1`).
|
|
14
|
+
* @returns Array of discovered CDP targets.
|
|
15
|
+
* @throws {CDPConnectionError} When the endpoint is unreachable.
|
|
16
|
+
*/
|
|
17
|
+
export async function discoverTargets(port, host = DEFAULT_HOST) {
|
|
18
|
+
const url = `http://${host}:${port}/json/list`;
|
|
19
|
+
let response;
|
|
20
|
+
try {
|
|
21
|
+
response = await fetch(url);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new CDPConnectionError(`Failed to discover CDP targets at ${url}: LinkedHelper not running or CDP not enabled`, { cause: error });
|
|
25
|
+
}
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new CDPConnectionError(`CDP target discovery returned HTTP ${response.status.toString()} at ${url}`);
|
|
28
|
+
}
|
|
29
|
+
return (await response.json());
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/cdp/discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,YAAY,GAAG,WAAW,CAAC;AAEjC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,OAAe,YAAY;IAE3B,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,IAAI,YAAY,CAAC;IAE/C,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAC1B,qCAAqC,GAAG,+CAA+C,EACvF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,kBAAkB,CAC1B,sCAAsC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,EAAE,CAC7E,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.test.d.ts","sourceRoot":"","sources":["../../src/cdp/discovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { CDPConnectionError } from "./errors.js";
|
|
3
|
+
import { discoverTargets } from "./discovery.js";
|
|
4
|
+
const MOCK_TARGETS = [
|
|
5
|
+
{
|
|
6
|
+
description: "",
|
|
7
|
+
devtoolsFrontendUrl: "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/ABC",
|
|
8
|
+
id: "ABC",
|
|
9
|
+
type: "page",
|
|
10
|
+
title: "LinkedHelper",
|
|
11
|
+
url: "chrome-extension://abc/index.html",
|
|
12
|
+
webSocketDebuggerUrl: "ws://127.0.0.1:9222/devtools/page/ABC",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
description: "",
|
|
16
|
+
devtoolsFrontendUrl: "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/worker/DEF",
|
|
17
|
+
id: "DEF",
|
|
18
|
+
type: "service_worker",
|
|
19
|
+
title: "Service Worker",
|
|
20
|
+
url: "chrome-extension://abc/sw.js",
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
describe("discoverTargets", () => {
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
vi.stubGlobal("fetch", vi.fn());
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
vi.restoreAllMocks();
|
|
29
|
+
});
|
|
30
|
+
it("should return targets from /json/list endpoint", async () => {
|
|
31
|
+
vi.mocked(fetch).mockResolvedValue(new Response(JSON.stringify(MOCK_TARGETS), { status: 200 }));
|
|
32
|
+
const targets = await discoverTargets(9222);
|
|
33
|
+
expect(fetch).toHaveBeenCalledWith("http://127.0.0.1:9222/json/list");
|
|
34
|
+
expect(targets).toHaveLength(2);
|
|
35
|
+
expect(targets[0]?.id).toBe("ABC");
|
|
36
|
+
expect(targets[1]?.type).toBe("service_worker");
|
|
37
|
+
});
|
|
38
|
+
it("should use custom host when provided", async () => {
|
|
39
|
+
vi.mocked(fetch).mockResolvedValue(new Response(JSON.stringify([]), { status: 200 }));
|
|
40
|
+
await discoverTargets(9222, "192.168.1.10");
|
|
41
|
+
expect(fetch).toHaveBeenCalledWith("http://192.168.1.10:9222/json/list");
|
|
42
|
+
});
|
|
43
|
+
it("should throw CDPConnectionError when fetch fails", async () => {
|
|
44
|
+
vi.mocked(fetch).mockRejectedValue(new Error("ECONNREFUSED"));
|
|
45
|
+
await expect(discoverTargets(9222)).rejects.toThrow(CDPConnectionError);
|
|
46
|
+
await expect(discoverTargets(9222)).rejects.toThrow(/LinkedHelper not running/);
|
|
47
|
+
});
|
|
48
|
+
it("should throw CDPConnectionError on non-OK HTTP status", async () => {
|
|
49
|
+
vi.mocked(fetch).mockResolvedValue(new Response("Not Found", { status: 404 }));
|
|
50
|
+
await expect(discoverTargets(9222)).rejects.toThrow(CDPConnectionError);
|
|
51
|
+
await expect(discoverTargets(9222)).rejects.toThrow(/HTTP 404/);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=discovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../src/cdp/discovery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all CDP-related errors.
|
|
3
|
+
*/
|
|
4
|
+
export declare class CDPError extends Error {
|
|
5
|
+
constructor(message: string, options?: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Thrown when a WebSocket connection to a CDP target cannot be established
|
|
9
|
+
* or is unexpectedly lost.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CDPConnectionError extends CDPError {
|
|
12
|
+
constructor(message: string, options?: ErrorOptions);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Thrown when a CDP request does not receive a response within the
|
|
16
|
+
* configured timeout.
|
|
17
|
+
*/
|
|
18
|
+
export declare class CDPTimeoutError extends CDPError {
|
|
19
|
+
constructor(message: string, options?: ErrorOptions);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Thrown when `Runtime.evaluate` (or similar) returns a CDP-level error
|
|
23
|
+
* or an exception from the evaluated expression.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CDPEvaluationError extends CDPError {
|
|
26
|
+
constructor(message: string, options?: ErrorOptions);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/cdp/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all CDP-related errors.
|
|
3
|
+
*/
|
|
4
|
+
export class CDPError extends Error {
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(message, options);
|
|
7
|
+
this.name = "CDPError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Thrown when a WebSocket connection to a CDP target cannot be established
|
|
12
|
+
* or is unexpectedly lost.
|
|
13
|
+
*/
|
|
14
|
+
export class CDPConnectionError extends CDPError {
|
|
15
|
+
constructor(message, options) {
|
|
16
|
+
super(message, options);
|
|
17
|
+
this.name = "CDPConnectionError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Thrown when a CDP request does not receive a response within the
|
|
22
|
+
* configured timeout.
|
|
23
|
+
*/
|
|
24
|
+
export class CDPTimeoutError extends CDPError {
|
|
25
|
+
constructor(message, options) {
|
|
26
|
+
super(message, options);
|
|
27
|
+
this.name = "CDPTimeoutError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Thrown when `Runtime.evaluate` (or similar) returns a CDP-level error
|
|
32
|
+
* or an exception from the evaluated expression.
|
|
33
|
+
*/
|
|
34
|
+
export class CDPEvaluationError extends CDPError {
|
|
35
|
+
constructor(message, options) {
|
|
36
|
+
super(message, options);
|
|
37
|
+
this.name = "CDPEvaluationError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/cdp/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/cdp/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { CDPConnectionError, CDPError, CDPEvaluationError, CDPTimeoutError, } from "./errors.js";
|
|
3
|
+
describe("CDP errors", () => {
|
|
4
|
+
it("should set correct name for CDPError", () => {
|
|
5
|
+
const error = new CDPError("test");
|
|
6
|
+
expect(error.name).toBe("CDPError");
|
|
7
|
+
expect(error.message).toBe("test");
|
|
8
|
+
expect(error).toBeInstanceOf(Error);
|
|
9
|
+
});
|
|
10
|
+
it("should set correct name for CDPConnectionError", () => {
|
|
11
|
+
const error = new CDPConnectionError("connection failed");
|
|
12
|
+
expect(error.name).toBe("CDPConnectionError");
|
|
13
|
+
expect(error.message).toBe("connection failed");
|
|
14
|
+
expect(error).toBeInstanceOf(CDPError);
|
|
15
|
+
expect(error).toBeInstanceOf(Error);
|
|
16
|
+
});
|
|
17
|
+
it("should set correct name for CDPTimeoutError", () => {
|
|
18
|
+
const error = new CDPTimeoutError("timed out");
|
|
19
|
+
expect(error.name).toBe("CDPTimeoutError");
|
|
20
|
+
expect(error.message).toBe("timed out");
|
|
21
|
+
expect(error).toBeInstanceOf(CDPError);
|
|
22
|
+
});
|
|
23
|
+
it("should set correct name for CDPEvaluationError", () => {
|
|
24
|
+
const error = new CDPEvaluationError("eval failed");
|
|
25
|
+
expect(error.name).toBe("CDPEvaluationError");
|
|
26
|
+
expect(error.message).toBe("eval failed");
|
|
27
|
+
expect(error).toBeInstanceOf(CDPError);
|
|
28
|
+
});
|
|
29
|
+
it("should support cause via ErrorOptions", () => {
|
|
30
|
+
const cause = new TypeError("original");
|
|
31
|
+
const error = new CDPConnectionError("wrapper", { cause });
|
|
32
|
+
expect(error.cause).toBe(cause);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/cdp/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CDPClient } from "./client.js";
|
|
2
|
+
export { discoverTargets } from "./discovery.js";
|
|
3
|
+
export { discoverInstancePort, killInstanceProcesses, } from "./instance-discovery.js";
|
|
4
|
+
export { CDPConnectionError, CDPError, CDPEvaluationError, CDPTimeoutError, } from "./errors.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cdp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CDPClient } from "./client.js";
|
|
2
|
+
export { discoverTargets } from "./discovery.js";
|
|
3
|
+
export { discoverInstancePort, killInstanceProcesses, } from "./instance-discovery.js";
|
|
4
|
+
export { CDPConnectionError, CDPError, CDPEvaluationError, CDPTimeoutError, } from "./errors.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cdp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover the dynamic CDP port of a running LinkedHelper instance process.
|
|
3
|
+
*
|
|
4
|
+
* LinkedHelper spawns a separate Electron process for each LinkedIn account.
|
|
5
|
+
* That process listens for CDP connections on a dynamic port that changes
|
|
6
|
+
* every session. This function discovers the port cross-platform using
|
|
7
|
+
* `pid-port` and `ps-list`.
|
|
8
|
+
*
|
|
9
|
+
* The heuristic is:
|
|
10
|
+
* 1. Find the launcher PID by looking for a process listening on `launcherPort`.
|
|
11
|
+
* 2. Find child processes of the launcher.
|
|
12
|
+
* 3. Among those children, find one listening on a TCP port that is NOT the
|
|
13
|
+
* launcher port and that responds to the CDP `/json/list` endpoint.
|
|
14
|
+
*
|
|
15
|
+
* The instance process may listen on multiple ports (e.g. a web content
|
|
16
|
+
* server and a CDP debugging server). We probe each candidate with an
|
|
17
|
+
* HTTP fetch to `/json/list` to ensure we return the actual CDP port.
|
|
18
|
+
*
|
|
19
|
+
* @param launcherPort - The known launcher CDP port (default 9222).
|
|
20
|
+
* @returns The dynamic instance CDP port, or `null` if no running instance was found.
|
|
21
|
+
*/
|
|
22
|
+
export declare function discoverInstancePort(launcherPort?: number): Promise<number | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Find and forcefully kill all instance child processes of the launcher.
|
|
25
|
+
*
|
|
26
|
+
* Use as a last resort when graceful `stopInstance()` fails and
|
|
27
|
+
* the instance process needs to be terminated at the OS level.
|
|
28
|
+
*/
|
|
29
|
+
export declare function killInstanceProcesses(launcherPort: number): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=instance-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-discovery.d.ts","sourceRoot":"","sources":["../../src/cdp/instance-discovery.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AAiED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-discovery.integration.test.d.ts","sourceRoot":"","sources":["../../src/cdp/instance-discovery.integration.test.ts"],"names":[],"mappings":""}
|