第 4 讲:Server 网络层与路由

OpenCode 源码解析 · 第 4 讲

OpenCode 源码解析 第 4 讲:Server 网络层与路由 基于 dev 分支源码 · 2026-07-10 📖 开篇导读 第 1 讲俯瞰了 Monorepo 全景,第 2 讲拆解了 CLI 入口,第 3 讲深入了 Session 会话核心。今天转向 Server 网络层 ——OpenCode 面向外部世界的 HTTP API 门面。Server 层横跨 packages/server/ (28 个文件,1682 行)和 packages/protocol/ (22 个文件,1581 行),总计约 3263 行源码 。它基于 Effect 的 HttpApiBuilder 构建了完整的 RESTful API,包含 20 个 Handler 组、3 层中间件和完整的认证/CORS 体系。 一、Server 的两包分工 OpenCode 的网络层分为两个包: Protocol 定义 API 契约, Server 实现路由与处理逻辑。这种分离让 API 规范可以被 CLI、TUI、Desktop 等客户端独立引用。 packages/protocol/ API 契约层:Endpoint 定义、Schema 校验、错误类型、中间件声明 ⬇️ 被引用 packages/server/ 路由实现层:Handler 逻辑、中间件实例化、认证、CORS、WebSocket ⬇️ 依赖 packages/core/ 业务服务层:SessionV2、Permission、Pty、Event 等 Effect Service 二、路由装配:routes.ts 的七层依赖注入 packages/server/src/routes.ts (68 行)是整个 Server 的装配中心。它通过 Effect 的 Layer 体系将 7 层依赖从底到顶堆叠起来: function makeRoutes(auth) { const serviceLayer = AppNodeBuilder.build( applicationServices, [[SessionExecution.node, SessionExecutionLocal.node]] ) return HttpApiBuilder.layer(Api, { openapiPath: "/openapi.json" }) .pipe( Layer.provide(handlers), // ① Handler 组 Layer.provide(sessionLocationLayer), // ② Session 级 Location Layer.provide(locationLayer), // ③ 全局 Location Layer.provide(authorizationLayer), // ④ 认证中间件 Layer.provide(schemaErrorLayer), // ⑤ Schema 校验 Layer.provide(auth), // ⑥ 认证配置 Layer.provide(serviceLayer), // ⑦ 业务服务 ) } 这 7 层从下到上的依赖关系非常清晰:最底层的 serviceLayer 提供 Database、SessionV2、EventV2 等 10 个核心服务;往上依次是认证配置、Schema 校验、授权中间件、Location 解析,最顶层是 20 个 Handler 组。这样的设计让每个 Handler 只需要声明自己依赖的 Service,不需要关心服务如何创建。 三、Protocol 层:API 契约的定义方式 packages/protocol/src/api.ts (86 行)是 API 契约的装配入口。它使用 Effect 的 HttpApi.make("server") 将 18 个 Group 组合成一个完整的 API: HttpApi.make("server") .add(HealthGroup) .add(LocationGroup.middleware(locationMiddleware)) .add(AgentGroup.middleware(locationMiddleware)) .add(makeSession…

阅读全文:OpenCode 源码解析 第 4 讲