28 lines
682 B
JavaScript
28 lines
682 B
JavaScript
export class CrossTabSync {
|
|
constructor(channelName) {
|
|
this._channel = null;
|
|
if (typeof BroadcastChannel !== "undefined") {
|
|
this._channel = new BroadcastChannel(channelName);
|
|
}
|
|
}
|
|
|
|
post(type, payload = {}) {
|
|
if (!this._channel) return;
|
|
this._channel.postMessage({ type, ...payload });
|
|
}
|
|
|
|
onMessage(handler) {
|
|
if (!this._channel) return () => {};
|
|
const wrapped = (event) => handler(event.data || {});
|
|
this._channel.addEventListener("message", wrapped);
|
|
return () => this._channel.removeEventListener("message", wrapped);
|
|
}
|
|
|
|
close() {
|
|
if (this._channel) {
|
|
this._channel.close();
|
|
this._channel = null;
|
|
}
|
|
}
|
|
}
|