@currentspace/http3

中文文档
1.0.0发布于 2026/11/01MITTypeScriptCommonJS零依赖构建来源已验证

基于Node.js的HTTP/3服务器和客户端,由Cloudflare quiche提供支持

中文使用文档
文档目录16 节
  1. 功能
  2. 安装
  3. 快速服务器示例
  4. 地方发展
  5. 快速客户端示例
  6. 流式传输和取消
  7. 运行时模式
  8. WASM运行时
  9. 原始快速mTLS
  10. 快速快速服务器
  11. 快速客户端
  12. 兼容性的表面
  13. 示例
  14. 从这里开始
  15. 部署与操作
  16. 贡献者和维护者

@currentspace / http3

针对Node.js 24+的HTTP/3、HTTP/2和原始QUIC服务器/客户端包,由Rust + quache提供支持。

功能

  • HTTP/3服务器和客户端通过QUIC/UDP
  • HTTP/2在同一侦听器上通过TLS/TCP回退
  • 原始QUIC:双向流,数据报,会话恢复,自定义ALPN
  • 运行时选择: auto, fast, portable,或者 wasm
  • 平台原生I/O: kqueue (macOS), io_uring (Linux快速路径), poll (Linux可移植路径)
  • WASM运行时(runtimeMode: 'wasm')用于HTTP/3和原始QUIC客户端,加上a 仅节点WASM服务器-没有本机 .node 需要插件,并确认 在真正的Cloudflare workerd中运行
  • 获取/ SSE EventSource适配器
  • 通过表达兼容性 @currentspace/http3/express

安装

npm install @currentspace/http3

版本 1.0.0 增加了自动WASM回退,有限制的大写入,外观 运行时元数据,以及Linux和Intel macOS的本机包。早些时候 当本地插件不可用时,安装需要显式WASM。

保持可选的依赖项为本机性能启用。如果是本地插件 不能加载,默认值 auto 模式选择绑定的WASM运行时并发出 WARN_HTTP3_RUNTIME_FALLBACK. 根包包含JavaScript、声明、 WASM和CLI;它不捆绑本机二进制文件、文档或示例。

平台本机包目标当插件无法加载时
macOS arm64 / x64darwin-arm64 / darwin-x64WASM
Linux glibc arm64 / x64linux-arm64-gnu / linux-x64-gnuWASM
Linux arm64 / x64 (Alpine)linux-arm64-musl / linux-x64-muslWASM
窗户无WASM
其他Node平台发布矩阵中没有WASM;平台资质不同

所有六个本机目标都使用匹配的1.0.0 sidecars。没有安装时间 编译器回退。看到 docs/SUPPORT_MATRIX.md.

快速服务器示例

import { createSecureServer } from '@currentspace/http3';

const server = createSecureServer({
  key: process.env.TLS_KEY_PEM,
  cert: process.env.TLS_CERT_PEM,
}, (stream, headers) => {
  stream.respond({ ':status': '200', 'content-type': 'text/plain' });
  stream.end(`hello ${String(headers[':path'] ?? '/')}`);
});

server.listen({ port: 443 }); // Dual-stack ::, all interfaces.

地方发展

在0.9.7 +, npx @currentspace/http3 dev-cert --out .certs --trust 创建一个约束 localhost CA,显式安装本地信任,并颁发证书。从一个 构建的源代码检出使用 node bin/http3.cjs dev-cert --out .certs --trust. 使用 key.pem/cert.pem 在服务器上设置 NODE_EXTRA_CA_CERTS=/absolute/path/.certs/ca.pem 启动Node客户端之前. 此库的本机/WASM客户端需要一个显式的 ca 选项。

Chrome还需要 --origin-to-force-quic-on=localhost:1 用于本地可信QUIC。 未使用的端口启用local-root异常;应用程序仍然 通过Alt-Svc协商H3。监听器默认为双堆栈 :: (所有 接口),所以localhost工作在IPv4和IPv6上。看到 本地发展指南 要删除信任,请使用服务器 配置、浏览器启动命令和仅环回绑定。

快速客户端示例

import { connectAsync } from '@currentspace/http3';

const session = await connectAsync('example.com:443');
const stream = session.request({
  ':method': 'GET',
  ':path': '/',
  ':authority': 'example.com',
  ':scheme': 'https',
}, { endStream: true });

流式传输和取消

H3请求和响应主体在本机和 WASM运行时。暂停一个读者最终会给对方带来反压力;其他流 在连接上可以继续。QUIC接收窗口和传输队列是 与Node的可读高水位标志分开。

使用 pipeline() 或者等待 drain 当 write() 返回 false. 写 回调, drain, finish 描述本地写许可,而不是收据或 对等体的确认。销毁未完成的客户端流将取消它 远程并拒绝挂起的写;正常的双工完成不会重置它。

运行时模式

每个支持quic的API都接受:

  • runtimeMode: 'auto' | 'fast' | 'portable' | 'wasm'
  • fallbackPolicy: 'error' | 'warn-and-fallback'
  • onRuntimeEvent(info)

返回的客户端会话和服务器对象公开 runtimeInfo, auto 回退还会发出带有代码的进程警告 WARN_HTTP3_RUNTIME_FALLBACK. 返回的Node facade createNodeServerFactory.

auto 更喜欢原生的,保留Linux fast → portable 回退时 Io_uring不可用。如果绑定本身无法加载, auto 与 默认的 warn-and-fallback 策略在构造原生状态之前选择WASM。 该警告标识操作系统、体系结构、Linux libc和加载程序失败。 runtimeInfo.reasonCode 是 native-binding-unavailable 对于这种情况。 显式的 fast/portable,或者 auto 与 fallbackPolicy: 'error',而不是失败 与 ERR_HTTP3_RUNTIME_UNSUPPORTED. 显式WASM从不探测本机加载。

import { connectQuicAsync } from '@currentspace/http3';

const session = await connectQuicAsync('https://sfu:9080', {
  alpn: ['sfu-repl'],
  rejectUnauthorized: false,
  runtimeMode: 'auto',
  fallbackPolicy: 'warn-and-fallback',
});

console.log(session.runtimeInfo);

看到 docs/RUNTIME_MODES.md 对于部署矩阵, 功能需求、Docker指南、拓扑策略和原始端点 合同。

客户端拓扑现在在实现中是显式的:

  • 原始QUIC快速客户端每个绑定族共享一个worker和一个本地UDP端口
  • H3快速客户端每个绑定族共享一个worker和一个本地UDP端口
  • macOS可移植模式保持相同的共享客户机-worker所有权模型 最高的 kqueue
  • QUIC和H3服务器仍然是每个端口一个工作人员的架构

使用内置基准测试来检查运行时选择和内部选择 反应堆计数器:

npm run bench:quic -- --profile smoke
npm run bench:h3 -- --profile smoke

WASM运行时

runtimeMode: 'wasm' 运行HTTP/3和原始QUIC客户端和Node服务器 wasm32-wasip1 构建相同的quiche + BoringSSL协议核心,没有 本地的 .node 插件:

import { connectAsync } from '@currentspace/http3';

const session = await connectAsync('example.com:443', { runtimeMode: 'wasm' });

大节点流写入,包括 res.end(buffer),在限定范围内被允许 WASM下的切片。继续尊重可写反压;并发工作 仍然共享有限的WASM堆。本机写入保留其现有路径。

消费者测量2026-10-30,在macOS arm64 / Node 26.13上使用0.9.9 使用本机客户机,在WASM下发现大约5,060-5,270个请求/s 10,500-12,300本机可移植,用于并发50的1,000个小型get。流 32 MiB的下载速度为91-93 MiB/s,而不是836-933 MiB/s。这些描述了那些 其他主机上的工作负载,而不是性能保证。使用本机包 throughput-sensitive部署;WASM保持开发和较小的工作负载 无需插件即可使用。

服务器端(Http3SecureServer.listen() / QuicServer.listen())也 支持 runtimeMode: 'wasm',节点只。客户端构建另外有 已在真正的Cloudflare workerd中运行验证-参见 examples/workerd-client;唯一的 真正的workerd部署的剩余障碍是Workers没有出站 UDP客户端套接字APIcloudflare / workerd # 4463)。

看到 docs/WASM_RUNTIME.md 获取完整的使用指南 和当前Node/workerd支持矩阵 docs/WASM_CLIENT_PLAN.md 对于设计。

原始快速mTLS

  • 原始QUIC客户端可以通过稳定的公开使用mTLS cert 和 key 选项 connectQuic() 和 connectQuicAsync().
  • 原始QUIC服务器支持显式客户端证书策略 clientAuth,默认为 require 当一个验证 ca 配置。
  • 原始的QUIC服务器会话公开经过验证的对等证书,因此应用程序可以检查或使用Node的精确客户端证书 X509Certificate API。

看到 CHANGELOG.md 查阅发行说明及 docs/RELEASE_EVIDENCE.md 对于当前 发布审计分类账和注意事项。

快速快速服务器

import { createQuicServer } from '@currentspace/http3';

const server = createQuicServer({
  key: process.env.TLS_KEY_PEM,
  cert: process.env.TLS_CERT_PEM,
});

server.on('session', (session) => {
  session.on('stream', (stream) => {
    stream.pipe(stream); // echo
  });
});

await server.listen(4433, '0.0.0.0');

快速客户端

import { connectQuicAsync } from '@currentspace/http3';

const session = await connectQuicAsync('127.0.0.1:4433', {
  rejectUnauthorized: false,
});

const stream = session.openStream();
stream.end(Buffer.from('hello QUIC'));

const chunks: Buffer[] = [];
stream.on('data', (c) => chunks.push(c));
stream.on('end', () => console.log(Buffer.concat(chunks).toString()));

兼容性的表面

实验 节点风格的服务器工厂,介绍了 在0.9.4中,支持fasttify集成。版本0.9.5添加了兼容性修复 由 js自定义服务器示例.

  • @currentspace/http3 -规范API。
  • @currentspace/http3/parity -用于迁移的http2风格别名。
  • @currentspace/http3/h3 —HTTP/3扩展命名空间。

包根也导出 createNodeServerFactory 和 createExpressHandler. 子路径声明使用 typesVersions 对于遗留 打印稿 moduleResolution: "node";现代Node16/NodeNext/捆绑器解析 继续使用 exports. 不需要环境模块声明。

从0.9.7开始,本机和WASM H3请求体是流控制的:缓慢的或 暂停处理程序保留客户端。一个4 MiB的上传可以通过慢速流 具有默认值的处理程序 maxBufferedRequestBytes: 1024 * 1024 (1 MiB)。 此选项限制传输流中缓冲的未读字节,包括数据 阅读暂停时已经在飞行;这不是一个总的上传大小限制。 超过上限会重置流,但大型流上传通常不会 需要更高的值。框架车身尺寸限制仍然适用。看到 请求缓冲.

示例

从这里开始

部署与操作

贡献者和维护者

版本与发布记录

@currentspace/http3 共发布 30 个版本,首次发布于 2026/03/13;过去 12 个月发布了 30 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.0.0latest2026/11/012 天前
0.9.92026/10/313 天前
0.9.82026/10/303 天前
0.9.72026/10/304 天前
0.9.62026/10/304 天前
0.9.52026/10/304 天前

其他发布通道:canary → 0.8.3。

关于 @currentspace/http3 的常见问题

@currentspace/http3 是什么?

基于Node.js的HTTP/3服务器和客户端,由Cloudflare quiche提供支持

如何安装 @currentspace/http3?

在项目目录运行 npm install @currentspace/http3,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 http3,可以用 npx http3 直接运行。

@currentspace/http3 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@currentspace/http3 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@currentspace/http3 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@currentspace/http3 可以商用吗?

@currentspace/http3 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@currentspace/http3 还在维护吗?

最新版本 1.0.0 发布于 2026/11/01(2 天前);至今共发布 30 个版本,其中过去 12 个月发布了 30 个;首次发布于 2026/03/13。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。