createBroadcastTopic()
function createBroadcastTopic<T>(event): BroadcastTopic<T>;
Defined in: packages/utils/src/@browser/broadcast-channel-pool.ts:53
创建一个 BroadcastChannel 主题。
Type Parameters
| Type Parameter | Default type |
|---|---|
T | unknown |
Parameters
| Parameter | Type | Description |
|---|---|---|
event | string | 频道名称 |
Returns
消息流、发送方法与显式关闭方法
Remarks
语义与原生 BroadcastChannel 完全一致:
- 同一 realm 里对同一个
event调用两次,得到两个独立参与者,彼此收得到对方的消息; - 发送者收不到自己发的消息(原生就不向发送对象自投递);
- 跨 realm(其他 tab / worker)照常投递。
UTL-009:原实现按频道名在池里复用同一个原生 channel 实例, 于是同 realm 的两个 topic 共享同一个发送对象 —— 而原生不自投递, A 永远收不到 B 的消息。两个独立模块无法通过这个公开抽象通信。
修法不是「加本地 fan-out」(那会引入自回声,属公开语义变更), 而是别再共享发送对象:每个 topic 各自持有一个 channel。 这样既恢复了同 realm 投递,又不改变「发送者是否收到自身消息」这个语义。
另外两处一并修掉:
- 原先最后一次退订会
close()并删缓存,此后同 topicemit()同步抛错。 这不是假设性风险 ——RxDBTabsGateway.init()的removeEventListener之所以必填, 注释写的理由正是「残留监听器在 topic 被回收后再 emit 会抛错并冒泡到保存路径」, 下游已经为它加过一道防御性耦合。现在 emit 不再抛错。 - channel 所有权不再绑在 observer 计数上,改为显式
close()。