cdp-tunnel 3.3.2 → 3.3.4
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/package.json
CHANGED
|
@@ -146,7 +146,7 @@ class PortPoolManager {
|
|
|
146
146
|
Browser: 'Chrome/131.0.6778.86 (cdp-tunnel)',
|
|
147
147
|
'Protocol-Version': '1.3',
|
|
148
148
|
'User-Agent': 'cdp-tunnel/3.0',
|
|
149
|
-
'webSocketDebuggerUrl': `ws://localhost:${session.port}/
|
|
149
|
+
'webSocketDebuggerUrl': `ws://localhost:${session.port}/client`
|
|
150
150
|
}));
|
|
151
151
|
return;
|
|
152
152
|
}
|
|
@@ -349,29 +349,57 @@ class PortPoolManager {
|
|
|
349
349
|
return true;
|
|
350
350
|
}
|
|
351
351
|
}
|
|
352
|
-
// 竞态处理:targetCreated 在 createTarget 响应之前到达
|
|
353
|
-
//
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
sess.
|
|
358
|
-
sess.
|
|
359
|
-
|
|
360
|
-
|
|
352
|
+
// 竞态处理:targetCreated/attachedToTarget 在 createTarget 响应之前到达
|
|
353
|
+
// targetToPort 还没记录。检查 pendingCreate。
|
|
354
|
+
// 同时也对 attachedToTarget 放行(它的 targetId 和 targetCreated 一样)
|
|
355
|
+
if (msg.method === 'Target.targetCreated' || msg.method === 'Target.attachedToTarget') {
|
|
356
|
+
for (let pi = 0; pi < this.portSessions.length; pi++) {
|
|
357
|
+
const sess = this.portSessions[pi];
|
|
358
|
+
if (sess && sess.pendingCreate) {
|
|
359
|
+
// 提前注册
|
|
360
|
+
sess.targetIds.add(targetId);
|
|
361
|
+
sess.targetUrls.set(targetId, 'about:blank');
|
|
362
|
+
this.targetToPort.set(targetId, pi);
|
|
363
|
+
if (msg.method === 'Target.attachedToTarget') sess.pendingCreate = false;
|
|
364
|
+
this._broadcastToPort(pi, msg);
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// 没有 pendingCreate——广播给所有端口(对齐直连 Chrome 的广播行为)
|
|
369
|
+
// 这样即使竞态导致没匹配到,客户端也能收到事件
|
|
370
|
+
for (let pi = 0; pi < this.portSessions.length; pi++) {
|
|
361
371
|
this._broadcastToPort(pi, msg);
|
|
362
|
-
return true;
|
|
363
372
|
}
|
|
373
|
+
return true;
|
|
364
374
|
}
|
|
365
375
|
}
|
|
366
376
|
|
|
367
|
-
// sessionId 路由(Network/Screencast/Input 等 session 事件)
|
|
377
|
+
// sessionId 路由(Network/Screencast/Input/Page 等 session 事件)
|
|
368
378
|
if (msg.sessionId) {
|
|
369
379
|
const portIndex = this.sessionToPort.get(msg.sessionId);
|
|
370
380
|
if (portIndex !== undefined) {
|
|
371
381
|
this._broadcastToPort(portIndex, msg);
|
|
372
382
|
return true;
|
|
373
383
|
}
|
|
384
|
+
// 竞态兜底:sessionId 还没注册(attachToTarget 响应未到)
|
|
385
|
+
// 但事件已经来了。广播给所有端口池 client,确保不丢。
|
|
386
|
+
// 对齐直连 Chrome——所有 session 事件都广播给所有连接。
|
|
387
|
+
for (let pi = 0; pi < this.portSessions.length; pi++) {
|
|
388
|
+
if (this.portSessions[pi]) {
|
|
389
|
+
this._broadcastToPort(pi, msg);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return true;
|
|
374
393
|
}
|
|
394
|
+
|
|
395
|
+
// 兜底:有 method 但没有 targetId 也没有 sessionId 的事件
|
|
396
|
+
// 也广播,确保不丢(如 Target.targetDestroyed 等)
|
|
397
|
+
for (let pi = 0; pi < this.portSessions.length; pi++) {
|
|
398
|
+
if (this.portSessions[pi]) {
|
|
399
|
+
this._broadcastToPort(pi, msg);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return true;
|
|
375
403
|
}
|
|
376
404
|
|
|
377
405
|
return false; // 不是端口池的消息
|