js-broadcast-channel
Version:
1 lines • 1.68 kB
JavaScript
var g={RemoveMessage:"rm"},e=class e{constructor(s,a){if(!this.canBrowserSupportBroadcastJS())throw new Error("BroadcastChannel API is not supported in this browser");if(e.bcJSInstance)return e.bcJSInstance;if(!e.bcInstance){let n=new BroadcastChannel(s);e.bcInstance=n;}return e.handlers=a||{},e.bcJSInstance=this,e.bcJSInstance}close(){e.handlers.onBeforeClose?.(),e.bcInstance.close(),e.messageCallbacks.clear(),e.handlers={},e.handlers.onAfterClose?.();}postMessage(s){let a=this.createSerializedMessage(s.message,s.data,false);e.handlers.onBeforePostMessage?.(s),e.bcInstance.postMessage(a),e.handlers.onAfterPostMessage?.(s);}onMessage(s,a){e.messageCallbacks.set(s,a),e.bcInstance.onmessage=n=>{let t=JSON.parse(n.data),r=this.createMessage(t.message,t.data,t.isInternal??false);if(r.isInternal){e.internalMessage(r.message,r);return}let i=e.messageCallbacks.get(t.message);i?(e.handlers.onBeforeSendMessage?.(r),i(r),e.handlers.onAfterSendMessage?.(r)):(e.handlers.onError?.(r),console.error("No callback found for message with name: ",t.message));};}removeMessage(s){let a=this.createSerializedMessage(g.RemoveMessage,s,true);e.bcInstance.postMessage(a),e.messageCallbacks.delete(s);}canBrowserSupportBroadcastJS(){return typeof BroadcastChannel<"u"}hasListeners(s){return e.messageCallbacks.has(s)}static internalMessage(s,a){let n=false;switch(s){case g.RemoveMessage:e.messageCallbacks.delete(a.data),n=true;break;default:n=false;break}return n}createMessage(s,a,n){return {message:s,data:a,isInternal:n}}createSerializedMessage(s,a,n){let t=this.createMessage(s,a,n);return JSON.stringify(t)}};e.messageCallbacks=new Map,e.handlers={};var o=e;export{o as BroadcastJS};