@winstonfassett/webdev-gateway 0.1.0-alpha.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/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +78 -0
- package/dist/adapter-helpers.d.ts +64 -0
- package/dist/adapter-helpers.d.ts.map +1 -0
- package/dist/adapter-helpers.js +297 -0
- package/dist/adapter-helpers.js.map +1 -0
- package/dist/admin/assets/index-DEDI8OIx.css +2 -0
- package/dist/admin/assets/index-DaI40ww1.js +70 -0
- package/dist/admin/assets/tinykeys.module-CjuTRcEz.js +1 -0
- package/dist/admin/index.html +13 -0
- package/dist/admin-rpc.d.ts +27 -0
- package/dist/admin-rpc.d.ts.map +1 -0
- package/dist/admin-rpc.js +147 -0
- package/dist/admin-rpc.js.map +1 -0
- package/dist/admin.d.ts +10 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +202 -0
- package/dist/admin.js.map +1 -0
- package/dist/auto-register.d.ts +10 -0
- package/dist/auto-register.d.ts.map +1 -0
- package/dist/auto-register.js +145 -0
- package/dist/auto-register.js.map +1 -0
- package/dist/cdp-relay.d.ts +110 -0
- package/dist/cdp-relay.d.ts.map +1 -0
- package/dist/cdp-relay.js +616 -0
- package/dist/cdp-relay.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +95 -0
- package/dist/cli.js.map +1 -0
- package/dist/doctor.d.ts +6 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +149 -0
- package/dist/doctor.js.map +1 -0
- package/dist/element-grab-client.js +305 -0
- package/dist/element-grab.d.ts +15 -0
- package/dist/element-grab.d.ts.map +1 -0
- package/dist/element-grab.js +102 -0
- package/dist/element-grab.js.map +1 -0
- package/dist/gateway.d.ts +5 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +534 -0
- package/dist/gateway.js.map +1 -0
- package/dist/installer.d.ts +48 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +637 -0
- package/dist/installer.js.map +1 -0
- package/dist/libs/element-source.js +35 -0
- package/dist/libs/modern-screenshot.js +14 -0
- package/dist/log-reader.d.ts +30 -0
- package/dist/log-reader.d.ts.map +1 -0
- package/dist/log-reader.js +174 -0
- package/dist/log-reader.js.map +1 -0
- package/dist/mcp-server.d.ts +22 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +115 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools-core.d.ts +30 -0
- package/dist/mcp-tools-core.d.ts.map +1 -0
- package/dist/mcp-tools-core.js +375 -0
- package/dist/mcp-tools-core.js.map +1 -0
- package/dist/mcp-tools-full.d.ts +4 -0
- package/dist/mcp-tools-full.d.ts.map +1 -0
- package/dist/mcp-tools-full.js +141 -0
- package/dist/mcp-tools-full.js.map +1 -0
- package/dist/playwright-commands.d.ts +33 -0
- package/dist/playwright-commands.d.ts.map +1 -0
- package/dist/playwright-commands.js +356 -0
- package/dist/playwright-commands.js.map +1 -0
- package/dist/registry.d.ts +83 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +205 -0
- package/dist/registry.js.map +1 -0
- package/dist/rpc-server.d.ts +54 -0
- package/dist/rpc-server.d.ts.map +1 -0
- package/dist/rpc-server.js +207 -0
- package/dist/rpc-server.js.map +1 -0
- package/dist/session.d.ts +13 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +61 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webdev-client.js +20 -0
- package/dist/writers/base.d.ts +24 -0
- package/dist/writers/base.d.ts.map +1 -0
- package/dist/writers/base.js +98 -0
- package/dist/writers/base.js.map +1 -0
- package/dist/writers/console.d.ts +8 -0
- package/dist/writers/console.d.ts.map +1 -0
- package/dist/writers/console.js +14 -0
- package/dist/writers/console.js.map +1 -0
- package/dist/writers/dev-events.d.ts +28 -0
- package/dist/writers/dev-events.d.ts.map +1 -0
- package/dist/writers/dev-events.js +53 -0
- package/dist/writers/dev-events.js.map +1 -0
- package/dist/writers/errors.d.ts +8 -0
- package/dist/writers/errors.d.ts.map +1 -0
- package/dist/writers/errors.js +14 -0
- package/dist/writers/errors.js.map +1 -0
- package/dist/writers/network.d.ts +9 -0
- package/dist/writers/network.d.ts.map +1 -0
- package/dist/writers/network.js +17 -0
- package/dist/writers/network.js.map +1 -0
- package/dist/writers/server-console.d.ts +8 -0
- package/dist/writers/server-console.d.ts.map +1 -0
- package/dist/writers/server-console.js +14 -0
- package/dist/writers/server-console.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Relay — bridges between Playwright and the Chrome extension.
|
|
3
|
+
*
|
|
4
|
+
* Based on Playwriter's proven relay pattern (github.com/remorses/playwriter).
|
|
5
|
+
* Supports multiple concurrent Playwright/CDP clients, each with session-scoped
|
|
6
|
+
* event routing.
|
|
7
|
+
*
|
|
8
|
+
* Passive/on-demand debugging:
|
|
9
|
+
* Extension detects dev pages and announces them as "available" without attaching
|
|
10
|
+
* the debugger. The relay requests debugging only when an agent needs CDP access
|
|
11
|
+
* (via ensureDebugging()). After a period of inactivity (idle TTL), the relay
|
|
12
|
+
* sends 'releaseDebug' to detach the debugger and stop the browser banner.
|
|
13
|
+
*
|
|
14
|
+
* WebSocket endpoints:
|
|
15
|
+
* /__cdp-extension — extension connects here
|
|
16
|
+
* /devtools/browser/* — Playwright clients connect here via connectOverCDP
|
|
17
|
+
*
|
|
18
|
+
* HTTP endpoints (Playwright discovery):
|
|
19
|
+
* /json/version — browser info with rewritten webSocketDebuggerUrl
|
|
20
|
+
* /json/list — list of attached targets
|
|
21
|
+
*
|
|
22
|
+
* Protocol (extension ↔ relay):
|
|
23
|
+
* EXT→RELAY availability: { method: 'tabAvailable', params: { tabId, url, serverId, projectId } }
|
|
24
|
+
* EXT→RELAY availability: { method: 'tabUnavailable', params: { tabId } }
|
|
25
|
+
* RELAY→EXT control: { method: 'requestDebug', params: { tabId? } }
|
|
26
|
+
* RELAY→EXT control: { method: 'releaseDebug', params: { tabId? } }
|
|
27
|
+
* EXT→RELAY events: { method: 'forwardCDPEvent', params: { sessionId, method, params } }
|
|
28
|
+
* EXT→RELAY responses: { id, result } or { id, error }
|
|
29
|
+
* RELAY→EXT commands: { id, method: 'forwardCDPCommand', params: { sessionId, method, params } }
|
|
30
|
+
*
|
|
31
|
+
* CDP commands handled locally (not forwarded):
|
|
32
|
+
* Browser.getVersion, Browser.setDownloadBehavior, Target.setDiscoverTargets,
|
|
33
|
+
* Target.attachToTarget, Target.getTargetInfo, Target.getTargets
|
|
34
|
+
*
|
|
35
|
+
* CDP commands with special handling:
|
|
36
|
+
* Target.setAutoAttach — forward, then synthesize Target.attachedToTarget for known targets
|
|
37
|
+
* Runtime.enable — forward, then wait for executionContextCreated before responding
|
|
38
|
+
*/
|
|
39
|
+
import { WebSocket, WebSocketServer } from 'ws';
|
|
40
|
+
import { EventEmitter } from 'node:events';
|
|
41
|
+
let nextClientId = 1;
|
|
42
|
+
export class CDPRelay {
|
|
43
|
+
extensionWs = null;
|
|
44
|
+
extensionWss;
|
|
45
|
+
playwrightWss;
|
|
46
|
+
clients = new Map();
|
|
47
|
+
targets = new Map();
|
|
48
|
+
availableTabs = new Map();
|
|
49
|
+
pendingCommands = new Map();
|
|
50
|
+
nextCommandId = 1;
|
|
51
|
+
gatewayPort;
|
|
52
|
+
events = new EventEmitter(); // Internal event bus for Runtime.enable wait pattern
|
|
53
|
+
pwBrowser = null;
|
|
54
|
+
pwConnecting = false;
|
|
55
|
+
// On-demand debugging state
|
|
56
|
+
debuggingActive = false;
|
|
57
|
+
debuggingRequested = false;
|
|
58
|
+
idleTimeoutMs;
|
|
59
|
+
idleTimer = null;
|
|
60
|
+
/** Cached refs from last a11y_snapshot call — maps ref string to element info */
|
|
61
|
+
refCache = null;
|
|
62
|
+
constructor(options) {
|
|
63
|
+
this.gatewayPort = options.gatewayPort;
|
|
64
|
+
this.idleTimeoutMs = options.idleTimeoutMs ?? 5 * 60 * 1000; // 5 minutes default
|
|
65
|
+
this.extensionWss = new WebSocketServer({ noServer: true });
|
|
66
|
+
this.playwrightWss = new WebSocketServer({ noServer: true });
|
|
67
|
+
this.extensionWss.on('connection', (ws) => this.onExtensionConnect(ws));
|
|
68
|
+
this.playwrightWss.on('connection', (ws) => this.onPlaywrightConnect(ws));
|
|
69
|
+
}
|
|
70
|
+
/** Debugging is active and has targets */
|
|
71
|
+
get isAvailable() {
|
|
72
|
+
return this.extensionWs?.readyState === WebSocket.OPEN && this.targets.size > 0;
|
|
73
|
+
}
|
|
74
|
+
/** Extension is connected and has available tabs — debugging can be activated */
|
|
75
|
+
get canActivate() {
|
|
76
|
+
return this.extensionWs?.readyState === WebSocket.OPEN && this.availableTabs.size > 0;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Ensure debugging is active. If not, request it from the extension and wait
|
|
80
|
+
* for targets to appear. Returns true if debugging is active after the call.
|
|
81
|
+
* Resets the idle timer on every call.
|
|
82
|
+
*/
|
|
83
|
+
async ensureDebugging() {
|
|
84
|
+
this.resetIdleTimer();
|
|
85
|
+
if (this.isAvailable)
|
|
86
|
+
return true;
|
|
87
|
+
if (!this.canActivate)
|
|
88
|
+
return false;
|
|
89
|
+
return this.requestDebugging();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Request the extension to start debugging all available tabs.
|
|
93
|
+
* Waits up to 5s for at least one target to appear.
|
|
94
|
+
*/
|
|
95
|
+
async requestDebugging() {
|
|
96
|
+
if (!this.extensionWs || this.extensionWs.readyState !== WebSocket.OPEN)
|
|
97
|
+
return false;
|
|
98
|
+
if (this.debuggingRequested && this.debuggingActive)
|
|
99
|
+
return true;
|
|
100
|
+
console.log('[cdp-relay] Requesting debugging from extension...');
|
|
101
|
+
this.debuggingRequested = true;
|
|
102
|
+
this.extensionWs.send(JSON.stringify({ method: 'requestDebug', params: {} }));
|
|
103
|
+
// Wait for at least one target to appear
|
|
104
|
+
if (this.targets.size > 0) {
|
|
105
|
+
this.debuggingActive = true;
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return new Promise((resolve) => {
|
|
109
|
+
const handler = (event) => {
|
|
110
|
+
if (event.method === 'Target.attachedToTarget') {
|
|
111
|
+
clearTimeout(timer);
|
|
112
|
+
this.events.off('cdp:event', handler);
|
|
113
|
+
this.debuggingActive = true;
|
|
114
|
+
resolve(true);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const timer = setTimeout(() => {
|
|
118
|
+
this.events.off('cdp:event', handler);
|
|
119
|
+
console.log('[cdp-relay] Timed out waiting for debug targets (5s)');
|
|
120
|
+
resolve(false);
|
|
121
|
+
}, 5000);
|
|
122
|
+
this.events.on('cdp:event', handler);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Release debugging — detach debugger from all tabs.
|
|
127
|
+
* The extension will send Target.detachedFromTarget events.
|
|
128
|
+
*/
|
|
129
|
+
releaseDebugging() {
|
|
130
|
+
if (!this.debuggingActive && !this.debuggingRequested)
|
|
131
|
+
return;
|
|
132
|
+
console.log('[cdp-relay] Releasing debugging...');
|
|
133
|
+
this.debuggingActive = false;
|
|
134
|
+
this.debuggingRequested = false;
|
|
135
|
+
this.targets.clear();
|
|
136
|
+
this.clearIdleTimer();
|
|
137
|
+
this.disconnectPlaywright();
|
|
138
|
+
if (this.extensionWs?.readyState === WebSocket.OPEN) {
|
|
139
|
+
this.extensionWs.send(JSON.stringify({ method: 'releaseDebug', params: {} }));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
resetIdleTimer() {
|
|
143
|
+
this.clearIdleTimer();
|
|
144
|
+
if (this.idleTimeoutMs > 0) {
|
|
145
|
+
this.idleTimer = setTimeout(() => {
|
|
146
|
+
console.log(`[cdp-relay] Idle timeout (${this.idleTimeoutMs / 1000}s) — releasing debugging`);
|
|
147
|
+
this.releaseDebugging();
|
|
148
|
+
}, this.idleTimeoutMs);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
clearIdleTimer() {
|
|
152
|
+
if (this.idleTimer) {
|
|
153
|
+
clearTimeout(this.idleTimer);
|
|
154
|
+
this.idleTimer = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Get all Playwright pages via the persistent CDP connection */
|
|
158
|
+
async getPages() {
|
|
159
|
+
const browser = await this.ensurePlaywrightConnection();
|
|
160
|
+
if (!browser)
|
|
161
|
+
return [];
|
|
162
|
+
return browser.contexts().flatMap((c) => c.pages());
|
|
163
|
+
}
|
|
164
|
+
/** Get a Playwright page, optionally matched by dev server port */
|
|
165
|
+
async getPage(serverPort) {
|
|
166
|
+
const pages = await this.getPages();
|
|
167
|
+
if (!pages.length)
|
|
168
|
+
return null;
|
|
169
|
+
if (!serverPort)
|
|
170
|
+
return pages[0];
|
|
171
|
+
// Match page URL against the dev server port
|
|
172
|
+
for (const page of pages) {
|
|
173
|
+
try {
|
|
174
|
+
const url = new URL(page.url());
|
|
175
|
+
if (parseInt(url.port) === serverPort)
|
|
176
|
+
return page;
|
|
177
|
+
}
|
|
178
|
+
catch { }
|
|
179
|
+
}
|
|
180
|
+
// Also check targets — the page URL might be proxied (portless) but the target knows the original
|
|
181
|
+
for (const page of pages) {
|
|
182
|
+
for (const target of this.targets.values()) {
|
|
183
|
+
try {
|
|
184
|
+
const targetUrl = new URL(target.targetInfo.url);
|
|
185
|
+
const pageUrl = new URL(page.url());
|
|
186
|
+
if (targetUrl.hostname === pageUrl.hostname || pageUrl.hostname.endsWith('.localhost')) {
|
|
187
|
+
return page;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch { }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Fallback to first page
|
|
194
|
+
return pages[0];
|
|
195
|
+
}
|
|
196
|
+
/** Get a CDP session for a page (using getExistingCDPSession, not newCDPSession) */
|
|
197
|
+
async getCDPSession(page) {
|
|
198
|
+
return page.context().getExistingCDPSession(page);
|
|
199
|
+
}
|
|
200
|
+
async ensurePlaywrightConnection() {
|
|
201
|
+
if (this.pwBrowser)
|
|
202
|
+
return this.pwBrowser;
|
|
203
|
+
if (this.pwConnecting)
|
|
204
|
+
return null;
|
|
205
|
+
if (!this.isAvailable)
|
|
206
|
+
return null;
|
|
207
|
+
this.pwConnecting = true;
|
|
208
|
+
try {
|
|
209
|
+
const { chromium } = await import('@xmorse/playwright-core');
|
|
210
|
+
this.pwBrowser = await chromium.connectOverCDP(`http://127.0.0.1:${this.gatewayPort}`);
|
|
211
|
+
console.log('[cdp-relay] Playwright connected internally');
|
|
212
|
+
// Clean up on disconnect
|
|
213
|
+
this.pwBrowser.on('disconnected', () => {
|
|
214
|
+
console.log('[cdp-relay] Playwright internal connection lost');
|
|
215
|
+
this.pwBrowser = null;
|
|
216
|
+
});
|
|
217
|
+
return this.pwBrowser;
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
console.error('[cdp-relay] Failed to connect Playwright internally:', e.message);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
this.pwConnecting = false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
disconnectPlaywright() {
|
|
228
|
+
if (this.pwBrowser) {
|
|
229
|
+
this.pwBrowser.close().catch(() => { });
|
|
230
|
+
this.pwBrowser = null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// ---- HTTP & WebSocket routing ----
|
|
234
|
+
handleUpgrade(request, socket, head) {
|
|
235
|
+
const url = request.url || '';
|
|
236
|
+
if (url === '/__cdp-extension') {
|
|
237
|
+
this.extensionWss.handleUpgrade(request, socket, head, (ws) => {
|
|
238
|
+
this.extensionWss.emit('connection', ws, request);
|
|
239
|
+
});
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
if (url.startsWith('/devtools/browser/')) {
|
|
243
|
+
if (!this.extensionWs || this.extensionWs.readyState !== WebSocket.OPEN) {
|
|
244
|
+
console.log('[cdp-relay] Playwright tried to connect but no extension available');
|
|
245
|
+
socket.destroy();
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
this.playwrightWss.handleUpgrade(request, socket, head, (ws) => {
|
|
249
|
+
this.playwrightWss.emit('connection', ws, request);
|
|
250
|
+
});
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
/** Handle CDP control actions. Returns response object or null if not matched. */
|
|
256
|
+
handleAction(url) {
|
|
257
|
+
if (url === '/__cdp/release') {
|
|
258
|
+
this.releaseDebugging();
|
|
259
|
+
return { released: true, was_active: this.debuggingActive || this.targets.size > 0 };
|
|
260
|
+
}
|
|
261
|
+
if (url === '/__cdp/status') {
|
|
262
|
+
return {
|
|
263
|
+
debugging_active: this.debuggingActive,
|
|
264
|
+
targets: this.targets.size,
|
|
265
|
+
available_tabs: this.availableTabs.size,
|
|
266
|
+
extension_connected: this.extensionWs?.readyState === WebSocket.OPEN,
|
|
267
|
+
clients: this.clients.size,
|
|
268
|
+
idle_timeout_ms: this.idleTimeoutMs,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
handleHttp(url) {
|
|
274
|
+
const clean = url.replace(/\/$/, '');
|
|
275
|
+
if (clean === '/json/version') {
|
|
276
|
+
return {
|
|
277
|
+
Browser: 'webdev/Extension-Bridge',
|
|
278
|
+
'Protocol-Version': '1.3',
|
|
279
|
+
'V8-Version': '',
|
|
280
|
+
'User-Agent': '',
|
|
281
|
+
webSocketDebuggerUrl: `ws://127.0.0.1:${this.gatewayPort}/devtools/browser/webdev`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
if (clean === '/json/list' || clean === '/json') {
|
|
285
|
+
return [...this.targets.values()].map((t) => ({
|
|
286
|
+
id: t.targetInfo.targetId,
|
|
287
|
+
type: t.targetInfo.type,
|
|
288
|
+
url: t.targetInfo.url,
|
|
289
|
+
webSocketDebuggerUrl: `ws://127.0.0.1:${this.gatewayPort}/devtools/page/${t.targetInfo.targetId}`,
|
|
290
|
+
}));
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
// ---- Extension connection ----
|
|
295
|
+
onExtensionConnect(ws) {
|
|
296
|
+
if (this.extensionWs) {
|
|
297
|
+
console.log('[cdp-relay] Replacing existing extension connection');
|
|
298
|
+
this.extensionWs.close();
|
|
299
|
+
}
|
|
300
|
+
this.extensionWs = ws;
|
|
301
|
+
console.log('[cdp-relay] Extension connected');
|
|
302
|
+
ws.on('message', (data) => {
|
|
303
|
+
try {
|
|
304
|
+
this.onExtensionMessage(JSON.parse(data.toString()));
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
console.error('[cdp-relay] Bad extension message:', e.message);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
ws.on('close', () => {
|
|
311
|
+
console.log('[cdp-relay] Extension disconnected');
|
|
312
|
+
this.extensionWs = null;
|
|
313
|
+
this.targets.clear();
|
|
314
|
+
this.availableTabs.clear();
|
|
315
|
+
this.debuggingActive = false;
|
|
316
|
+
this.debuggingRequested = false;
|
|
317
|
+
this.clearIdleTimer();
|
|
318
|
+
this.disconnectPlaywright();
|
|
319
|
+
// Close all Playwright clients
|
|
320
|
+
for (const client of this.clients.values()) {
|
|
321
|
+
client.ws.close();
|
|
322
|
+
}
|
|
323
|
+
this.clients.clear();
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
onExtensionMessage(msg) {
|
|
327
|
+
// Command response — resolve pending promise, do NOT forward to Playwright
|
|
328
|
+
if (msg.id !== undefined && !msg.method) {
|
|
329
|
+
const pending = this.pendingCommands.get(msg.id);
|
|
330
|
+
if (pending) {
|
|
331
|
+
this.pendingCommands.delete(msg.id);
|
|
332
|
+
clearTimeout(pending.timer);
|
|
333
|
+
if (msg.error) {
|
|
334
|
+
pending.reject(new Error(msg.error.message || msg.error));
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
pending.resolve(msg.result);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (msg.method === 'pong')
|
|
343
|
+
return;
|
|
344
|
+
// Tab availability announcements
|
|
345
|
+
if (msg.method === 'tabAvailable') {
|
|
346
|
+
const { tabId, url, serverId, projectId } = msg.params;
|
|
347
|
+
this.availableTabs.set(tabId, { tabId, url, serverId, projectId });
|
|
348
|
+
console.log(`[cdp-relay] Tab available: ${tabId} url=${url}`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (msg.method === 'tabUnavailable') {
|
|
352
|
+
const { tabId } = msg.params;
|
|
353
|
+
this.availableTabs.delete(tabId);
|
|
354
|
+
console.log(`[cdp-relay] Tab unavailable: ${tabId}`);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// CDP event from extension — update state and forward to subscribed clients
|
|
358
|
+
if (msg.method === 'forwardCDPEvent') {
|
|
359
|
+
const { sessionId, method, params } = msg.params;
|
|
360
|
+
// Track target lifecycle with FULL targetInfo
|
|
361
|
+
if (method === 'Target.attachedToTarget') {
|
|
362
|
+
this.targets.set(params.sessionId, {
|
|
363
|
+
sessionId: params.sessionId,
|
|
364
|
+
targetInfo: { ...params.targetInfo },
|
|
365
|
+
});
|
|
366
|
+
this.debuggingActive = true;
|
|
367
|
+
console.log(`[cdp-relay] Target attached: ${params.sessionId} url=${params.targetInfo?.url}`);
|
|
368
|
+
}
|
|
369
|
+
else if (method === 'Target.detachedFromTarget') {
|
|
370
|
+
this.targets.delete(params.sessionId);
|
|
371
|
+
if (this.targets.size === 0) {
|
|
372
|
+
this.debuggingActive = false;
|
|
373
|
+
}
|
|
374
|
+
console.log(`[cdp-relay] Target detached: ${params.sessionId}`);
|
|
375
|
+
}
|
|
376
|
+
else if (method === 'Target.targetInfoChanged' && params.targetInfo) {
|
|
377
|
+
const existing = this.targets.get(sessionId);
|
|
378
|
+
if (existing) {
|
|
379
|
+
existing.targetInfo = { ...existing.targetInfo, ...params.targetInfo };
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Emit on internal bus (for Runtime.enable wait pattern)
|
|
383
|
+
this.events.emit('cdp:event', { method, params, sessionId });
|
|
384
|
+
// Route to subscribed clients
|
|
385
|
+
const cdpMsg = { method, params, sessionId: sessionId || undefined };
|
|
386
|
+
for (const client of this.clients.values()) {
|
|
387
|
+
if (client.ws.readyState !== WebSocket.OPEN)
|
|
388
|
+
continue;
|
|
389
|
+
if (method === 'Target.attachedToTarget') {
|
|
390
|
+
// Only send to clients subscribed to all targets (via setAutoAttach)
|
|
391
|
+
if (!client.subscribedToAll)
|
|
392
|
+
continue;
|
|
393
|
+
const sid = params.sessionId;
|
|
394
|
+
if (client.announcedSessions.has(sid))
|
|
395
|
+
continue; // dedup
|
|
396
|
+
client.announcedSessions.add(sid);
|
|
397
|
+
}
|
|
398
|
+
else if (method === 'Target.detachedFromTarget') {
|
|
399
|
+
client.announcedSessions.delete(params.sessionId);
|
|
400
|
+
// Only send to clients that knew about this session
|
|
401
|
+
if (!client.subscribedToAll)
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
// Regular CDP events — route to clients that own this session
|
|
406
|
+
const eventSession = sessionId || params?.sessionId;
|
|
407
|
+
if (eventSession && !client.announcedSessions.has(eventSession) && !client.subscribedToAll)
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
client.ws.send(JSON.stringify(cdpMsg));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// ---- Playwright client connections ----
|
|
415
|
+
onPlaywrightConnect(ws) {
|
|
416
|
+
const clientId = `pw-${nextClientId++}`;
|
|
417
|
+
const client = {
|
|
418
|
+
ws,
|
|
419
|
+
clientId,
|
|
420
|
+
announcedSessions: new Set(),
|
|
421
|
+
subscribedToAll: false,
|
|
422
|
+
};
|
|
423
|
+
this.clients.set(clientId, client);
|
|
424
|
+
console.log(`[cdp-relay] Playwright client connected: ${clientId} (${this.clients.size} total)`);
|
|
425
|
+
ws.on('message', (data) => {
|
|
426
|
+
try {
|
|
427
|
+
this.onPlaywrightMessage(client, JSON.parse(data.toString()));
|
|
428
|
+
}
|
|
429
|
+
catch (e) {
|
|
430
|
+
console.error(`[cdp-relay] Bad Playwright message from ${clientId}:`, e.message);
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
ws.on('close', () => {
|
|
434
|
+
this.clients.delete(clientId);
|
|
435
|
+
console.log(`[cdp-relay] Playwright client disconnected: ${clientId} (${this.clients.size} remaining)`);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
async onPlaywrightMessage(client, msg) {
|
|
439
|
+
const { id, method, params, sessionId } = msg;
|
|
440
|
+
try {
|
|
441
|
+
const result = await this.routeCommand(method, params, sessionId);
|
|
442
|
+
// After Target.setAutoAttach: mark client as subscribed and synthesize
|
|
443
|
+
// Target.attachedToTarget for all known targets not yet announced to this client
|
|
444
|
+
if (method === 'Target.setAutoAttach' && !sessionId) {
|
|
445
|
+
client.subscribedToAll = true;
|
|
446
|
+
for (const target of this.targets.values()) {
|
|
447
|
+
if (client.announcedSessions.has(target.sessionId))
|
|
448
|
+
continue;
|
|
449
|
+
client.announcedSessions.add(target.sessionId);
|
|
450
|
+
this.sendToClient(client, {
|
|
451
|
+
method: 'Target.attachedToTarget',
|
|
452
|
+
params: {
|
|
453
|
+
sessionId: target.sessionId,
|
|
454
|
+
targetInfo: { ...target.targetInfo, attached: true },
|
|
455
|
+
waitingForDebugger: false,
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// Track session ownership when client attaches to a target
|
|
461
|
+
if (method === 'Target.attachToTarget' && result?.sessionId) {
|
|
462
|
+
client.announcedSessions.add(result.sessionId);
|
|
463
|
+
}
|
|
464
|
+
this.sendToClient(client, { id, sessionId, result });
|
|
465
|
+
}
|
|
466
|
+
catch (e) {
|
|
467
|
+
this.sendToClient(client, { id, sessionId, error: { message: e.message } });
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// ---- CDP command routing ----
|
|
471
|
+
async routeCommand(method, params, sessionId) {
|
|
472
|
+
// For commands that need targets, ensure debugging is active first
|
|
473
|
+
if (!this.debuggingActive && this.canActivate) {
|
|
474
|
+
const needsTargets = [
|
|
475
|
+
'Target.getTargetInfo', 'Target.getTargets', 'Target.attachToTarget',
|
|
476
|
+
'Target.attachToBrowserTarget', 'Target.setAutoAttach', 'Runtime.enable',
|
|
477
|
+
].includes(method);
|
|
478
|
+
if (needsTargets || sessionId) {
|
|
479
|
+
await this.ensureDebugging();
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
switch (method) {
|
|
483
|
+
// --- Handled locally ---
|
|
484
|
+
case 'Browser.getVersion':
|
|
485
|
+
return {
|
|
486
|
+
protocolVersion: '1.3',
|
|
487
|
+
product: 'Chrome/Extension-Bridge',
|
|
488
|
+
revision: '',
|
|
489
|
+
userAgent: '',
|
|
490
|
+
jsVersion: '',
|
|
491
|
+
};
|
|
492
|
+
case 'Browser.setDownloadBehavior':
|
|
493
|
+
return {};
|
|
494
|
+
case 'Target.setDiscoverTargets':
|
|
495
|
+
return {};
|
|
496
|
+
case 'Target.attachToTarget': {
|
|
497
|
+
const target = [...this.targets.values()].find((t) => t.targetInfo.targetId === params?.targetId);
|
|
498
|
+
if (!target)
|
|
499
|
+
throw new Error(`Target not found: ${params?.targetId}`);
|
|
500
|
+
return { sessionId: target.sessionId };
|
|
501
|
+
}
|
|
502
|
+
case 'Target.getTargetInfo': {
|
|
503
|
+
let target;
|
|
504
|
+
if (params?.targetId) {
|
|
505
|
+
target = [...this.targets.values()].find((t) => t.targetInfo.targetId === params.targetId);
|
|
506
|
+
}
|
|
507
|
+
else if (sessionId) {
|
|
508
|
+
target = this.targets.get(sessionId);
|
|
509
|
+
}
|
|
510
|
+
if (!target) {
|
|
511
|
+
target = [...this.targets.values()][0];
|
|
512
|
+
}
|
|
513
|
+
if (!target)
|
|
514
|
+
throw new Error('No targets available');
|
|
515
|
+
return { targetInfo: target.targetInfo };
|
|
516
|
+
}
|
|
517
|
+
case 'Target.getTargets':
|
|
518
|
+
return {
|
|
519
|
+
targetInfos: [...this.targets.values()].map((t) => ({
|
|
520
|
+
...t.targetInfo,
|
|
521
|
+
attached: true,
|
|
522
|
+
})),
|
|
523
|
+
};
|
|
524
|
+
case 'Target.attachToBrowserTarget': {
|
|
525
|
+
const t = params?.targetId
|
|
526
|
+
? [...this.targets.values()].find((t) => t.targetInfo.targetId === params.targetId)
|
|
527
|
+
: [...this.targets.values()][0];
|
|
528
|
+
if (!t)
|
|
529
|
+
throw new Error('No targets available for browser session');
|
|
530
|
+
return { sessionId: t.sessionId };
|
|
531
|
+
}
|
|
532
|
+
// --- Special handling: forward + post-processing ---
|
|
533
|
+
case 'Target.setAutoAttach': {
|
|
534
|
+
if (sessionId) {
|
|
535
|
+
return this.sendToExtension(method, params, sessionId);
|
|
536
|
+
}
|
|
537
|
+
// Root level: forward to extension (it applies to all tabs), return {}
|
|
538
|
+
this.sendToExtension(method, params).catch(() => { });
|
|
539
|
+
return {};
|
|
540
|
+
}
|
|
541
|
+
case 'Runtime.enable': {
|
|
542
|
+
if (!sessionId) {
|
|
543
|
+
return this.sendToExtension(method, params, sessionId);
|
|
544
|
+
}
|
|
545
|
+
const contextPromise = new Promise((resolve) => {
|
|
546
|
+
const handler = (event) => {
|
|
547
|
+
if (event.method === 'Runtime.executionContextCreated' &&
|
|
548
|
+
event.sessionId === sessionId &&
|
|
549
|
+
event.params?.context?.auxData?.isDefault === true) {
|
|
550
|
+
clearTimeout(timer);
|
|
551
|
+
this.events.off('cdp:event', handler);
|
|
552
|
+
resolve();
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
const timer = setTimeout(() => {
|
|
556
|
+
this.events.off('cdp:event', handler);
|
|
557
|
+
console.log(`[cdp-relay] Runtime.enable: executionContextCreated timeout (3s) for ${sessionId}`);
|
|
558
|
+
resolve();
|
|
559
|
+
}, 3000);
|
|
560
|
+
this.events.on('cdp:event', handler);
|
|
561
|
+
});
|
|
562
|
+
const result = await this.sendToExtension(method, params, sessionId);
|
|
563
|
+
await contextPromise;
|
|
564
|
+
return result;
|
|
565
|
+
}
|
|
566
|
+
case 'Target.createTarget':
|
|
567
|
+
case 'Target.closeTarget':
|
|
568
|
+
return this.sendToExtension(method, params, sessionId);
|
|
569
|
+
// --- Default: forward to extension ---
|
|
570
|
+
default:
|
|
571
|
+
return this.sendToExtension(method, params, sessionId);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
// ---- Transport helpers ----
|
|
575
|
+
sendToClient(client, msg) {
|
|
576
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
577
|
+
client.ws.send(JSON.stringify(msg));
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
sendToExtension(method, params, sessionId) {
|
|
581
|
+
return new Promise((resolve, reject) => {
|
|
582
|
+
if (!this.extensionWs || this.extensionWs.readyState !== WebSocket.OPEN) {
|
|
583
|
+
reject(new Error('Extension not connected'));
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
const id = this.nextCommandId++;
|
|
587
|
+
const timer = setTimeout(() => {
|
|
588
|
+
this.pendingCommands.delete(id);
|
|
589
|
+
reject(new Error(`Extension command timeout (30s): ${method}`));
|
|
590
|
+
}, 30000);
|
|
591
|
+
this.pendingCommands.set(id, { resolve, reject, timer });
|
|
592
|
+
this.extensionWs.send(JSON.stringify({
|
|
593
|
+
id,
|
|
594
|
+
method: 'forwardCDPCommand',
|
|
595
|
+
params: { sessionId, method, params },
|
|
596
|
+
}));
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
close() {
|
|
600
|
+
this.clearIdleTimer();
|
|
601
|
+
this.disconnectPlaywright();
|
|
602
|
+
this.extensionWs?.close();
|
|
603
|
+
for (const client of this.clients.values()) {
|
|
604
|
+
client.ws.close();
|
|
605
|
+
}
|
|
606
|
+
this.clients.clear();
|
|
607
|
+
this.extensionWss.close();
|
|
608
|
+
this.playwrightWss.close();
|
|
609
|
+
for (const pending of this.pendingCommands.values()) {
|
|
610
|
+
clearTimeout(pending.timer);
|
|
611
|
+
pending.reject(new Error('Relay closed'));
|
|
612
|
+
}
|
|
613
|
+
this.pendingCommands.clear();
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=cdp-relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-relay.js","sourceRoot":"","sources":["../src/cdp-relay.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|