Effect 平台 Deno 套接字服务端升级:统一 node-shared 实现、新增 reader 级 TLS 升级支持与迁移指南

发布时间:2026/9/14 23:01:07

Effect 平台 Deno 套接字服务端升级:统一 node-shared 实现、新增 reader 级 TLS 升级支持与迁移指南 Effect 平台 Deno 套接字服务端升级统一 node-shared 实现、新增 reader 级 TLS 升级支持与迁移指南【免费下载链接】effectBuild production-ready applications in TypeScript项目地址: https://gitcode.com/GitHub_Trending/ef/effect导读本篇基于 Effect 生态仓库中的变更说明changeset文件讲解effect/platform-deno在最新迭代中对DenoSocketServer的底层实现调整它不再使用 Deno 原生实现而是复用effect/platform-node-shared的 Node 套接字服务端从而让被接受的 TCP 连接支持以 reader 作用域reader-scoped为粒度的服务端 TLS 升级。你将掌握新的make/layer参数形态host替代hostname、{ path }替代{ transport: unix, path }、Deno 版本要求2.8.3 及以上以及本次变更在源码层面的实现原理与实测用例验证。一、变更概览一次针对 Deno 套接字服务端的底层重构该变更说明.changeset/pre/eff-972-deno-socket-server.md同时涉及两个包均以patch级别发布包名变更级别说明effect/platform-denopatch套接字服务端实现切换到 node-shared 版本effect/platform-node-sharedpatch底层能力被 Deno 平台复用并承载 reader 作用域的 TLS 升级逻辑核心结论一句话Deno 平台现在使用 node-shared 的套接字服务端因此被接受的 TCP 连接能够支持以 reader 作用域为单位的服务端 TLS 升级即先以明文 TCP 接受连接、在读取阶段按需升级为 TLS 的 STARTTLS 式能力。从源码结构可以直接看到这一结论Deno 平台的套接字服务端模块 packages/platform/deno/src/DenoSocketServer.ts 全文只有一行导出语句export * from effect/platform-node-shared/NodeSocketServer也就是说DenoSocketServer现在等价于 node-shared 的NodeSocketServer命名空间其make、layer、makeTls、layerTls、makeWebSocket、layerWebSocket等构造器与 Layer 全部来自后者。包级入口 packages/platform/deno/src/index.ts 中DenoSocketServer子模块的导出保持不变export * as DenoSocketServer from ./DenoSocketServer.ts因此对外 API 命名不受影响。二、为什么这样做reader 作用域的 TLS 升级2.1 变更动机变更说明原文明确指出动机Use the node-shared socket server on Deno so accepted TCP connections support reader-scoped server TLS upgrades.即让 Deno 上被接受accepted的 TCP 连接具备 reader 作用域的服务端 TLS 升级能力。从源码实现看这一能力由Socket.Reader上的upgrade操作承载。在 packages/platform/node-shared/src/NodeSocket.ts 的fromDuplex中reader返回{ pull, upgrade }两个成员其中upgrade允许在读取阶段将底层连接升级为 TLS服务端场景tlsServer: true下fromDuplex使用secure事件作为升级完成标志客户端场景使用secureConnect参见 NodeSocket.ts 的const secureEvent isServer ? secure : secureConnect服务端升级要求同时提供key与cert否则以SocketUpgradeError失败升级完成后会通过Tls.TLSSocket包装原始连接并继续透传读写参见 NodeSocket.ts 的upgrade实现。这正是“reader 作用域”的含义升级动作不是发生在接受连接时而是在 handler 获取 reader 之后、按需触发每次连接的升级状态upgradeAvailable也由 reader 的 scope 生命周期管理scope 结束即失效。2.2 升级语义细节Node 实现在 NodeSocket.ts 中升级前会做参数校验服务端场景必须同时提供key与cert否则报错 server TLS upgrade requires both key and cert客户端场景同样要求key与cert成对出现可选参数包括ca、passphrase、alpnProtocols、requestCert、rejectUnauthorized其中key与passphrase使用Redacted类型承载避免密钥以明文形式直接暴露。值得注意的是Deno 平台的客户端升级走的是Deno.startTls见 DenoSocket.ts 的fromConn它不支持客户端证书因此key、cert、passphrase、requestCert在 Deno 客户端升级中不生效且rejectUnauthorized: false仅关闭主机名校验、证书链校验仍然生效。本次变更解决的是服务端一侧让 Deno 服务端通过 node-shared 实现获得完整的、与 Node 一致的服务端 TLS 升级能力。三、Breaking Changes 与迁移指南变更说明列出的破坏性变更集中于DenoSocketServer.make与DenoSocketServer.layer的参数形态以及运行时版本要求。下面逐一给出新旧对比与迁移方法。3.1 TCP 监听hostname→host变更前Deno 原生参数DenoSocketServer.make({ hostname: 127.0.0.1, port: 8080 })变更后Node listen 选项即node:net的Net.ServerOpts Net.ListenOptionsDenoSocketServer.make({ host: 127.0.0.1, port: 8080 })layer的用法同步变化DenoSocketServer.layer({ host: 127.0.0.1, port: 8080 })从源码看make与layer的类型签名已切换为options: Net.ServerOpts Net.ListenOptionsNodeSocketServer.ts这正是 Nodenet.Server.listen的选项集合因此支持host、port、backlog、exclusive、ipv6Only、reusePort等 Node 标准监听选项。3.2 Unix 套接字{ transport: unix, path }→{ path }变更前DenoSocketServer.make({ transport: unix, path: /tmp/echo.sock })变更后DenoSocketServer.make({ path: /tmp/echo.sock })layer同理DenoSocketServer.layer({ path: /tmp/echo.sock })在 node-shared 实现中服务端监听后会把绑定的地址归一化为NetAddress.SocketAddress字符串形式的server.address()映射为UnixPathAddressAddressInfo对象映射为InetAddressV4/InetAddressV6见 NodeSocketServer.ts 的socketAddressFromNode。因此你可以通过server.address拿到标准化的NetAddress结果测试中即以此断言地址类型与端口。3.3 运行时要求Deno 2.8.3 及以上变更说明明确Deno 2.8.3 或更新版本为必需条件。原因是 node-shared 套接字服务端依赖 Deno 的node:net/node:tls兼容层。源码中对此有专门适配NodeSocketServer.ts 通过const isDeno Deno in globalThis检测运行环境在 Deno 下不显式调用conn.pause()因为 Deno 的node:net兼容层在显式 pause 之后会破坏readable事件分发见 NodeSocketServer.ts 与 NodeSocket.ts 的注释说明。这意味着升级到该版本前请确认部署环境的 Deno 版本不低于 2.8.3否则可能出现兼容层行为异常。四、源码级解析node-shared 服务端如何工作理解本次变更建议通读 packages/platform/node-shared/src/NodeSocketServer.ts。该模块把node:net的 TCP/Unix 服务端、node:tls的 TLS 服务端以及ws的 WebSocket 服务端统一封装为 scoped 的SocketServer.SocketServer服务核心是内部函数makeNetServerNodeSocketServer.ts创建并监听createServer()创建底层 server随后server.listen(listenOptions)并通过DeferredraceFirst将监听错误如端口占用转化为SocketServerError挂起连接在run被调用之前所有到达的连接被记录在pendingMap 中并保持暂停避免数据丢失按需接管run(handler)被调用时把之前的 pending 连接逐一交给新的onConnection回调用Fiber.runIn(scope)将每个连接的 handler 织入独立 Fiber并在 handler 结束时关闭 scope作用域清理服务端作为Effect.acquireRelease资源scope 结束时销毁所有 pending 连接并关闭底层 serverNodeSocketServer.ts。每个被接受的连接会通过NodeSocket.fromDuplex(..., { tlsServer: true })包装为Socket.Socket同时以Context提供NodeSocket.NetSocket服务标签让 handler 能访问底层 Nodenet.SocketNodeSocketServer.ts。TLS 服务端则使用makeTls/layerTls监听secureConnection事件握手失败的连接被直接销毁、服务端继续监听NodeSocketServer.ts。五、迁移后的正确用法附测试用例佐证仓库测试 packages/platform/deno/test/DenoSocketServer.test.ts 完整演示了迁移后的 API 形态可直接作为迁移参考。5.1 TCP echo 服务端import * as DenoSocketServer from effect/platform-deno/DenoSocketServer const server yield* DenoSocketServer.make({ host: 127.0.0.1, port: 0 }) const address server.address // address._tag InetAddressV4 yield* server.run(echo).pipe(Effect.forkScoped)注意port: 0表示由系统分配空闲端口实际端口可通过server.address获取测试断言address.port不为 0。客户端连接使用DenoSocket.makeTcp({ hostname, port })注意客户端连接参数仍是hostname只有服务端监听参数改为host两者不要混淆。5.2 Unix 套接字 echo 服务端const server yield* DenoSocketServer.make({ path: /tmp/echo.sock }) // server.address._tag UnixPathAddress yield* server.run(echo).pipe(Effect.forkScoped) // 客户端连接保持原有形态 const socket yield* DenoSocket.makeTcp({ transport: unix, path })5.3 服务端 TLS 升级本次变更的核心能力测试用例 upgrades a plain server connection to TLSDenoSocketServer.test.ts演示了如何在 handler 中对普通 TCP 连接按需升级为 TLSconst server yield* DenoSocketServer.make({ host: 127.0.0.1, port: 0 }) yield* server.run((socket) echo(socket, { cert, key: Redacted.make(key) // 密钥以 Redacted 承载 }) ).pipe(Effect.forkScoped) // 客户端同样在 reader 阶段升级并传入 CA 信任锚 const socket yield* DenoSocket.makeTcp({ hostname, port }) const output yield* sendHelloDeno(socket, { ca: [ca] })其中服务端 handler 的核心逻辑为const { pull, upgrade } yield* socket.reader if (upgradeOptions ! undefined) { yield* upgrade(upgradeOptions) // 读取阶段按需升级 TLS }这正是“reader 作用域的 TLS 升级”服务端以明文 TCP 接受连接handler 在 reader 阶段调用upgrade完成STARTTLS式升级之后读写都走 TLS 通道。测试使用仓库内置的测试证书packages/platform/deno/test/fixtures/tls/ 下的ca.pem、cert.pem、key.pem断言升级后仍能正确完成 echo 往返。5.4 资源关闭语义测试 closes with a pending pre-run connectionDenoSocketServer.test.ts验证了在run尚未被调用时关闭服务端 scope挂起的连接也会被正确清理且关闭过程在 1 秒内完成。这印证了makeNetServer中 finalizer 对 pending 连接的销毁逻辑。六、真实使用场景Effect Cluster 在 Deno 上的套接字服务端该变更并非孤立存在——DenoSocketServer正是 Effect Cluster 在 Deno 平台上的套接字传输底座。packages/platform/deno/src/DenoClusterSocket.ts 中的layerSocketServer直接使用迁移后的DenoSocketServer.layerreturn DenoSocketServer.layer({ host: listenAddress.value.host, port: listenAddress.value.port })其监听地址取自ShardingConfig.runnerListenAddress回退到runnerAddress。这意味着本次参数迁移会同步影响Deno 平台上 Cluster runner 的套接字监听配置——在 Deno 2.8.3 下Cluster 套接字服务端同样获得 reader 作用域 TLS 升级能力为跨节点加密通信例如在不可信网络上运行的 runner 间传输提供了按连接粒度开启 TLS 的手段。七、迁移清单与注意事项升级前请对照以下清单完成迁移升级 Deno 运行时到 2.8.3 或更新版本搜索代码中DenoSocketServer.make/DenoSocketServer.layer的所有调用点将 TCP 监听的hostname参数改为host将 Unix 监听的{ transport: unix, path }对象改为{ path }确认客户端连接 APIDenoSocket.makeTcp参数不变仍为{ hostname, port }或{ transport: unix, path }如需服务端 TLS 升级在 handler 的 reader 阶段调用upgrade({ key, cert })其中key使用Redacted.make包装key与cert必须成对提供若代码中依赖server.address注意其类型已归一化为NetAddress.SocketAddressTCP 为InetAddressV4/InetAddressV6Unix 为UnixPathAddress读取 IP 使用NetAddress.formatIp读取 Unix 路径使用.path回归验证 Cluster 场景如适用layerSocketServer的监听参数已随迁移改变确认ShardingConfig中的监听地址配置与新的host参数语义一致。结语本次effect/platform-deno的 patch 变更通过将DenoSocketServer收敛到effect/platform-node-shared的 Node 实现为 Deno 平台补齐了 reader 作用域的服务端 TLS 升级能力同时带来两处明确的破坏性参数变更与一个版本门槛。源码与测试均已同步更新DenoSocketServer.ts、NodeSocketServer.ts、DenoSocketServer.test.ts按上文清单迁移即可平滑升级并在 Deno 上获得与 Node 一致、按连接粒度可控的 TLS 套接字服务能力。【免费下载链接】effectBuild production-ready applications in TypeScript项目地址: https://gitcode.com/GitHub_Trending/ef/effect创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/14 23:01:07

大数据时代的数据质量管理体系构建与实践

1. 大数据领域数据质量管理体系概述在大数据时代,数据已成为企业最核心的资产之一。随着数据量的爆炸式增长和数据来源的多样化,数据质量问题日益凸显。一个完善的数据质量管理体系能够确保数据的准确性、完整性、一致性和及时性,为企业的决策…

2026/9/14 23:01:07

基于SpringBoot的“安馨乐”宠物医院管理系统的设计与实现

1. 引言随着人们生活水平的不断提高,宠物逐渐成为许多家庭的重要成员。宠物数量的快速增长带动了宠物医疗行业的蓬勃发展,传统的人工管理方式已难以满足宠物医院日常运营中挂号、就诊、药品管理、病历记录等多方面的需求。本文基于SpringBoot框架&#x…

2026/9/14 23:11:13

新机调试必做:个性化Word模板制作指南

新机调试这件事,我一般按“装系统—装基础软件—装Office—做模板”这个顺序来。很多人觉得装完Office就万事大吉,直接双击Word开始写东西,但恰恰是少了做模板这一步,后面大半年里所有文档的排版时间都会翻倍。所谓个性化Word模板…

2026/9/14 23:11:13

Office三件套崩溃问题分析与系统化修复方案

1. Office三件套崩溃问题的本质剖析当PowerPoint/Word/Excel突然弹出"很抱歉,遇到错误需要关闭"的对话框时,背后通常隐藏着三类典型问题:1.1 程序文件完整性受损Office应用程序由数千个相互依赖的组件构成。注册表项损坏、关键DLL文…

2026/9/14 23:11:13

Gitee PR 集成大模型:自建 AI 代码审计机器人实战指南

一聊到 AI 写代码,大家眼睛都亮了,可一聊到代码审查,团队的表情就变得微妙起来。我最近跟几个技术负责人交流,大家有个共同的感受:AI 编程助手让一次迭代的代码产出量翻了好几倍,可是 Review 还是那几个人&…

2026/9/14 23:06:13

人脸关键点检测小模型蒸馏实战:轻量高精度部署方案

简介:本资源是一套面向本科生与初学者的人脸关键点检测轻量化模型实战项目,聚焦知识蒸馏技术在模型压缩中的落地应用,适用于人工智能、计算机科学等专业学生的毕业设计、课程设计及算法进阶学习。压缩包含2000个文件,主体为997张人…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码