@actualwave/messageport-dispatcher
Version:
Cross-domain EventDispatcher for MessagePort interface
3 lines (2 loc) • 5.84 kB
JavaScript
!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";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function s(e,t){return e(t={exports:{}},t.exports),t.exports}var r=s(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});const s=(e=>(t,s)=>Boolean(t&&e.call(t,s)))(Object.prototype.hasOwnProperty);t.hasOwn=s,t.default=s}),n=t(r),i=(r.hasOwn,s(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var s,n=(s=r)&&"object"==typeof s&&"default"in s?s.default:s;const i=e=>"object"==typeof e&&null!==e;class o{constructor(e,t=null){this.type=e,this.data=t,this.defaultPrevented=!1}toJSON(){return{type:this.type,data:this.data}}isDefaultPrevented(){return this.defaultPrevented}preventDefault(){this.defaultPrevented=!0}}const a=(e,t)=>{let s=e;return i(e)||(s=new o(String(e),t)),s};class h{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,t){let s;const{listeners:r}=this;for(this.augmentEvent(e),this.index=0;this.index<r.length&&!this.immediatelyStopped;this.index++)(s=r[this.index]).call(t,e);this.clearEvent(e),this.onComplete(this)}augmentEvent(e){const t=e;t.stopPropagation=this.onStopped,t.stopImmediatePropagation=this.stopImmediatePropagation}clearEvent(e){const t=e;delete t.stopPropagation,delete t.stopImmediatePropagation}listenerRemoved(e,t){e===this.listeners&&t<=this.index&&this.index--}}class c{constructor(){this._listeners={},this._runners=[],this.removeRunner=e=>{this._runners.splice(this._runners.indexOf(e),1)}}createList(e,t){const s=parseInt(t,10),r=this.getPrioritiesByKey(e),i=String(s);let o;return n(r,i)?o=r[i]:(o=[],r[i]=o),o}getPrioritiesByKey(e){let t;return n(this._listeners,e)?t=this._listeners[e]:(t={},this._listeners[e]=t),t}add(e,t,s){const r=this.createList(e,s);r.indexOf(t)<0&&r.push(t)}has(e){let t,s=!1;const r=this.getPrioritiesByKey(e);if(r)for(t in r)if(n(r,t)){s=!0;break}return s}remove(e,t){const s=this.getPrioritiesByKey(e);if(s){const e=Object.getOwnPropertyNames(s),{length:r}=e;for(let n=0;n<r;n++){const r=e[n],i=s[r],o=i.indexOf(t);o>=0&&(i.splice(o,1),i.length||delete s[r],this._runners.forEach(e=>{e.listenerRemoved(i,o)}))}}}removeAll(e){delete this._listeners[e]}createRunner(e,t){const s=new h(e,t,this.removeRunner);return this._runners.push(s),s}call(e,t){const s=this.getPrioritiesByKey(e.type);let r=!1;const n=()=>{r=!0};if(s){const i=Object.getOwnPropertyNames(s).sort((e,t)=>e-t),{length:o}=i;for(let a=0;a<o&&!r;a++){const r=s[i[a]];if(r){const s=this.createRunner(r,n);if(s.run(e,t),s.immediatelyStopped)break}}}}}class l{constructor(e=null){this._eventPreprocessor=e,this._listeners=new c}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=a(e,t);this._eventPreprocessor&&(s=this._eventPreprocessor.call(this,s)),this._listeners.call(s)}}t.default=l,t.Event=o,t.EventDispatcher=l,t.createEventDispatcher=e=>new l(e),t.getEvent=a,t.isObject=i}));t(i);i.Event,i.EventDispatcher;var o=i.createEventDispatcher,a=i.getEvent,h=i.isObject;const c=()=>`MP/${Math.ceil(1e4*Math.random())}/${Date.now()}`,l=e=>"function"==typeof e.toJSON?e.toJSON():JSON.stringify(e),d=e=>{if(h(e))return e;try{return JSON.parse(e)}catch(e){}};class p{constructor(e,t){this.event=e,this.dispatcherId=t}toJSON(){return{event:l(this.event),dispatcherId:this.dispatcherId}}}const v=e=>h(e)&&n(e,"dispatcherId")&&n(e,"event"),u=e=>{const t=d(e);if(t&&v(t)){const{event:e,dispatcherId:s}=t;return new p(d(e),s)}return null};class f{constructor(e=null,t=null,s=null,r=null){this.dispatcherId=c(),this.targetOrigin="*",this.target=e||self,this.customPostMessageHandler=t,this.senderEventPreprocessor=r,this.sender=o(),this.receiver=o(s),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=a(e,t);this.senderEventPreprocessor&&(r=this.senderEventPreprocessor.call(this,r));const n=l(new p(r,this.dispatcherId));return this._postMessageHandler(n,s)}_postMessageHandler(e,t){const s=this.customPostMessageHandler;return s?s.call(this,e,this.targetOrigin,t):this.target.postMessage(e,this.targetOrigin,t)}_postMessageListener(e){e=e.nativeEvent||e;const t=u(e.data);t&&(t.dispatcherId===this.dispatcherId?this.sender.dispatchEvent(t.event):this.receiver.dispatchEvent(t.event))}}const g=(e,t,s,r)=>new f(e,t,s,r),m=(e,t=null)=>()=>(t||(t=g(e())),t),E=m(()=>self),P=m(()=>parent),y=m(()=>top);e.MessagePortDispatcher=f,e.MessagePortEvent=p,e.MessagePortTarget=class{constructor(e,t){this.sender=e||[],this.receiver=t||[],this.sender instanceof Array||(this.sender=[this.sender]),this.receiver instanceof Array||(this.receiver=[this.receiver])}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=g,e.default=f,e.getForParent=P,e.getForSelf=E,e.getForTop=y,e.isMessagePortEvent=v,e.parseMessagePortEvent=u,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=messageport-dispatcher.min.js.map