structured-channel
Version:
A wrapper around MessageChannel API for bi-directional communication between two browsing contexts.
1 lines • 5.39 kB
JavaScript
!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.StructuredChannel=n():e.StructuredChannel=n()}(this,(function(){return function(){"use strict";var e={644:function(e,n,r){function t(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function o(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?t(Object(r),!0).forEach((function(n){a(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function s(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}function a(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}r.r(n),r.d(n,{default:function(){return f}});var i="x-channel-internal-reply",u="x-channel-internal-hello",l="*",c=function(){function e(n){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),a(this,"_handlers",new Map),a(this,"_pendingMessages",new Map),a(this,"_messageId",0),a(this,"port",void 0),this._handleMessage=this._handleMessage.bind(this),this.port=n,this.port.addEventListener("message",this._handleMessage),this.port.start()}var n,r,t;return n=e,t=[{key:"_debug",value:function(){if(e.debug){for(var n,r=arguments.length,t=new Array(r),o=0;o<r;o++)t[o]=arguments[o];return(n=console).log.apply(n,["DEBUG:"].concat(t))}}},{key:"connectTo",value:function(n,r,t){if(!n)return Promise.reject("Target must be defined.");(function(e){return e&&"function"==typeof e.MessageChannel})(r)&&(t=r,r=void 0);var o=t?new t.MessageChannel:new MessageChannel,s=r||l;try{if("document"in n){if(r&&r!==l&&r!==n.document.location.origin)return Promise.reject("The origins don't match.");n.postMessage(u,s,[o.port2])}else n.postMessage(u,[o.port2])}catch(e){n.postMessage(u,s,[o.port2])}return new Promise((function(n,r){var t=new e(o.port1);t.on("ready",(function(){t.off("ready"),t.off("error"),n(t)})),t.on("error",(function(e){t.off("ready"),t.off("error"),r(e)}))}))}},{key:"waitForConnection",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:self,r=arguments.length>1?arguments[1]:void 0;return new Promise((function(t){n.onmessage=function(o){if(o.data===u){var s=new e(o.ports[0]);if(r&&r!==l&&r!==o.origin)return s.send("error","Disallowed origin.");n.onmessage=null,s.send("ready"),t(s)}}}))}}],(r=[{key:"_warn",value:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];console.log("WARNING:",[].concat(n).map((function(e){return JSON.stringify(e)})).join(" "))}},{key:"_handleMessage",value:function(n){var r=n.data;e._debug("Got a message with data:",r);var t=r.id,o=r.type;return void 0!==t&&o&&"string"==typeof o&&o.trim()?o===i?this._handleReply(r):this._handleNewMessage(r):this._warn("Got an invalid message:",r)}},{key:"_handleReply",value:function(n){var r=n.id;if(!this._pendingMessages.has(r))return e._debug("Ignoring an unexpected reply.");var t=this._pendingMessages.get(r),o=t.resolve,s=t.reject;return n.error?(e._debug("Received an error reply for message",r),e._debug("Error was",n.error),s(n.error)):(e._debug("Received a success reply for message",r),e._debug("Result was",n.result),o(n.result)),this._pendingMessages.delete(r)}},{key:"_handleNewMessage",value:function(e){var n,r=this,t=e.id,s=e.type,a=e.payload,u=this._handlers.get(s),l=null;try{u?l=Promise.resolve(u(a)):this._warn("Received a message of type",s,"that has no handler.")}catch(e){this._warn("Handler function failed:",e),l=Promise.reject(e.message||e.name||"Unknown error")}var c={id:t,type:i};null===(n=l)||void 0===n||n.then((function(e){r.port.postMessage(o(o({},c),{},{result:e}))}),(function(e){r.port.postMessage(o(o({},c),{},{error:e||"Unknown error"}))})).catch((function(e){r._warn("Reply could not be sent:",e),r.port.postMessage(o(o({},c),{},{error:"Reply failed"}))}))}},{key:"on",value:function(e,n){if(this._handlers.has(e))throw new Error("Multiple handlers registered for ".concat(e));this._handlers.set(e,n)}},{key:"off",value:function(e){if(!this._handlers.has(e))return this._warn("WARNING: Tried to unregister handler for",e,"that has no handler.");this._handlers.delete(e)}},{key:"send",value:function(e,n){var r=this,t={id:this._messageId++,payload:n,type:e};return new Promise((function(e,n){r._pendingMessages.set(t.id,{resolve:e,reject:n}),r.port.postMessage(t)}))}}])&&s(n.prototype,r),t&&s(n,t),e}();a(c,"debug",!1);const f=c}},n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{}};return e[t](o,o.exports,r),o.exports}return r.d=function(e,n){for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(644)}()}));