@可持久流/服务器-云浮lare
符合者 持久流 协议服务器启用 云花板工人+持久性物体,在 TypeScript 中——您在自己的“工作员”中挂载的库.
每个流都是它自己的持久对象实例(idFromName(streamPath)),通过DO输入/输出门免费给出协议的每流序列化和耐久性. 所有状态都活在 DO SQLite;长波服务员和SSE 尾巴在对象中被持有;滑动的 TTL 使用 DO 提醒;分叉语义(被重新计算出软-去除,被缝合的读取,级联GC)通过 DO-到 DO RPC 在对象之间工作.
使用量
pnpm add @durable-streams/server-cloudflare # or npm install / yarn add
您的工人条目 :
// src/index.ts
import { createStreamsHandler } from "@durable-streams/server-cloudflare"
export { StreamObject } from "@durable-streams/server-cloudflare"
export default {
fetch: createStreamsHandler(),
}
您的wrangler配置 — DO 绑定 必须是命名 STREAMS (fork semics do-to-DO RPC通过它)并且需要SQLite迁移:
// wrangler.jsonc
{
"name": "my-streams",
"main": "src/index.ts",
"compatibility_date": "2025-06-01",
"durable_objects": {
"bindings": [{ "name": "STREAMS", "class_name": "StreamObject" }],
},
"migrations": [{ "tag": "v1", "new_sqlite_classes": ["StreamObject"] }],
}
图书馆类型 参考 工人运行时间类型(DurableObjectNamespace——在您的项目中以 wrangler types。 。 。 .
溪流居住于 /<path> ——完整请求路径名为流路径. 如果您将处理器挂载在更大的工作人体内,则只路径流 URL 到它(各流之间的叉引用使用这些路径,所以保持它们的稳定) 。 见 chat-cloudflare 实例 一个TanStack Start的应用程序 和这个服务器共享一个工作人.
认证
议定书赋予执行权。 默认情况下,如果 AUTH_TOKEN var/secret 设置和不空, 每一份请求必须携带 Authorization: Bearer <token> (单位:千美元)npx wrangler secret put AUTH_TOKEN; 否则服务器已经打开 。 通过自己的钩子来取而代之——返回 a Response 要拒绝的, undefined 允许:
export default {
fetch: createStreamsHandler({
auth: async (request, env) => {
if (!(await isAuthorized(request, env))) {
return new Response("Unauthorized", { status: 401 })
}
return undefined
},
}),
}
createStreamsHandler({ cors: false }) 省略允许默认的 CORS 头.
遵约
经验证 @durable-streams/server-conformance-tests 整个套间,包括叉子语义和自制围栏: 326通过,0失败 (与参考服务器相同;6个跳出是套房自己的) subscriptions- 网钩测试,默认关闭 - 实验 __ds 未执行订阅控制平面并返回 404) (中文(简体) ).
pnpm conformance # boots template/index.ts via wrangler dev (test/wrangler.jsonc) and runs the suite
版式
| 路径 | 这是什么 |
|---|---|
src/index.ts | 库条目:导出 StreamObject, (中文(简体) ), createStreamsHandler,类型 |
src/handler.ts | 工人路由器厂:路由线、CORS预飞、认证钩 |
src/stream-object.ts | StreamObject Do:所有协议语义(PUT/GET/POST/DELETE/HEAD,长波,SSE,出品人,关闭,TTL,叉) |
src/store.ts | SQLite 访问层 (meta 编号 : messages 编号 : producers 页:1 |
src/producer.ts | 纯一能-出产国验证机 |
src/json.ts | JSON 模式帮助器( 阵列平整、 碎片存储、 阵列包装读取) |
src/cursor.ts | CDN 缓存折叠光标数学 |
template/index.ts | 工人输入符合性测试靴(上面的用法片段,完整) |
test/ | 遵守规则:靴子 wrangler dev 运行共享套房 |
开发
pnpm build # emit dist/ (library build)
pnpm conformance # full conformance suite against a local wrangler dev instance
pnpm typecheck
线程和格式化来自 repo 根(pnpm lint, (中文(简体) ), pnpm format 在单发根.
设计说明
- 减值 使用参考格式
<readSeq>_<byteOffset>(16位零加法,可按词法排序);每封信推进字节由payload + 5(frame haybook),匹配参考服务器字节换字节. - 货币:请求体在任何状态被检查之前都会被读取;每个验证-当时-写入块在SQLite API上是同步的,所以DO事件循环使它成为原子——不需要锁.
- TTL 电话 在访问时懒惰地执行(准确) 财务报告和审定财务报表 以 DO 提醒( 仓库回收) , 因此 1秒 TTL 即时失效 .
- 车身盖 每个附件为~1.9MB(DO SQLite的2MB值限制);较大的附件获得协议
413。 。 。 . - 叉子: 创建分叉解析法验证 + 重新计算来源的 DO(
forkAcquire);删除一个引用的流软删除它(410 Gone),最后一叉放出会连结到链条上硬地清洗.
许可证
阿帕奇 - 2.0。协议/验证逻辑从 Apache-2.0 移植 参考服务器 (可转让流捐助者)——见 通知 和每个文件的归属标题.