新闻详情

新闻详情

首页 / 资讯中心 / 详情

Puppeteer CDPEvents 类型详解:puppeteer 原始 CDP 事件订阅的类型基础

发布时间:2026/9/7 5:18:05来源:尧图网络
Puppeteer CDPEvents 类型详解:puppeteer 原始 CDP 事件订阅的类型基础
Puppeteer CDPEvents 类型详解puppeteer 原始 CDP 事件订阅的类型基础【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer本文以 puppeteer.cdpevents.md 中定义的CDPEvents类型为核心讲清它是如何用 TypeScript 映射类型从 DevTools Protocol 派生出类型安全的 CDP 事件表以及它在 puppeteer 源码中如何贯穿Connection消息分发、CdpCDPSession事件发射和 BiDi 桥接层使page.createCDPSession()拿到的客户端能够对任意 CDP 事件做带类型提示的订阅。读完本文你可以理解 puppeteer 底层事件总线的类型契约并能在自己的自动化脚本中正确订阅 CDP 原始事件。类型签名完整定义关联文档给出的CDPEvents完整定义如下export type CDPEvents { [ Property in keyof ProtocolMapping.Events ]: ProtocolMapping.Events[Property][0]; };该类型在仓库中的实际源码位置是 CDPSession.ts标记为public属于 puppeteer 对外 API 的一部分。它本身不承载任何运行时逻辑而是一个纯粹的事件名到参数类型的映射类型是 CDPSessionEvents 接口和整个 CDP 会话事件体系的根基。映射类型如何从 DevTools Protocol 派生要理解这个类型关键是ProtocolMapping的来源。在 CDPSession.ts 中可以看到它直接来自devtools-protocol包的protocol-mapping.js类型模块import type {ProtocolMapping} from devtools-protocol/types/protocol-mapping.js;devtools-protocol是 Chrome DevTools ProtocolCDP的协议描述包其中ProtocolMapping.Events记录了 CDP 协议定义的全部事件每个键是一个事件方法名如Network.requestWillBeSent、Runtime.consoleAPICalled、Page.domContentEventFired对应的值是一个参数元组元组的第一个元素[0]即该事件的params类型。CDPEvents使用的正是 TypeScript 的映射类型mapped type语法Property in keyof ProtocolMapping.Events遍历协议中声明的每一个事件名ProtocolMapping.Events[Property][0]将每个事件名映射到其参数的第一个也就是params类型。由此得到一张事件名 → 事件参数的类型表。它带来两个实际收益事件名受类型约束。当你在CDPSession继承自EventEmitterCDPSessionEvents上调用client.on(Network.requestWillBeSent, handler)时事件名字符串拼写错误、或回调参数解构错误都会在编译期暴露而不是等到运行期才发现事件与协议单一来源。事件表完全派生自devtools-protocolpuppeteer 无需手写事件清单协议升级后类型自动跟随。事件表如何接入 puppeteer 的事件系统CDPEvents并不是孤立使用的它被合入了CDPSessionEvents接口见 CDPSession.tsexport interface CDPSessionEvents extends CDPEvents, RecordEventType, unknown { /** internal */ [CDPSessionEvent.Disconnected]: undefined; /** internal */ [CDPSessionEvent.Swapped]: CDPSession; /** internal */ [CDPSessionEvent.Ready]: CDPSession; [CDPSessionEvent.SessionAttached]: CDPSession; [CDPSessionEvent.SessionDetached]: CDPSession; }这里有两个值得注意的设计点extends CDPEvents把全部 CDP 协议事件混入会话可监听的事件集extends RecordEventType, unknown则额外允许使用通配事件名*这在 CommonEventEmitter 的语义中表示监听所有事件测试代码里就有client.on(*, name {...})的用法。在此之上CDPSession抽象类通过泛型参数把事件表绑定到事件发射器上export abstract class CDPSession extends EventEmitterCDPSessionEvents {因此CDPSession实例的on/off/once方法都具备完整的类型推断。同一文件中的CDPSessionEvent命名空间还定义了四个内部/公共符号事件Disconnected、Swapped、Readyauto-attach 流程中就绪、sessionattached与sessiondetached子会话挂接/断开。运行时事件流从 WebSocket 消息到emit类型表解决监听什么而事件真正从浏览器到达用户回调的路径在源码中分为两级分发。第一级Connection 的消息路由Connection.ts 的onMessage方法接收 WebSocket 上的原始 JSON 文本解析后按消息形态三路分发会话级消息带sessionId查表找到对应CdpCDPSession交给session.onMessage(object)命令响应带id但无sessionId通过CallbackRegistry兑现此前send发出的 Promise浏览器级事件既无id也无sessionId直接this.emit(object.method, object.params)即以 CDP 事件名为事件名、params为参数发射。此外它还负责会话生命周期收到Target.attachedToTarget时创建新的CdpCDPSession并派发SessionAttached事件收到Target.detachedFromTarget时清理会话并派发SessionDetached。第二级CdpCDPSession 的发射CdpSession.ts 的onMessage是类型表真正落地的地方其参数类型直接以CDPEvents标注onMessage(object: { id?: number; method: keyof CDPEvents; params: CDPEvents[keyof CDPEvents]; ... }): void { if (object.id) { // 有 id协议错误 reject 回调 / 有 result 则 resolve 回调 } else { assert(!object.id); this.emit(object.method, object.params); } }没有id的消息就是事件object.method必然是keyof CDPEvents于是emit出来的事件名与参数类型都受CDPEvents约束。有id的消息则是命令响应由#callbacksCallbackRegistry兑现或拒绝——这解释了为什么send是异步返回PromiseProtocolMapping.Commands[T][returnType]的同样享受协议级类型推断。实战用法与测试印证CDPSession 文档中的官方示例完整展示了CDPEvents类型支撑下的标准用法const client await page.createCDPSession(); await client.send(Animation.enable); client.on(Animation.animationCreated, () console.log(Animation created!), ); const response await client.send(Animation.getPlaybackRate); console.log(playback rate is response.playbackRate); await client.send(Animation.setPlaybackRate, { playbackRate: response.playbackRate / 2, });两个要点必须先启用对应域。CDP 事件只在相应域enable之后才会推送示例中的Animation.enable正是为Animation.animationCreated事件打开开关事件名是Domain.method全名。这与映射类型的键一一对应任何非法事件名都会被类型系统拦截。仓库测试 CDPSession.test.ts 用两个用例印证了上述行为should send eventsclient.send(Network.enable)后订阅client.on(Network.requestWillBeSent, ...)页面跳转时收到且仅收到 1 个事件should not send extra events用client.on(*, ...)通配监听断言跳转过程中只会收到Network域的事件证明会话事件流是精准分发的不会混入其他域的噪声事件。延伸BiDi 桥接层对 CDPEvents 的复用CDPEvents的复用不止于 CDP 直连场景。在 BidiOverCdp.ts 中CDPClientAdapter类直接以它作为事件泛型参数class CDPClientAdapterT extends CDPSession | CdpConnection extends BidiMapper.EventEmitterCDPEvents implements BidiMapper.CdpClient它通过#forwardMessage把底层 CDP 会话的事件原样转发给 chromium-bidi 的 mapper。从源码结构看在 WebDriver BiDi 模式下puppeteer 同样依赖CDPEvents这张事件表在 BiDi 协议与 CDP 协议之间做事件桥接这保证了两种驱动路径下事件类型语义的一致性。小结CDPEvents是一张由devtools-protocol的ProtocolMapping.Events派生的映射类型键为 CDP 事件全名值为事件参数类型源码定义它与会话级事件共同组成CDPSessionEvents并作为CDPSession extends EventEmitterCDPSessionEvents的泛型参数为page.createCDPSession()返回的客户端提供类型安全的事件订阅能力运行时Connection.onMessage 按sessionId/id路由消息CdpCDPSession.onMessage 最终以this.emit(method, params)把事件派发给订阅者使用时的核心前提是先send(Domain.enable)启用相应域否则收不到对应事件测试用例 should send events 与 should not send extra events 验证了该行为与事件的精准分发该类型还被 BiDi 桥接层 BidiOverCdp.ts 复用用于 CDP 到 BiDi 的事件转发。如需进一步阅读可参考同目录下的 CDPSession、CDPSessionEvents 以及 Connection.send 等 API 文档。【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CD74HC4067实现16路ADC扩展:从硬件连接到采样坑的排查全记录 2026/9/7 6:03:11

CD74HC4067实现16路ADC扩展:从硬件连接到采样坑的排查全记录

做多路模拟量采集的时候,最烦的就是单片机自带ADC通道不够用。我这次需要同时读16路电压信号,板子上用的主控ADC引脚只有那么几个,于是选了CD74HC4067来做16路ADC扩展。这颗芯片是模拟多路复用器,通过4根地址线就能把一路ADC扩展成…

阅读更多 →
Headroom TypeScript SDK 全解:通过代理压缩 LLM 上下文,无缝接入 Vercel AI、OpenAI 与 Anthropic SDK 2026/9/7 6:03:11

Headroom TypeScript SDK 全解:通过代理压缩 LLM 上下文,无缝接入 Vercel AI、OpenAI 与 Anthropic SDK

Headroom TypeScript SDK 全解:通过代理压缩 LLM 上下文,无缝接入 Vercel AI、OpenAI 与 Anthropic SDK 【免费下载链接】headroom Compress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents…

阅读更多 →
Fan Control 风扇曲线教程:画一条曲线,10 分钟调出安静风扇 2026/9/7 6:03:11

Fan Control 风扇曲线教程:画一条曲线,10 分钟调出安静风扇

Fan Control 风扇曲线教程:画一条曲线,10 分钟调出安静风扇 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/Gi…

阅读更多 →
3 步装好猫抓插件:网页视频、音频、M3U8 一键保存指南 2026/9/7 6:03:11

3 步装好猫抓插件:网页视频、音频、M3U8 一键保存指南

3 步装好猫抓插件:网页视频、音频、M3U8 一键保存指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓插件(cat-catch&…

阅读更多 →
ODAS开源嵌入式听觉系统:从原理到板级实作全攻略 2026/9/7 6:03:11

ODAS开源嵌入式听觉系统:从原理到板级实作全攻略

简介:ODAS(开放分布式音频系统)是一套专为嵌入式设备设计的开源实时音频处理框架,面向机器人、无人机、自动驾驶及智能硬件开发者,解决资源受限环境下声源定位、音频跟踪、波束形成与声音分离等复杂听觉问题。随包共33…

阅读更多 →
AI视频工具新版实操:从单剧本生成到批量生产的完整工作流 2026/9/7 6:00:11

AI视频工具新版实操:从单剧本生成到批量生产的完整工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞