兼容性标志解析Cloudflare Workers WebSocket 关闭原因字节上限websocket_close_reason_byte_limit【免费下载链接】cloudflare-docsCloudflare’s documentation项目地址: https://gitcode.com/GitHub_Trending/cl/cloudflare-docs导读websocket_close_reason_byte_limit是 Cloudflare Workers 运行时新增的一枚兼容性标志compatibility flag开启后WebSocket.close()传入的reason字符串在按 UTF-8 编码后如果超过 123 字节将抛出SyntaxError类型的DOMException从而与 WHATWG WebSocket 规范及 RFC 6455 的要求对齐。本文以 Cloudflare 官方文档仓库中的 标志定义文件 为骨架结合仓库内 Workers 兼容性标志的配置机制、WebSocket 运行时 API 文档与标志数据 Schema完整讲解该标志的触发规则、启用/停用方式、与相邻 WebSocket 行为的联动以及迁移时的注意事项。一、该标志是什么为 close reason 加上 123 字节硬上限在 Cloudflare Workers 中开发者在关闭 WebSocket 连接时可以调用close()并传入关闭码与关闭原因。历史上Workers 运行时会无条件接受任意长度的关闭原因字符串不做任何校验。而websocket_close_reason_byte_limit这一兼容性标志改变了这一行为。根据仓库中 websocket-close-reason-byte-limit.md 的定义Whenwebsocket_close_reason_byte_limitis enabled,WebSocket.close()throws aSyntaxErrorDOMExceptionif thereasonstring exceeds 123 bytes when UTF-8 encoded, as required by the WHATWG WebSocket spec and RFC 6455 Section 5.5.即标志生效后当reason字符串按 UTF-8 编码后的字节数超过 123 时close()会抛出SyntaxError类型的DOMException。这一约束源自 WHATWG WebSocket 规范与 RFC 6455 第 5.5 节对 Close 帧中应用数据关闭原因长度的限定。标志元数据与生效日期该标志在仓库中的定义文件头部携带了完整的 frontmatter 元数据name: Enforce WebSocket close reason byte limit sort_date: 2026-03-03 enable_date: 2026-03-03 enable_flag: websocket_close_reason_byte_limit disable_flag: no_websocket_close_reason_byte_limitenable_date2026-03-03从该兼容性日期起标志默认启用enable_flagwebsocket_close_reason_byte_limit主动开启该行为的标志名disable_flagno_websocket_close_reason_byte_limit用于显式关闭该行为的反向标志名。仓库中 compatibility-flags.ts 的 Schema 定义了这些字段的契约name、enable_date、enable_flag、disable_flag、sort_date以及可选的experimental。也就是说src/content/compatibility-flags/目录下的每一份标志文档都是严格按照该 Schema 生成与校验的字段缺失或类型错误都会被 Astro 内容集合校验拦截。为什么是 123 字节123 字节不是随意挑选的数字。RFC 6455 第 5.5.1 节规定Close 控制帧的载荷最多承载 125 字节的应用数据其中前 2 字节用于存放状态码status code因此留给关闭原因的额度恰好是 125 − 2 123 字节。WHATWG WebSocket 规范即浏览器中WebSocketAPI 的标准定义也据此规定当reason经过 UTF-8 编码后超过 123 字节时close()必须抛出SyntaxError。Workers 启用该标志后其运行时行为与浏览器、Node.js 等标准实现保持一致消除了此前原因字符串无长度约束的规范偏离。需要特别强调123 字节 ≠ 123 个字符。该上限按 UTF-8 编码后的字节数计算不同字符占用不同字节数字符类型UTF-8 字节数123 字节大约可容纳ASCII 字符英文字母、数字、常见符号1 字节约 123 个字符拉丁语系扩展字符2 字节约 61 个字符中日韩CJK汉字3 字节约 41 个字符Emoji 等辅助平面字符4 字节约 30 个字符因此一段包含大量中文或 emoji 的关闭原因可能看起来很短但实际字节数早已超标。迁移时建议按字节数而非字符数预估。二、close()的调用形态与抛出场景WebSocket.close()在 Workers 运行时 API 中定义于 websockets.mdxclose(codenumber, reasonstring)code可选整数由服务器发送的关闭码应匹配 WebSocket 规范提供的状态码列表reason可选字符串一段可读的文本说明连接被关闭的原因。在本标志启用后仅当reason存在且其 UTF-8 编码字节数 123时close()才会抛出SyntaxErrorDOMException。也就是说ws.close(1000)不传reason不触发校验正常关闭ws.close(1000, done)done编码后仅 4 字节安全ws.close(1000, veryLongReason)一旦超限调用立即抛出SyntaxError。由于close()抛出的是同步DOMException未捕获时会导致当前事件处理函数终止进而可能使连接停留在非正常关闭状态因此在拼接关闭原因时需要显式做字节长度检查见下文迁移与规避策略。相关 Close 行为的联动同一个运行时内还有若干与 Close 帧相关的行为理解它们有助于排查问题服务器主动关闭的自动应答web_socket_auto_reply_to_close标志默认在2026-04-07起的兼容性日期生效使运行时收到对端 Close 帧后自动回发 Close 帧并将readyState置为CLOSED详见 web-socket-auto-reply-to-close.md 与 websockets.mdx。若你此前依赖收到 Close 帧后手动调用close()的旧行为需要在accept()时传入{ allowHalfOpen: true }。消息体大小上限Workers 中 WebSocket 单条消息上限为 32 MiB33,554,432 字节超出时连接会被自动以1009Message is too large关闭见 websockets.mdx。二进制帧投递方式websocket_standard_binary_type标志控制binaryType默认值是blob还是arraybuffer见 websocket-standard-binary-type.md。上述标志互相独立但都体现了 Workers 运行时不断向 Web 标准收敛的整体方向本标志收敛的是 Close 帧载荷长度web_socket_auto_reply_to_close收敛的是关闭握手的交互模型。三、如何在 Worker 中启用或停用该标志Cloudflare Workers 通过兼容性日期 兼容性标志两级机制控制运行时行为整体说明见 compatibility-flags.mdx。1. 跟随兼容性日期默认方式兼容性标志通常有一个默认生效日期。指定compatibility_date后Workers 会一次性启用截至该日期的全部兼容性变更包括本标志{ // 在 2026-03-03 及以后的兼容性日期下 // websocket_close_reason_byte_limit 默认启用。 compatibility_date: 2026-03-03 }由于该标志的enable_date为2026-03-03只要你的compatibility_date大于或等于该日期close()的 123 字节校验即自动生效无需显式列出标志名。2. 通过 Wrangler 配置显式控制如果你的代码在短期内有合法的超长关闭原因需求、尚未完成迁移可以在 Wrangler 配置文件wrangler.jsonc/wrangler.toml中使用反向标志关闭该校验{ compatibility_date: 2026-03-03, compatibility_flags: [ no_websocket_close_reason_byte_limit ] }同理如果你希望提前在较旧的兼容性日期下获得标准校验行为可以显式加入正向标志{ compatibility_date: 2025-06-01, compatibility_flags: [ websocket_close_reason_byte_limit ] }提示compatibility_flags不仅能提前启用未默认生效的变更也能回退那些已经成为默认的历史变更这正是本仓库中每个标志文档同时给出enable_flag与disable_flag的原因。3. 通过 Cloudflare Dashboard 与 API 配置Dashboard在 Cloudflare 控制台的 Workers 设置Workers settings中更新兼容性标志API通过 Workers Script API 或 Workers Versions API 上传 Worker 时在请求体metadata字段中携带compatibility_flags数组。以上三种配置途径由 compatibility-flags.mdx 统一描述本标志与其他标志的配置方式完全一致。四、迁移与规避策略实战要点在升级compatibility_date到2026-03-03之前请先扫描代码中所有调用close(code, reason)的地方并考虑以下几点按字节裁剪原因在调用close()前将reason编码为 UTF-8 字节并截断到 123 字节以内。可借助TextEncoder实现function truncateReason(reason, maxBytes 123) { const encoder new TextEncoder(); const bytes encoder.encode(reason); if (bytes.length maxBytes) { return reason; } // 逐字节截断并按 UTF-8 边界回退避免切出半个字符。 const decoder new TextDecoder(utf-8, { fatal: false }); return decoder.decode(bytes.subarray(0, maxBytes)); } ws.close(1000, truncateReason(connection closed because details));注意按字节subarray截断可能在多字节字符中间切断TextDecoder默认会以替换符UFFFD补齐必要时需自行做边界回退。改用语义化短原因关闭原因本质上是给人看的一句话规范的取值建议保持在 123 字节内。超长文本应放入业务日志或应用层消息而不是塞进 Close 帧。捕获SyntaxError如果无法保证原因长度可显式捕获try { ws.close(4000, longReason); } catch (e) { if (e instanceof DOMException e.name SyntaxError) { ws.close(4000, reason too long); } else { throw e; } }临时回退若因历史原因需要争取迁移时间可在 Wrangler 配置中加入no_websocket_close_reason_byte_limit保持旧行为但应把移除该反向标志列入技术债清单。联动检查确认你使用的code属于规范允许的关闭码集合1000以及 3000–4999 之间的私有/自定义码。close()的参数合法性校验码值合法性 原因字节上限在同一处入口完成升级日期后两个维度都应纳入回归测试。五、如何在本地验证该行为Workers 开发工具链Wrangler、Miniflare、Vitest 插件会读取同一份兼容性配置。你可以用以下方式在本地快速验证在wrangler.jsonc中设置compatibility_date: 2026-03-03或显式加入websocket_close_reason_byte_limit编写一个使用new WebSocketPair()的服务端处理器在close事件回调或业务逻辑中调用server.close(1000, longReason)观察调用是否抛出SyntaxErrorDOMExceptionreadyState是否正常进入CLOSED将compatibility_flags改为[no_websocket_close_reason_byte_limit]后再跑一次确认旧行为超长原因被接受恢复。注意开启web_socket_auto_reply_to_close2026-04-07起的兼容性日期默认启用后close事件触发时readyState已是CLOSED在处理器内再调用close()会被静默忽略不要依赖该调用来补刀关闭详见 web-socket-auto-reply-to-close.md。六、参考文件速览本文章所依据的仓库文件及用途如下方便你深入阅读文件作用src/content/compatibility-flags/websocket-close-reason-byte-limit.md本标志的官方定义正文主体src/content/docs/workers/configuration/compatibility-flags.mdx兼容性标志的通用配置方式Wrangler / Dashboard / APIsrc/content/docs/workers/runtime-apis/websockets.mdxWebSocket.close(code, reason)的签名与参数说明src/schemas/compatibility-flags.ts标志文档 frontmatter 的数据 Schemasrc/content/compatibility-flags/web-socket-auto-reply-to-close.md相邻的 Close 自动应答标志关闭握手行为src/content/compatibility-flags/websocket-standard-binary-type.md相邻的二进制帧投递方式标志结语websocket_close_reason_byte_limit是 Workers 向 Web 标准看齐的又一次收敛将close()的关闭原因约束在 RFC 6455 / WHATWG 规范规定的 123 字节UTF-8以内并用兼容性标志机制保证既有用户的平滑过渡。理解它的触发边界字节而非字符、默认生效日期2026-03-03、反向标志no_websocket_close_reason_byte_limit以及它与web_socket_auto_reply_to_close等相邻行为的配合是在升级兼容性日期前完成无痛迁移的关键。【免费下载链接】cloudflare-docsCloudflare’s documentation项目地址: https://gitcode.com/GitHub_Trending/cl/cloudflare-docs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考