Skip to content

后端路由与服务层

后端是一个 Cloudflare Worker,不是传统长驻服务器。主线结构是:index.ts 负责入口和初始化,router 负责鉴权与分发,handler 负责协议行为,service 负责复用逻辑和持久化边界。

请求入口

src/index.ts 负责:

  • 注册 NotificationsHub Durable Object。
  • 区分静态资源和 API 请求。
  • 规范化路径,兼容 hash route、重复斜杠和客户端路径差异。
  • 调用 D1 schema 初始化。
  • 把 API 请求交给 handleRequest()
  • 在 scheduled handler 中触发定时备份扫描。

数据库初始化失败时,普通 API 会返回错误,定时备份会跳过并记录日志,避免在 schema 不完整时继续写入。

路由分层

文件职责
src/router.ts总门面:CORS、请求体限制、公开路由、JWT_SECRET 检查、Bearer token 校验、限流、认证路由。
src/router-public.ts登录前和公开访问接口,例如 config、prelogin、token、注册、密码提示、公开 Send、附件短 token、图标和通知 negotiate。
src/router-authenticated.ts已登录用户接口,例如账号、密码库、文件夹、附件、Send、域名规则、设备和管理员分发。
src/router-devices.ts设备列表、设备密钥、记住设备、信任状态和官方客户端设备兼容路径。
src/router-admin.ts用户、邀请码、用户状态和删除用户。
src/router-admin-backup.ts备份导出、导入、远程备份、远程浏览、完整性检查和恢复。

几个边界要记住:

  • 公开路由不要求 Bearer token,但登录、注册、密码提示等仍有来源检查或限流。
  • JWT_SECRET 缺失、使用示例值或长度不足时,认证 API 会被阻断。
  • 附件、Send 文件、备份导入等大文件路径有单独限制,不走普通 JSON API 的同一套大小规则。
  • X-NodeWarden-Import: 1 的密码库导入和导入期间附件上传,会绕过普通认证 API 限流,避免大批量导入中途被限流打断。
  • 未实现的组织、集合、策略等接口返回空兼容结构,不代表功能可用。

Handler 层

src/handlers/ 是协议行为层。这里应该做请求解析、业务调用和响应组装,不要把通用存储、加密、签名或备份规则散落在多个 handler 里。

领域主要文件
账号与认证accounts.tsidentity.tsdevices.ts
密码库sync.tsciphers.tsfolders.tsdomains.ts
文件能力attachments.tssends*.ts
管理能力admin.tsbackup.ts
通知notifications.ts

密码库相关 handler 要特别注意官方客户端兼容:未知字段保留、EncString 形状、revision 更新、stale update 防护和 /api/sync 输出必须一起考虑。

设备相关 handler 同时服务网页端和官方客户端。knowndevice 是登录前公开检查;设备列表、信任状态、设备 key、push token 和 clear-token 等操作在登录后处理,其中部分路径是为了兼容官方客户端不同版本的调用形状。

Service 层

src/services/ 是复用逻辑和持久化边界:

服务职责
auth.tsaccess token、refresh token、API Key、securityStamp 校验。
storage*.tsD1 聚合服务、repository、schema 初始化、清理和 revision 更新。
blob-store.tsR2/KV blob 读写删除抽象。
ratelimit.ts公开和认证 API 限流预算。
domain-rules.ts全局和自定义等效域名规则合并。
backup-*.ts备份 ZIP、还原、配置规范化、加密信封和远程上传。

src/config/limits.ts 是跨层共享的限制来源。token TTL、请求体大小、附件和 Send 文件上限、分页上限、限流预算、同步缓存和 Bitwarden 兼容版本都应该从这里确认,不要在 wiki 或 UI 里另写一套数字。

改动规则

  • 新增 API 时,先判断它属于 public、authenticated 还是 admin。
  • 新增持久字段时,同时检查 schema、backup、sync、导入导出和前端类型。
  • 新增客户端兼容字段时,优先验证 /identity/*/api/sync,不要只改网页端。
  • 新增长任务时,优先复用通知中心和进度事件。

Released under the LGPL-3.0 License.