cdp-tunnel 3.2.7 → 3.3.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/package.json
CHANGED
|
@@ -204,57 +204,38 @@ class PortPoolManager {
|
|
|
204
204
|
const SYNTHETIC_INPUT = ['Input.dispatchKeyEvent', 'Input.dispatchMouseEvent'];
|
|
205
205
|
|
|
206
206
|
// 消息处理:client → plugin(带 portIndex 标记)
|
|
207
|
-
|
|
208
|
-
const handleMessage = async (data) => {
|
|
207
|
+
ws.on('message', async (data) => {
|
|
209
208
|
let msg;
|
|
210
209
|
try { msg = JSON.parse(data.toString()); } catch { return; }
|
|
211
210
|
|
|
212
211
|
if (msg.id !== undefined) {
|
|
213
|
-
// createTarget
|
|
214
|
-
if (msg.method === 'Target.createTarget'
|
|
215
|
-
await session.
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
// attachToTarget:已 attach 的 target 返回虚拟 session
|
|
219
|
-
if (msg.method === 'Target.attachToTarget' && msg.params && msg.params.targetId) {
|
|
220
|
-
const targetId = msg.params.targetId;
|
|
221
|
-
if (session.attachedTargets && session.attachedTargets.has(targetId)) {
|
|
222
|
-
const vsid = `vs_${session.portIndex}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
223
|
-
session.virtualSessions.set(vsid, targetId);
|
|
224
|
-
this.sessionToPort.set(vsid, session.portIndex);
|
|
225
|
-
ws.send(JSON.stringify({ id: msg.id, result: { sessionId: vsid } }));
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
if (!session.attachedTargets) session.attachedTargets = new Set();
|
|
229
|
-
session.attachedTargets.add(targetId);
|
|
212
|
+
// createTarget 串行化(避免并发 chrome.tabs.create 回调串)
|
|
213
|
+
if (msg.method === 'Target.createTarget') {
|
|
214
|
+
while (session.createTargetLock) { await session.createTargetLock; }
|
|
215
|
+
session.createTargetLock = new Promise(r => { session._releaseCreateTarget = r; });
|
|
230
216
|
}
|
|
231
217
|
|
|
218
|
+
// 合成输入命令:先 bringToFront + 等待,再发原命令
|
|
232
219
|
if (SYNTHETIC_INPUT.indexOf(msg.method) >= 0 && msg.sessionId) {
|
|
233
220
|
await this._ensureVisible(session, pluginWs, msg.sessionId);
|
|
234
221
|
}
|
|
235
222
|
|
|
236
|
-
//
|
|
237
|
-
if (msg.method === 'Target.createTarget') {
|
|
238
|
-
let release;
|
|
239
|
-
session.createTargetChain = new Promise(r => { release = r; });
|
|
240
|
-
session._releaseCT = release;
|
|
241
|
-
}
|
|
242
|
-
|
|
223
|
+
// 命令:分配新 id,记录映射(含 method 名供响应后处理),转发给 plugin
|
|
243
224
|
const newId = `pool${session.portIndex}_${msg.id}`;
|
|
244
225
|
session.pendingRequests.set(newId, {
|
|
245
|
-
originalId: msg.id,
|
|
246
|
-
|
|
226
|
+
originalId: msg.id,
|
|
227
|
+
method: msg.method,
|
|
228
|
+
clientWs: ws,
|
|
229
|
+
params: msg.params,
|
|
230
|
+
sessionId: msg.sessionId
|
|
247
231
|
});
|
|
232
|
+
|
|
248
233
|
const forwarded = { ...msg, id: newId, __portIndex: session.portIndex, __clientId: `pool_${session.port}` };
|
|
249
234
|
pluginWs.send(JSON.stringify(forwarded));
|
|
250
235
|
} else {
|
|
236
|
+
// 无 id 的消息(事件),直接转发
|
|
251
237
|
pluginWs.send(JSON.stringify({ ...msg, __portIndex: session.portIndex }));
|
|
252
238
|
}
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
ws.on('message', (data) => {
|
|
256
|
-
if (!session.cmdQueue) session.cmdQueue = Promise.resolve();
|
|
257
|
-
session.cmdQueue = session.cmdQueue.then(() => handleMessage(data)).catch(() => {});
|
|
258
239
|
});
|
|
259
240
|
|
|
260
241
|
ws.on('close', () => {
|
|
@@ -292,18 +273,18 @@ class PortPoolManager {
|
|
|
292
273
|
const pending = session.pendingRequests.get(msg.id);
|
|
293
274
|
session.pendingRequests.delete(msg.id);
|
|
294
275
|
|
|
295
|
-
// 如果是 createTarget 响应,记录 targetId +
|
|
276
|
+
// 如果是 createTarget 响应,记录 targetId → portIndex 归属 + 初始 url + 释放锁
|
|
296
277
|
if (msg.result && msg.result.targetId) {
|
|
297
278
|
const tid = msg.result.targetId;
|
|
298
279
|
session.targetIds.add(tid);
|
|
299
280
|
session.targetUrls.set(tid, pending?.params?.url || 'about:blank');
|
|
300
281
|
this.targetToPort.set(tid, portIndex);
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
282
|
+
// 释放 createTarget 锁
|
|
283
|
+
if (session._releaseCreateTarget) {
|
|
284
|
+
session._releaseCreateTarget();
|
|
285
|
+
session._releaseCreateTarget = null;
|
|
286
|
+
session.createTargetLock = null;
|
|
287
|
+
}
|
|
307
288
|
}
|
|
308
289
|
|
|
309
290
|
// 如果是 Page.navigate 响应,更新 targetId 的 url
|