Skip to content

Port / Event / State API

跨窗口通信中枢(PortHub)提供三类能力:

  • port.*:命名通道与点对点消息
  • event.*:跨窗口事件广播/定向投递
  • state.*:共享键值状态(支持 TTL)

方法调用使用 dot 格式(如 port.connect),事件监听使用 colon 格式(如 port:messagestate:changed)。

Port API

port.connect

创建命名端口。

参数类型必填描述
namestring?端口通道名

返回值(成功):

json
{
  "portId": "port_00000001",
  "name": "lyrics",
  "windowId": "main"
}

返回值(失败):

json
{ "error": "Port name is required", "code": "INVALID_PARAMS" }
javascript
const port = await fb2k.invoke('port.connect', { name: 'lyrics' });
console.log('端口 ID:', port.portId);

port.disconnect

销毁端口。

参数类型必填描述
portIdstring?端口 ID

返回值(成功): { "success": true }

返回值(失败):

json
{ "error": "Port not found", "code": "PORT_NOT_FOUND" }
javascript
await fb2k.invoke('port.disconnect', { portId: 'port_00000001' });

port.postMessage

向同名通道的其它端口发送消息(不回送给自身)。

参数类型必填描述
portIdstring?发送方端口 ID
messageany?消息体

返回值(成功):

json
{ "success": true, "recipients": 2 }

返回值(失败):

json
{ "success": false, "error": "Port not found", "code": "PORT_NOT_FOUND" }
javascript
await fb2k.invoke('port.postMessage', {
    portId: 'port_00000001',
    message: { text: 'hello' }
});

port.postMessageTo

向指定端口发送消息。

参数类型必填描述
portIdstring?发送方端口 ID
targetPortIdstring?目标端口 ID
messageany?消息体

返回值:

json
{ "success": true }

失败时可能返回:PORT_NOT_FOUND / TARGET_NOT_FOUND

javascript
await fb2k.invoke('port.postMessageTo', {
    portId: 'port_00000001',
    targetPortId: 'port_00000002',
    message: 'sync'
});

port.getPorts

获取端口列表(可选按 name 过滤)。

参数类型必填描述
namestring?仅返回该通道名端口

返回值:

json
{
  "ports": [
    { "portId": "port_00000001", "name": "lyrics", "windowId": "main" }
  ]
}
javascript
const result = await fb2k.invoke('port.getPorts', { name: 'lyrics' });
console.log(`找到 ${result.ports.length} 个端口`);

Event API

event.emit

广播自定义事件到所有窗口。

参数类型必填描述
eventstring?事件名(建议 namespace:eventName)
payloadobject?事件负载,默认 {}
excludeSelfboolean?是否排除发送窗口,默认 false

返回值:

json
{ "success": true, "recipients": 3 }

接收端实际收到的事件 envelope 结构:

json
{ "payload": { ... }, "sourceWindowId": "main" }
javascript
await fb2k.invoke('event.emit', {
    event: 'ui:themeChanged',
    payload: { theme: 'dark' }
});

event.emitTo

定向投递事件到指定窗口。

参数类型必填描述
eventstring?事件名
targetWindowIdstring?目标窗口 ID
payloadobject?事件负载,默认 {}

返回值:

json
{ "success": true }
javascript
await fb2k.invoke('event.emitTo', {
    event: 'lyrics:update',
    targetWindowId: 'popup_01',
    payload: { line: 5 }
});

State API

state.get

读取共享状态。

参数类型必填描述
keystring?状态键

返回值(存在):

json
{ "key": "lyrics:offset", "value": 120, "exists": true, "expiresAt": 1760000000000 }

返回值(不存在):

json
{ "value": null, "exists": false }
javascript
const result = await fb2k.invoke('state.get', { key: 'lyrics:offset' });
if (result.exists) console.log('偶移:', result.value);

state.set

设置共享状态。

参数类型必填描述
keystring?状态键
valueany?状态值
silentboolean?不广播 state:changed,默认 false
ttlMsnumber?生存时间(毫秒),到期自动删除

返回值:

json
{ "success": true, "expiresAt": 1760000000000 }
javascript
await fb2k.invoke('state.set', {
    key: 'lyrics:offset',
    value: 120,
    ttlMs: 60000
});

state.delete

删除共享状态。

参数类型必填描述
keystring?状态键

返回值:

json
{ "success": true, "existed": true }
javascript
await fb2k.invoke('state.delete', { key: 'lyrics:offset' });

state.keys

列出状态键,支持 * 通配。

参数类型必填描述
patternstring?模式,默认 "",如 "lyrics:"

返回值:

json
{ "keys": ["lyrics:offset", "lyrics:theme"] }
javascript
const result = await fb2k.invoke('state.keys', { pattern: 'lyrics:*' });
console.log('状态键:', result.keys);

事件列表(PortHub)

事件名触发时机主要字段
port:connected创建端口portId, name, windowId
port:disconnected销毁端口/窗口清理portId, name, windowId
port:message收到端口消息portId, sourcePortId, sourceWindowId, message
state:changedstate.set 且非 silentkey, value, previousValue, sourceWindowId, expiresAt?
state:deletedstate.delete 或 TTL 到期key, sourceWindowId, reason