UNPKG

@actualwave/messageport-dispatcher

Version:
3 lines (2 loc) 5.38 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MessagePortDispatcher={})}(this,function(e){"use strict";var t,s={};var r=function(){if(t)return s;t=1,Object.defineProperty(s,"__esModule",{value:!0});const e=e=>"object"==typeof e&&null!==e;class r{constructor(e,t=null){this.defaultPrevented=!1,this.type=e,this.data=t}toJSON(){return{type:this.type,data:this.data}}isDefaultPrevented(){return this.defaultPrevented}preventDefault(){this.defaultPrevented=!0}}const n=(t,s)=>e(t)?t:new r(String(t),s);class i{constructor(e,t,s){this.index=-1,this.immediatelyStopped=!1,this.stopImmediatePropagation=()=>{this.immediatelyStopped=!0},this.listeners=e,this.onStopped=t,this.onComplete=s}run(e){const t=e;for(t.stopPropagation=this.onStopped,t.stopImmediatePropagation=this.stopImmediatePropagation,this.index=0;this.index<this.listeners.length&&!this.immediatelyStopped;this.index++)this.listeners[this.index](t);delete e.stopPropagation,delete e.stopImmediatePropagation,this.onComplete(this)}listenerRemoved(e,t){e===this.listeners&&t<=this.index&&this.index--}}class o{constructor(){this._listeners={},this._runners=[],this.removeRunner=e=>{this._runners.splice(this._runners.indexOf(e),1)}}createList(e,t){const s=this.getPrioritiesByKey(e),r=String(t);if(Object.hasOwn(s,r))return s[r];const n=[];return s[r]=n,n}getPrioritiesByKey(e){if(Object.hasOwn(this._listeners,e))return this._listeners[e];const t={};return this._listeners[e]=t,t}add(e,t,s){const r=this.createList(e,s);r.indexOf(t)<0&&r.push(t)}has(e){return!!Object.hasOwn(this._listeners,e)&&Object.keys(this._listeners[e]).length>0}remove(e,t){if(!Object.hasOwn(this._listeners,e))return;const s=this._listeners[e],r=Object.getOwnPropertyNames(s);for(const e of r){const r=s[e],n=r.indexOf(t);n>=0&&(r.splice(n,1),r.length||delete s[e],this._runners.forEach(e=>{e.listenerRemoved(r,n)}))}}removeAll(e){delete this._listeners[e]}createRunner(e,t){const s=new i(e,t,this.removeRunner);return this._runners.push(s),s}call(e){if(!Object.hasOwn(this._listeners,e.type))return;const t=this._listeners[e.type];let s=!1;const r=()=>{s=!0},n=Object.getOwnPropertyNames(t).sort((e,t)=>Number(e)-Number(t));for(const i of n){if(s)break;const n=t[i];if(n){const t=this.createRunner(n,r);if(t.run(e),t.immediatelyStopped)break}}}}class a{constructor(e=null){this._eventPreprocessor=e,this._listeners=new o}addEventListener(e,t,s=0){this._listeners.add(e,t,-s||0)}hasEventListener(e){return this._listeners.has(e)}removeEventListener(e,t){this._listeners.remove(e,t)}removeAllEventListeners(e){this._listeners.removeAll(e)}dispatchEvent(e,t){let s=n(e,t);this._eventPreprocessor&&(s=this._eventPreprocessor.call(this,s)),this._listeners.call(s)}}return s.Event=r,s.EventDispatcher=a,s.createEventDispatcher=e=>new a(e??null),s.default=a,s.getEvent=n,s.isObject=e,s}();const n=e=>"function"==typeof e.toJSON?e.toJSON():JSON.stringify(e),i=e=>{if("object"==typeof(t=e)&&null!==t)return e;var t;try{return JSON.parse(e)}catch{}};class o{constructor(e,t){this.event=e,this.dispatcherId=t}toJSON(){return{event:n(this.event),dispatcherId:this.dispatcherId}}}const a=e=>"object"==typeof e&&null!==e&&Object.hasOwn(e,"dispatcherId")&&Object.hasOwn(e,"event"),h=e=>{const t=i(e);if(t&&a(t)){const{event:e,dispatcherId:s}=t;return new o(i(e),s)}return null};class c{constructor(e=null,t=null,s=null,n=null){this.dispatcherId=`MP/${Math.ceil(1e4*Math.random())}/${Date.now()}`,this.targetOrigin="*",this.target=e??self,this.customPostMessageHandler=t,this.senderEventPreprocessor=n,this.sender=r.createEventDispatcher(),this.receiver=r.createEventDispatcher(s??void 0),this.target.addEventListener("message",e=>this._postMessageListener(e))}addEventListener(e,t,s){this.receiver.addEventListener(e,t,s)}hasEventListener(e){return this.receiver.hasEventListener(e)}removeEventListener(e,t){this.receiver.removeEventListener(e,t)}removeAllEventListeners(e){this.receiver.removeAllEventListeners(e)}dispatchEvent(e,t,s){let r="string"==typeof e?{type:e,data:t}:e;this.senderEventPreprocessor&&(r=this.senderEventPreprocessor(r));const i=n(new o(r,this.dispatcherId));this._postMessageHandler(i,s)}_postMessageHandler(e,t){const s=this.customPostMessageHandler;s?s.call(this,e,this.targetOrigin,t):this.target.postMessage(e,this.targetOrigin,t)}_postMessageListener(e){const t=e.nativeEvent??e,s=h(t.data);s&&(s.dispatcherId===this.dispatcherId?this.sender.dispatchEvent(s.event):this.receiver.dispatchEvent(s.event))}}const l=(e,t,s,r)=>new c(e??null,t??null,s??null,r??null),d=e=>{let t=null;return()=>(t||(t=l(e())),t)},p=d(()=>self),v=d(()=>parent),u=d(()=>top);e.MessagePortDispatcher=c,e.MessagePortEvent=o,e.MessagePortTarget=class{constructor(e,t){this.sender=e?Array.isArray(e)?e:[e]:[],this.receiver=t?Array.isArray(t)?t:[t]:[]}postMessage(...e){this.sender.forEach(t=>t.postMessage(...e))}addEventListener(e,t){this.receiver.forEach(s=>s.addEventListener(e,t))}removeEventListener(e,t){this.receiver.forEach(s=>s.removeEventListener(e,t))}},e.createMessagePortDispatcher=l,e.default=c,e.getForParent=v,e.getForSelf=p,e.getForTop=u,e.isMessagePortEvent=a,e.parseMessagePortEvent=h,Object.defineProperty(e,"__esModule",{value:!0})}); //# sourceMappingURL=messageport-dispatcher.min.js.map