@pit-front-end/utils
Version:
湖南创智艾泰克科技有限公司
52 lines (51 loc) • 1.49 kB
JavaScript
class i {
constructor(e) {
this.eventHandlers = /* @__PURE__ */ new Map(), this.channel = new BroadcastChannel(e), this.setupListeners();
}
setupListeners() {
this.channel.addEventListener("message", (e) => {
const { eventType: s, data: t } = e.data;
this.trigger(s, t);
}), window.addEventListener("beforeunload", () => this.close());
}
// 发送事件到所有页签(包括自身)
postMessage(e, s, t = !0) {
t && this.trigger(e, s);
try {
this.channel.postMessage({ eventType: e, data: s });
} catch (n) {
console.error("[BroadcastChannel] 消息发送失败", n);
}
}
// 触发当前页签的事件处理函数
trigger(e, s) {
const t = this.eventHandlers.get(e);
t && t.forEach((n) => n(s));
}
// 注册事件监听器
on(e, s) {
return this.eventHandlers.has(e) || this.eventHandlers.set(e, /* @__PURE__ */ new Set()), this.eventHandlers.get(e).add(s), () => this.off(e, s);
}
// 注册一次性事件监听器
once(e, s) {
const t = (n) => {
s(n), this.off(e, t);
};
this.on(e, t);
}
// 移除事件监听器
off(e, s) {
const t = this.eventHandlers.get(e);
t && (t.delete(s), t.size === 0 && this.eventHandlers.delete(e));
}
// 清理资源
close() {
this.channel.close(), this.eventHandlers.clear();
}
}
let a = null;
const l = (r = "pit-global-channel") => (a || (a = new i(r)), a);
export {
i as default,
l as getBroadcastService
};