Skip to content

Socket.IO 与 WebSocket

ctx.sockets 由宿主提供连接库,插件无需打包 socket.io-client 或 ws。当前数据通道以 JSON/文本为主,不支持原生二进制帧或 Socket.IO ack 回调。

连接

ts
connect(options: SocketConnectOptions): Promise<HostSocket>
参数类型 / 默认说明
urlstring,必需WebSocket 使用 ws/wss;Socket.IO 使用 http/https,生产优先加密协议
kindwebsocket / socket.io,必需选择协议
operationOperationContext,必需当前操作上下文
permissionKeystring,默认 network.socket必须匹配声明的 network.socket 权限 key
pathstring,可选Socket.IO 的连接路径
authJSON 对象,可选Socket.IO 鉴权参数,最多 16 KiB 序列化数据
reconnectionboolean,可选Socket.IO 默认开启有限重连;WebSocket 不自动重连

Manifest 声明示例:

json
[
  {
    "key": "realtime",
    "name": "network.socket",
    "reason": "接收自建曲库的更新通知"
  }
]

局域网地址还需要已授予 network.private。Socket 连接不会仅因为公网 socket 权限已允许,就自动取得私网权限。

监听、发送与关闭

API返回说明
socket.idstring不透明连接标识
on<T>(event, handler)Disposable取消订阅函数;处理函数接收 JSON 值
emit(event, data)Promise<void>Socket.IO 事件发送
send(data)Promise<void>WebSocket 文本/JSON 发送
disconnect()Promise<void>主动断开连接

Socket.IO 回调收到参数数组,WebSocket message 回调收到文本。字符串中的 JSON 需要自行解析并校验。

ts
import type { PluginContext, OperationContext } from '@shiqianjiang/ceru-plugin-sdk'

export async function connectUpdates(ctx: PluginContext, operation: OperationContext) {
  const socket = await ctx.sockets.connect({
    kind: 'websocket',
    url: 'wss://music.example.com/updates',
    permissionKey: 'realtime',
    operation
  })
  const off = socket.on('message', (text) => {
    ctx.log.info('收到更新', { type: typeof text })
  })
  ctx.effects.add(off)
  ctx.effects.add(() => socket.disconnect())
  await socket.send({ type: 'subscribe', topic: 'library' })
  return socket
}

示例地址需替换成真实服务;不要在激活函数中无条件连网,可由用户操作触发。

限额与重连

工作台与当前桌面使用的 SocketBroker 均有以下限制:

项目限制
同一 broker 的并发连接最多 8 个,连接中也计入
单消息最多 64 KiB 序列化数据
待派发事件队列最多 256 条
每连接发送频率每秒最多 100 条
Socket.IO auth最多 16 KiB
建连超时10 秒
Socket.IO 重连最多 5 次,延迟 1–10 秒
原生 WebSocket 重连不自动重连

不要发送保留事件名(如 connect、disconnect、error)作为自定义 Socket.IO 事件。连接数超限、无效协议、私网未授权、超大消息和发送过快均可能失败。

重载、停用与撤销权限会关闭连接。需要恢复时等待用户操作或明确的业务重试条件,使用新连接对象;旧 ID 不可跨重载复用。

Released under the Apache License 2.0 License.