@midscene/web 1.5.8-beta-20260325025832.0 → 1.5.8

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.
@@ -1,219 +0,0 @@
1
- "use strict";
2
- var __webpack_exports__ = {};
3
- const external_node_crypto_namespaceObject = require("node:crypto");
4
- const external_node_fs_namespaceObject = require("node:fs");
5
- const external_node_http_namespaceObject = require("node:http");
6
- const external_node_net_namespaceObject = require("node:net");
7
- const external_node_os_namespaceObject = require("node:os");
8
- const external_node_path_namespaceObject = require("node:path");
9
- const external_node_url_namespaceObject = require("node:url");
10
- const IDLE_TIMEOUT_MS = 300000;
11
- const PROXY_ENDPOINT_FILE = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), 'midscene-cdp-proxy-endpoint');
12
- const PROXY_PID_FILE = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), 'midscene-cdp-proxy-pid');
13
- const chromeEndpoint = process.argv[2];
14
- if (!chromeEndpoint) {
15
- process.stderr.write('Usage: node cdp-proxy.js <chrome-ws-endpoint>\n');
16
- process.exit(1);
17
- }
18
- function cleanup() {
19
- try {
20
- if ((0, external_node_fs_namespaceObject.existsSync)(PROXY_ENDPOINT_FILE)) (0, external_node_fs_namespaceObject.unlinkSync)(PROXY_ENDPOINT_FILE);
21
- } catch {}
22
- try {
23
- if ((0, external_node_fs_namespaceObject.existsSync)(PROXY_PID_FILE)) (0, external_node_fs_namespaceObject.unlinkSync)(PROXY_PID_FILE);
24
- } catch {}
25
- }
26
- function shutdown(reason) {
27
- process.stderr.write(`[cdp-proxy] shutting down: ${reason}\n`);
28
- cleanup();
29
- process.exit(0);
30
- }
31
- process.on('SIGTERM', ()=>shutdown('SIGTERM'));
32
- process.on('SIGINT', ()=>shutdown('SIGINT'));
33
- process.on('uncaughtException', (e)=>shutdown(`uncaught: ${e.message}`));
34
- let idleTimer = null;
35
- function resetIdleTimer() {
36
- if (idleTimer) clearTimeout(idleTimer);
37
- idleTimer = setTimeout(()=>shutdown('idle timeout (5min)'), IDLE_TIMEOUT_MS);
38
- }
39
- resetIdleTimer();
40
- function encodeFrame(data, opcode = 0x01, mask = false) {
41
- const len = data.length;
42
- let headerLen = 2;
43
- if (len > 65535) headerLen += 8;
44
- else if (len > 125) headerLen += 2;
45
- if (mask) headerLen += 4;
46
- const header = Buffer.alloc(headerLen);
47
- header[0] = 0x80 | opcode;
48
- let offset = 1;
49
- if (len > 65535) {
50
- header[offset++] = (mask ? 0x80 : 0) | 127;
51
- header.writeBigUInt64BE(BigInt(len), offset);
52
- offset += 8;
53
- } else if (len > 125) {
54
- header[offset++] = (mask ? 0x80 : 0) | 126;
55
- header.writeUInt16BE(len, offset);
56
- offset += 2;
57
- } else header[offset++] = (mask ? 0x80 : 0) | len;
58
- if (mask) {
59
- const maskBytes = Buffer.from([
60
- 256 * Math.random(),
61
- 256 * Math.random(),
62
- 256 * Math.random(),
63
- 256 * Math.random()
64
- ]);
65
- maskBytes.copy(header, offset);
66
- const masked = Buffer.alloc(len);
67
- for(let i = 0; i < len; i++)masked[i] = data[i] ^ maskBytes[3 & i];
68
- return Buffer.concat([
69
- header,
70
- masked
71
- ]);
72
- }
73
- return Buffer.concat([
74
- header,
75
- data
76
- ]);
77
- }
78
- function parseFrame(buf) {
79
- if (buf.length < 2) return null;
80
- const opcode = 0x0f & buf[0];
81
- const isMasked = (0x80 & buf[1]) !== 0;
82
- let payloadLen = 0x7f & buf[1];
83
- let offset = 2;
84
- if (126 === payloadLen) {
85
- if (buf.length < 4) return null;
86
- payloadLen = buf.readUInt16BE(2);
87
- offset = 4;
88
- } else if (127 === payloadLen) {
89
- if (buf.length < 10) return null;
90
- payloadLen = Number(buf.readBigUInt64BE(2));
91
- offset = 10;
92
- }
93
- if (isMasked) offset += 4;
94
- if (buf.length < offset + payloadLen) return null;
95
- let payload;
96
- if (isMasked) {
97
- const maskKey = buf.subarray(offset - 4, offset);
98
- payload = Buffer.alloc(payloadLen);
99
- for(let i = 0; i < payloadLen; i++)payload[i] = buf[offset + i] ^ maskKey[3 & i];
100
- } else payload = buf.subarray(offset, offset + payloadLen);
101
- return {
102
- opcode,
103
- payload,
104
- total: offset + payloadLen
105
- };
106
- }
107
- const chromeUrl = new external_node_url_namespaceObject.URL(chromeEndpoint);
108
- const chromeHost = chromeUrl.hostname;
109
- const chromePort = Number(chromeUrl.port) || 80;
110
- const chromePath = chromeUrl.pathname || '/devtools/browser';
111
- let upstream;
112
- let upstreamReady = false;
113
- let upstreamBuf = Buffer.alloc(0);
114
- const clients = new Set();
115
- function connectUpstream() {
116
- upstream = (0, external_node_net_namespaceObject.connect)({
117
- host: chromeHost,
118
- port: chromePort
119
- }, ()=>{
120
- const key = (0, external_node_crypto_namespaceObject.createHash)('sha1').update(String(Date.now())).digest('base64').substring(0, 22);
121
- const req = [
122
- `GET ${chromePath} HTTP/1.1`,
123
- `Host: ${chromeHost}:${chromePort}`,
124
- 'Upgrade: websocket',
125
- 'Connection: Upgrade',
126
- 'Sec-WebSocket-Version: 13',
127
- `Sec-WebSocket-Key: ${key}`,
128
- '',
129
- ''
130
- ].join('\r\n');
131
- upstream.write(req);
132
- });
133
- upstream.on('data', (chunk)=>{
134
- upstreamBuf = Buffer.concat([
135
- upstreamBuf,
136
- chunk
137
- ]);
138
- if (!upstreamReady) {
139
- const idx = upstreamBuf.indexOf('\r\n\r\n');
140
- if (-1 === idx) return;
141
- const headers = upstreamBuf.subarray(0, idx).toString();
142
- if (!headers.includes('101')) return void shutdown(`upstream handshake failed: ${headers.split('\r\n')[0]}`);
143
- upstreamReady = true;
144
- upstreamBuf = upstreamBuf.subarray(idx + 4);
145
- onUpstreamReady();
146
- }
147
- while(upstreamBuf.length > 0){
148
- const frame = parseFrame(upstreamBuf);
149
- if (!frame) break;
150
- if (0x08 === frame.opcode) return void shutdown('upstream sent close frame');
151
- resetIdleTimer();
152
- const outFrame = encodeFrame(frame.payload, frame.opcode, false);
153
- for (const client of clients)if (!client.destroyed) client.write(outFrame);
154
- upstreamBuf = upstreamBuf.subarray(frame.total);
155
- }
156
- });
157
- upstream.on('error', (err)=>shutdown(`upstream error: ${err.message}`));
158
- upstream.on('close', ()=>shutdown('upstream closed'));
159
- }
160
- const httpServer = (0, external_node_http_namespaceObject.createServer)((_req, res)=>{
161
- res.writeHead(404);
162
- res.end();
163
- });
164
- httpServer.on('upgrade', (req, socket, head)=>{
165
- const key = req.headers['sec-websocket-key'];
166
- if (!key) return void socket.destroy();
167
- const accept = (0, external_node_crypto_namespaceObject.createHash)('sha1').update(`${key}258EAFA5-E914-47DA-95CA-5AB5DC085B63`).digest('base64');
168
- socket.write([
169
- 'HTTP/1.1 101 WebSocket Protocol Handshake',
170
- 'Upgrade: WebSocket',
171
- 'Connection: Upgrade',
172
- `Sec-WebSocket-Accept: ${accept}`,
173
- '',
174
- ''
175
- ].join('\r\n'));
176
- clients.add(socket);
177
- resetIdleTimer();
178
- let clientBuf = Buffer.from(head);
179
- socket.on('data', (chunk)=>{
180
- clientBuf = Buffer.concat([
181
- clientBuf,
182
- chunk
183
- ]);
184
- while(clientBuf.length > 0){
185
- const frame = parseFrame(clientBuf);
186
- if (!frame) break;
187
- if (0x08 === frame.opcode) {
188
- clients.delete(socket);
189
- socket.destroy();
190
- return;
191
- }
192
- resetIdleTimer();
193
- const outFrame = encodeFrame(frame.payload, frame.opcode, true);
194
- if (!upstream.destroyed) upstream.write(outFrame);
195
- clientBuf = clientBuf.subarray(frame.total);
196
- }
197
- });
198
- socket.on('close', ()=>clients.delete(socket));
199
- socket.on('error', ()=>clients.delete(socket));
200
- });
201
- function onUpstreamReady() {
202
- httpServer.listen(0, '127.0.0.1', ()=>{
203
- const addr = httpServer.address();
204
- if (!addr || 'string' == typeof addr) return void shutdown('failed to get server address');
205
- const proxyEndpoint = `ws://127.0.0.1:${addr.port}/devtools/browser`;
206
- (0, external_node_fs_namespaceObject.writeFileSync)(PROXY_ENDPOINT_FILE, proxyEndpoint);
207
- (0, external_node_fs_namespaceObject.writeFileSync)(PROXY_PID_FILE, String(process.pid));
208
- process.stdout.write(`${JSON.stringify({
209
- endpoint: proxyEndpoint
210
- })}\n`);
211
- });
212
- }
213
- connectUpstream();
214
- for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
215
- Object.defineProperty(exports, '__esModule', {
216
- value: true
217
- });
218
-
219
- //# sourceMappingURL=cdp-proxy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cdp-proxy.js","sources":["../../src/cdp-proxy.ts"],"sourcesContent":["/**\n * CDP WebSocket Proxy — standalone process.\n *\n * Holds a single persistent WebSocket connection to Chrome's CDP endpoint and\n * exposes a local WebSocket server. Midscene CLI processes connect to the proxy\n * instead of Chrome directly, so Chrome's \"Allow remote debugging\" permission\n * popup only fires once (when the proxy connects).\n *\n * Exit conditions:\n * 1. Upstream Chrome connection closes or errors.\n * 2. No downstream client message for IDLE_TIMEOUT_MS (default 5 min).\n * 3. SIGTERM / SIGINT.\n *\n * Usage (spawned by mcp-tools-cdp.ts):\n * node cdp-proxy.js <chrome-ws-endpoint>\n *\n * On startup, prints the proxy endpoint to stdout as a single JSON line:\n * {\"endpoint\":\"ws://127.0.0.1:<port>/devtools/browser\"}\n * and writes the same endpoint to PROXY_ENDPOINT_FILE.\n *\n * Implementation uses only Node.js built-ins (no `ws` dependency).\n */\n\nimport { createHash } from 'node:crypto';\nimport { existsSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { type IncomingMessage, createServer } from 'node:http';\nimport { type Socket, connect as netConnect } from 'node:net';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { URL } from 'node:url';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nconst IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst PROXY_ENDPOINT_FILE = join(tmpdir(), 'midscene-cdp-proxy-endpoint');\nconst PROXY_PID_FILE = join(tmpdir(), 'midscene-cdp-proxy-pid');\n\nconst chromeEndpoint = process.argv[2];\nif (!chromeEndpoint) {\n process.stderr.write('Usage: node cdp-proxy.js <chrome-ws-endpoint>\\n');\n process.exit(1);\n}\n\n// ---------------------------------------------------------------------------\n// Cleanup helper\n// ---------------------------------------------------------------------------\n\nfunction cleanup() {\n try {\n if (existsSync(PROXY_ENDPOINT_FILE)) unlinkSync(PROXY_ENDPOINT_FILE);\n } catch {}\n try {\n if (existsSync(PROXY_PID_FILE)) unlinkSync(PROXY_PID_FILE);\n } catch {}\n}\n\nfunction shutdown(reason: string) {\n process.stderr.write(`[cdp-proxy] shutting down: ${reason}\\n`);\n cleanup();\n process.exit(0);\n}\n\nprocess.on('SIGTERM', () => shutdown('SIGTERM'));\nprocess.on('SIGINT', () => shutdown('SIGINT'));\nprocess.on('uncaughtException', (e) => shutdown(`uncaught: ${e.message}`));\n\n// ---------------------------------------------------------------------------\n// Idle timer\n// ---------------------------------------------------------------------------\n\nlet idleTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction resetIdleTimer() {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(\n () => shutdown('idle timeout (5min)'),\n IDLE_TIMEOUT_MS,\n );\n}\n\nresetIdleTimer();\n\n// ---------------------------------------------------------------------------\n// Minimal WebSocket frame helpers (RFC 6455)\n// ---------------------------------------------------------------------------\n\nfunction encodeFrame(data: Buffer, opcode = 0x01, mask = false): Buffer {\n const len = data.length;\n let headerLen = 2;\n if (len > 65535) headerLen += 8;\n else if (len > 125) headerLen += 2;\n if (mask) headerLen += 4;\n\n const header = Buffer.alloc(headerLen);\n header[0] = 0x80 | opcode; // FIN + opcode\n let offset = 1;\n\n if (len > 65535) {\n header[offset++] = (mask ? 0x80 : 0) | 127;\n header.writeBigUInt64BE(BigInt(len), offset);\n offset += 8;\n } else if (len > 125) {\n header[offset++] = (mask ? 0x80 : 0) | 126;\n header.writeUInt16BE(len, offset);\n offset += 2;\n } else {\n header[offset++] = (mask ? 0x80 : 0) | len;\n }\n\n if (mask) {\n const maskBytes = Buffer.from([\n Math.random() * 256,\n Math.random() * 256,\n Math.random() * 256,\n Math.random() * 256,\n ]);\n maskBytes.copy(header, offset);\n const masked = Buffer.alloc(len);\n for (let i = 0; i < len; i++) masked[i] = data[i] ^ maskBytes[i & 3];\n return Buffer.concat([header, masked]);\n }\n\n return Buffer.concat([header, data]);\n}\n\ninterface ParsedFrame {\n opcode: number;\n payload: Buffer;\n total: number;\n}\n\nfunction parseFrame(buf: Buffer): ParsedFrame | null {\n if (buf.length < 2) return null;\n const opcode = buf[0] & 0x0f;\n const isMasked = (buf[1] & 0x80) !== 0;\n let payloadLen = buf[1] & 0x7f;\n let offset = 2;\n\n if (payloadLen === 126) {\n if (buf.length < 4) return null;\n payloadLen = buf.readUInt16BE(2);\n offset = 4;\n } else if (payloadLen === 127) {\n if (buf.length < 10) return null;\n payloadLen = Number(buf.readBigUInt64BE(2));\n offset = 10;\n }\n\n if (isMasked) offset += 4;\n if (buf.length < offset + payloadLen) return null;\n\n let payload: Buffer;\n if (isMasked) {\n const maskKey = buf.subarray(offset - 4, offset);\n payload = Buffer.alloc(payloadLen);\n for (let i = 0; i < payloadLen; i++)\n payload[i] = buf[offset + i] ^ maskKey[i & 3];\n } else {\n payload = buf.subarray(offset, offset + payloadLen);\n }\n\n return { opcode, payload, total: offset + payloadLen };\n}\n\n// ---------------------------------------------------------------------------\n// Upstream: connect to Chrome via raw TCP + WebSocket handshake\n// ---------------------------------------------------------------------------\n\nconst chromeUrl = new URL(chromeEndpoint);\nconst chromeHost = chromeUrl.hostname;\nconst chromePort = Number(chromeUrl.port) || 80;\nconst chromePath = chromeUrl.pathname || '/devtools/browser';\n\nlet upstream: Socket;\nlet upstreamReady = false;\nlet upstreamBuf = Buffer.alloc(0);\n\n// Track all downstream client sockets\nconst clients = new Set<Socket>();\n\nfunction connectUpstream() {\n upstream = netConnect({ host: chromeHost, port: chromePort }, () => {\n // Send WebSocket upgrade request\n const key = createHash('sha1')\n .update(String(Date.now()))\n .digest('base64')\n .substring(0, 22);\n const req = [\n `GET ${chromePath} HTTP/1.1`,\n `Host: ${chromeHost}:${chromePort}`,\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n 'Sec-WebSocket-Version: 13',\n `Sec-WebSocket-Key: ${key}`,\n '',\n '',\n ].join('\\r\\n');\n upstream.write(req);\n });\n\n upstream.on('data', (chunk: Buffer) => {\n upstreamBuf = Buffer.concat([upstreamBuf, chunk]);\n\n if (!upstreamReady) {\n const idx = upstreamBuf.indexOf('\\r\\n\\r\\n');\n if (idx === -1) return;\n const headers = upstreamBuf.subarray(0, idx).toString();\n if (!headers.includes('101')) {\n shutdown(`upstream handshake failed: ${headers.split('\\r\\n')[0]}`);\n return;\n }\n upstreamReady = true;\n upstreamBuf = upstreamBuf.subarray(idx + 4);\n onUpstreamReady();\n }\n\n // Parse and forward frames to all downstream clients\n while (upstreamBuf.length > 0) {\n const frame = parseFrame(upstreamBuf);\n if (!frame) break;\n\n if (frame.opcode === 0x08) {\n // Close frame\n shutdown('upstream sent close frame');\n return;\n }\n\n resetIdleTimer();\n\n // Re-encode as unmasked server frame and send to all clients\n const outFrame = encodeFrame(frame.payload, frame.opcode, false);\n for (const client of clients) {\n if (!client.destroyed) client.write(outFrame);\n }\n\n upstreamBuf = upstreamBuf.subarray(frame.total);\n }\n });\n\n upstream.on('error', (err) => shutdown(`upstream error: ${err.message}`));\n upstream.on('close', () => shutdown('upstream closed'));\n}\n\n// ---------------------------------------------------------------------------\n// Downstream: HTTP server that upgrades to WebSocket\n// ---------------------------------------------------------------------------\n\nconst httpServer = createServer((_req, res) => {\n res.writeHead(404);\n res.end();\n});\n\nhttpServer.on(\n 'upgrade',\n (req: IncomingMessage, socket: Socket, head: Buffer) => {\n const key = req.headers['sec-websocket-key'];\n if (!key) {\n socket.destroy();\n return;\n }\n\n // Complete WebSocket handshake\n const accept = createHash('sha1')\n .update(`${key}258EAFA5-E914-47DA-95CA-5AB5DC085B63`)\n .digest('base64');\n socket.write(\n [\n 'HTTP/1.1 101 WebSocket Protocol Handshake',\n 'Upgrade: WebSocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${accept}`,\n '',\n '',\n ].join('\\r\\n'),\n );\n\n clients.add(socket);\n resetIdleTimer();\n\n let clientBuf = Buffer.from(head);\n\n socket.on('data', (chunk: Buffer) => {\n clientBuf = Buffer.concat([clientBuf, chunk]);\n\n while (clientBuf.length > 0) {\n const frame = parseFrame(clientBuf);\n if (!frame) break;\n\n if (frame.opcode === 0x08) {\n // Close frame from client\n clients.delete(socket);\n socket.destroy();\n return;\n }\n\n resetIdleTimer();\n\n // Re-encode as masked client frame and send upstream\n const outFrame = encodeFrame(frame.payload, frame.opcode, true);\n if (!upstream.destroyed) upstream.write(outFrame);\n\n clientBuf = clientBuf.subarray(frame.total);\n }\n });\n\n socket.on('close', () => clients.delete(socket));\n socket.on('error', () => clients.delete(socket));\n },\n);\n\n// ---------------------------------------------------------------------------\n// Start\n// ---------------------------------------------------------------------------\n\nfunction onUpstreamReady() {\n httpServer.listen(0, '127.0.0.1', () => {\n const addr = httpServer.address();\n if (!addr || typeof addr === 'string') {\n shutdown('failed to get server address');\n return;\n }\n\n const proxyEndpoint = `ws://127.0.0.1:${addr.port}/devtools/browser`;\n\n writeFileSync(PROXY_ENDPOINT_FILE, proxyEndpoint);\n writeFileSync(PROXY_PID_FILE, String(process.pid));\n\n // Print to stdout so the spawner can read it\n process.stdout.write(`${JSON.stringify({ endpoint: proxyEndpoint })}\\n`);\n });\n}\n\nconnectUpstream();\n"],"names":["IDLE_TIMEOUT_MS","PROXY_ENDPOINT_FILE","join","tmpdir","PROXY_PID_FILE","chromeEndpoint","process","cleanup","existsSync","unlinkSync","shutdown","reason","e","idleTimer","resetIdleTimer","clearTimeout","setTimeout","encodeFrame","data","opcode","mask","len","headerLen","header","Buffer","offset","BigInt","maskBytes","Math","masked","i","parseFrame","buf","isMasked","payloadLen","Number","payload","maskKey","chromeUrl","URL","chromeHost","chromePort","chromePath","upstream","upstreamReady","upstreamBuf","clients","Set","connectUpstream","netConnect","key","createHash","String","Date","req","chunk","idx","headers","onUpstreamReady","frame","outFrame","client","err","httpServer","createServer","_req","res","socket","head","accept","clientBuf","addr","proxyEndpoint","writeFileSync","JSON"],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /**
2
- * CDP WebSocket Proxy — standalone process.
3
- *
4
- * Holds a single persistent WebSocket connection to Chrome's CDP endpoint and
5
- * exposes a local WebSocket server. Midscene CLI processes connect to the proxy
6
- * instead of Chrome directly, so Chrome's "Allow remote debugging" permission
7
- * popup only fires once (when the proxy connects).
8
- *
9
- * Exit conditions:
10
- * 1. Upstream Chrome connection closes or errors.
11
- * 2. No downstream client message for IDLE_TIMEOUT_MS (default 5 min).
12
- * 3. SIGTERM / SIGINT.
13
- *
14
- * Usage (spawned by mcp-tools-cdp.ts):
15
- * node cdp-proxy.js <chrome-ws-endpoint>
16
- *
17
- * On startup, prints the proxy endpoint to stdout as a single JSON line:
18
- * {"endpoint":"ws://127.0.0.1:<port>/devtools/browser"}
19
- * and writes the same endpoint to PROXY_ENDPOINT_FILE.
20
- *
21
- * Implementation uses only Node.js built-ins (no `ws` dependency).
22
- */
23
- export {};