-
Notifications
You must be signed in to change notification settings - Fork 1
HTTP Server zh
Edge 用 Cloudflare Workers 的 fetch() 替换了上游的 Node.js HTTP 服务器。
上游参考:HTTP 服务器
dsh-host-webserver 是一个 Node.js HTTP 插件,提供 ctx.webServer,支持命名路由注册、index.html 变换和 fallback 处理器。它不属于 agent loop——纯粹的浏览器 HTTP 投递。其他插件注册功能路由,包括 /api 桥接和 HMR 流。
路由匹配顺序固定:精确表优先,然后最长前缀匹配,最后 fallback。复合 /api handler 先分发给 Typert Gateway(@Remote 方法),再降级到 ApiProxy(编排操作)。
DshEdgeInstance.fetch() 替换了上游的 ctx.webServer。请求依次经过 6 个分发点,首个匹配即短路:
| # | 处理器 | 协议 | URL 示例 | 状态 |
|---|---|---|---|---|
| 1 | handleEdgeRemote() |
A: Typert | /api/commands/list |
|
| 2 | handleTypertRpc() |
A: Typert | /api/goals/edit |
✅ 自动路由 |
| 3 | openDownlink() |
WebSocket | /api/events.mux |
✅ |
| 4 | apiFetch() |
B: apiproxy | /api/session.prompt |
|
| 5 | parseSessionRoute() |
C: Edge REST | /api/sessions/:id/prompt |
✅ Edge 自有 |
| 6 | Assets fallback | 静态 | /index.html |
✅ |
A: Typert Remote(斜线格式:goals/edit)— cordis Service 的 @Remote 方法,由 TypertGatewayService 自动发现。客户端调用 ctx.remote.goals.edit()。完全上游——Edge 只做 HTTP 到 gateway 的路由。
B: apiproxy(点号格式:session.prompt)— 协调多个 Service 的编排操作。上游提供 ApiProxyService(cordis 插件),但 Edge 因依赖不满足无法安装。Edge 手写了 createEdgeApi()(约 800 行)作为简化替代。这是 Edge 中最大的上游重实现。
C: Edge REST(路径参数:/sessions/:id/...)— 上游通过进程内 apiproxy 调用完成的 session 生命周期操作。Edge 需要单独的 HTTP 端点,因为这些操作跨 Worker → DO 边界。不是新业务逻辑——是两个 Cloudflare 运行时之间的传输桥。
Edge 用 DO 休眠 API(WebSocketPair、ctx.acceptWebSocket()、ctx.getWebSockets(channel))替换 Node.js HTTP upgrade。Socket 按 'mux' / 'host' 标记,可跨 DO 休眠存活。
- 路由优先级(Typert 在 ApiProxy 之前)、信封格式、双通道推送
- 客户端连接逻辑(33 个客户端插件不变)
分发:最多 6 次检查(正则、字符串、前缀)。亚毫秒,实际耗时取决于 handler。
WebSocket 广播:O(已连接客户端),通常 1–3 个标签。DO 休眠保持 socket 存活无需 isolate 开销。
| 组件 | 分类 | 上游对应 |
|---|---|---|
Workers fetch()
|
替换 | ctx.webServer |
| DO 休眠 WebSocket | 替换 | Node.js HTTP upgrade |
| Typert 路由 | 桥接 | Connection.rpc.intercept |
createEdgeApi() |
ApiProxyService 插件 |
关键观察:HTTP 服务器是被最彻底替换的上游组件。功能契约保留——相同的路由优先级、信封格式、双通道 WebSocket。客户端无法分辨服务端是 Node.js 还是 Workers。主要设计债是
createEdgeApi():约 800 行重实现的 apiproxy handler,可以通过满足ApiProxyService的依赖来消除。
TODO: 删除
handleEdgeRemote桩 — 阻塞于 SkillRegistry 获得@Remote装饰器。(#95)
TODO: 用
ApiProxyService替换createEdgeApi()— 阻塞于满足 4 个缺失依赖:directoryPicker、subagents、sessionQuery、userQuestions。(#96)
- Home
- Architecture
- Core & Scope
- Session & Persistence
- Model & Context
-
Execution & Tools
- Tools
- Bash
- Subprocess 🚫
- PTY Session 🚫
- Background Jobs 🚫
- Filesystem
- LSP Navigation 🚫
- Code Runtime 🚫
-
Web Access
⚠️ -
Skills
⚠️ - Workflow 🚫
- Subagent 🚫
-
Policy & Interaction
- Goal
- Approval 🚫
- Permission Presets 🚫
-
Sandbox
⚠️ - Plan Mode 🚫
- User Interaction 🚫
- Commands 🚫
- Schedule 🚫
- Message Feedback 🚫
- Platform & Access
- Development
- 首页
- 架构
- 核心与作用域
- 会话与持久化
- 模型与上下文
- 执行与工具
- 策略与交互
- 平台与接入
- 开发