Files
2026-05-24 22:53:05 +09:00

86 lines
2.7 KiB
Markdown

# index.cjs 说明
## 文件作用
这个文件启动本地 Express 服务,为前端提供 Codex 登录管理、普通聊天和流式聊天 API。它把 HTTP 请求转换成对 `codexClient.cjs` 的函数调用,并负责错误转换、CORS、JSON 解析和 SSE 输出。
## 服务配置
- `PORT`:默认 `8787`,可通过环境变量 `PORT` 覆盖。
- `HOST`:默认 `127.0.0.1`,可通过环境变量 `HOST` 覆盖。
- 使用 `cors` 只允许本地来源。
- 使用 `express.json({ limit: '2mb' })` 解析 JSON 请求体。
## 主要函数
### `isAllowedOrigin(origin)`
判断请求来源是否允许:
- 没有 `origin` 时允许,方便非浏览器或同源请求。
- 只允许 hostname 为 `localhost``127.0.0.1``::1` 的来源。
- URL 解析失败时拒绝。
### `writeSse(res, eventName, data)`
向响应写入一条 SSE 事件:
- 写入 `event: 事件名`
- 写入 JSON 序列化后的 `data:`
- 用空行结束事件。
### `toHttpStatus(error)`
从错误对象中读取 `status``statusCode`。如果是合法 4xx/5xx 状态码就返回它,否则返回 500。
### `toErrorMessage(error)`
把错误对象转换为可返回给前端的字符串。优先使用 `error.message`,没有错误时返回未知错误文案。
## API 路由
### `GET /api/health`
健康检查接口,返回 `{ ok: true, provider: 'codex-sdk' }`
### `GET /api/codex/status`
强制刷新 Codex 登录状态,调用 `getAuthStatus({ force: true })`。失败时返回标准错误 JSON。
### `GET /api/codex/login-log`
返回当前或最近一次 Codex 登录进程状态,数据来自 `getLoginState()`
### `POST /api/codex/login`
启动 Codex 登录流程。请求体中的 `deviceAuth` 控制是否使用设备码登录。接口返回 202 和登录状态。
### `POST /api/codex/logout`
执行 Codex 退出登录。命令成功时返回 200,命令失败时返回 500。
### `POST /api/chat`
普通非流式聊天接口:
- 为请求创建 `AbortController`
- 监听响应 `close`,如果客户端提前断开则中止 Codex 运行。
- 调用 `runCodexOnce(req.body, controller.signal)`
- 成功时返回 JSON 结果,失败时返回错误 JSON。
### `POST /api/chat/stream`
流式聊天接口:
- 创建 `AbortController` 并监听客户端断开。
- 设置 `text/event-stream`、禁用缓存和保持连接。
- 调用 `runCodexStream`
- `onDelta` 时写入 `delta` SSE 事件。
- `onError` 时写入 `error` SSE 事件。
- 正常完成时写入 `done` SSE 事件并结束响应。
- 异常时写入 `error` 事件并结束响应。
## 依赖关系
该文件从 `codexClient.cjs` 引入 Codex 相关能力。前端 `src/utils/api.js` 会调用这里暴露的 API。