壹 · 连接

WebSocket 客户端

ctx.agentWs

仅 wss:// 的 WebSocket 客户端:可刷新的鉴权请求头、心跳、指数退避重连、并发与背压控制;鉴权失败或指定关闭码时进入 failed 状态并可慢速重试。

接口

const conn = ctx.agentWs.connect<Frame>({
  url: 'wss://example.com/stream',
  headers: async () => ({ 'X-Token': await getToken() }), // 也接受静态对象
  parse: (value) => parseFrame(value),                    // 可选,把 JsonValue 转成业务类型;抛错则丢弃该帧
  onMessage: async (frame, { signal }) => {},
  onError: (err, frame) => {},                            // 可选,默认只记日志
  onStateChange: (state) => {},                           // connecting / open / reconnecting / failed / closed
  fatalCloseCodes: [4001],
  concurrency: 1,
})

conn.state                       // 当前状态
await conn.whenOpen({ signal })  // 等待连接打开
await conn.send(frame)           // 写入 socket 缓冲区后 resolve
await conn.close()

connect() 返回的连接随调用方插件一起管理:插件卸载时连接以 1001 关闭,正在执行的 onMessage 收到的 signal 被中止,状态变为 closed。

传输与鉴权

帧处理

并发与背压

发送

send() 在连接不处于 open 时立即以 not_open 失败(可重试),本包不做内部排队;是否重发由业务包决定。

重连、心跳与失败

配置

在 Profile 的 cordis.patch.yml 中按 id agent-kit-ws 启用并给出配置。按 id 修改 config 时整段替换,未给出的字段使用默认值。下表由本包源码中的配置 schema 生成。

- id: agent-kit-ws
  disabled: false
  config:
    # 只写需要改的字段,其余使用下表的默认值
字段默认值取值范围说明
pingIntervalMs 30000 ≥ 1000 WS ping 间隔
readTimeoutMs 75000 ≥ 2000 读超时,需 ≥ 2 × pingIntervalMs
reconnect.initialDelayMs 1000 ≥ 100 首次重连前的等待时间,之后按指数增长。
reconnect.maxDelayMs 60000 ≥ 100 重连等待时间的上限。
reconnect.jitter 0.2 [0, 1] 抖动比例:每次等待时间向下随机减少最多该比例。
stableResetMs 60000 ≥ 0 连接稳定保持多久后重置退避
fatalRetryDelayMs 300000 ≥ 0 fatal 后慢速重试间隔,0 表示不重试
maxPayloadBytes 1048576 [1024, 104857600] 单帧最大字节数,超过时断开并按普通断线重连。
maxPendingMessages 100 ≥ 1 待处理消息超过该值时暂停读取 socket(背压)。

约束与说明

错误码

所有错误都是 KitError:用 isKitError(e) 判断,按 code 与 retryable 决定是否重试。

code可重试含义
not_open 是 连接未处于 open 状态时调用 send();不做内部排队。
closed 否 连接已关闭(主动 close 或调用方插件卸载)。
aborted 否 whenOpen() 的 signal 被中止。
invalid_url 否 URL 非法,或使用了非本机地址的 ws://。
invalid_options 否 connect() 参数非法,或 send() 的帧无法序列化为 JSON。
invalid_config 否 配置或环境变量非法,Service 启动失败。