| 331 | } |
| 332 | |
| 333 | class CdpClient { |
| 334 | constructor(webSocketUrl) { |
| 335 | this.webSocketUrl = webSocketUrl |
| 336 | this.nextId = 1 |
| 337 | this.pending = new Map() |
| 338 | this.listeners = new Map() |
| 339 | } |
| 340 | |
| 341 | connect() { |
| 342 | return new Promise((resolvePromise, rejectPromise) => { |
| 343 | this.socket = new WebSocket(this.webSocketUrl) |
| 344 | this.socket.on('open', resolvePromise) |
| 345 | this.socket.on('error', rejectPromise) |
| 346 | this.socket.on('message', (raw) => { |
| 347 | const message = JSON.parse(String(raw)) |
| 348 | if (message.id && this.pending.has(message.id)) { |
| 349 | const { resolve: resolvePending, reject } = this.pending.get(message.id) |
| 350 | this.pending.delete(message.id) |
| 351 | if (message.error) reject(new Error(message.error.message)) |
| 352 | else resolvePending(message.result ?? {}) |
| 353 | return |
| 354 | } |
| 355 | if (message.method) { |
| 356 | const listeners = this.listeners.get(message.method) ?? [] |
| 357 | for (const listener of listeners) listener(message.params ?? {}) |
| 358 | } |
| 359 | }) |
| 360 | }) |
| 361 | } |
| 362 | |
| 363 | send(method, params = {}) { |
| 364 | const id = this.nextId |
| 365 | this.nextId += 1 |
| 366 | return new Promise((resolvePromise, rejectPromise) => { |
| 367 | this.pending.set(id, { resolve: resolvePromise, reject: rejectPromise }) |
| 368 | this.socket.send(JSON.stringify({ id, method, params })) |
| 369 | }) |
| 370 | } |
| 371 | |
| 372 | on(method, listener) { |
| 373 | const listeners = this.listeners.get(method) ?? [] |
| 374 | listeners.push(listener) |
| 375 | this.listeners.set(method, listeners) |
| 376 | } |
| 377 | |
| 378 | waitFor(method, timeoutMs = 10000) { |
| 379 | return new Promise((resolvePromise, rejectPromise) => { |
| 380 | const timer = setTimeout(() => { |
| 381 | rejectPromise(new Error(`Timed out waiting for CDP event ${method}`)) |
| 382 | }, timeoutMs) |
| 383 | this.on(method, (params) => { |
| 384 | clearTimeout(timer) |
| 385 | resolvePromise(params) |
| 386 | }) |
| 387 | }) |
| 388 | } |
| 389 | |
| 390 | close() { |
nothing calls this directly
no outgoing calls
no test coverage detected