Comparing version 3.0.1 to 3.0.2
@@ -117,3 +117,4 @@ // Derived from https://github.com/umdjs/umd/blob/master/templates/amdWebGlobal.js | ||
// or it won't match the message's event.origin. | ||
return protocol + '//' + hostname + (port && port !== DEFAULT_PORTS[protocol] ? ':' + port : ''); | ||
var portSuffix = port && port !== DEFAULT_PORTS[protocol] ? ':' + port : ''; | ||
return protocol + '//' + hostname + portSuffix; | ||
}; | ||
@@ -363,4 +364,4 @@ | ||
var destroy = void 0; | ||
var destructionPromise = new DestructionPromise(function (resolve) { | ||
return destroy = resolve; | ||
var connectionDestructionPromise = new DestructionPromise(function (resolveConnectionDestructionPromise) { | ||
destroy = resolveConnectionDestructionPromise; | ||
}); | ||
@@ -373,3 +374,3 @@ | ||
destructionPromise.then(function () { | ||
connectionDestructionPromise.then(function () { | ||
if (iframe.parentNode) { | ||
@@ -382,7 +383,7 @@ iframe.parentNode.removeChild(iframe); | ||
var childOrigin = getOriginFromUrl(url); | ||
var promise = new Penpal.Promise(function (resolve, reject) { | ||
var timeoutId; | ||
var promise = new Penpal.Promise(function (resolveConnectionPromise, reject) { | ||
var connectionTimeoutId = void 0; | ||
if (timeout !== undefined) { | ||
timeoutId = setTimeout(function () { | ||
connectionTimeoutId = setTimeout(function () { | ||
var error = new Error('Connection to child timed out after ' + timeout + 'ms'); | ||
@@ -399,4 +400,6 @@ error.code = ERR_CONNECTION_TIMEOUT; | ||
var callSender = {}; | ||
var methodNames = void 0; | ||
var receiverMethodNames = void 0; | ||
var destroyCallReceiver = void 0; | ||
var handleMessage = function handleMessage(event) { | ||
@@ -418,15 +421,29 @@ if (event.source === child && event.origin === childOrigin && event.data.penpal === HANDSHAKE) { | ||
connectCallReceiver(info, methods, destructionPromise); | ||
// If the child reconnected, we need to destroy the previous call receiver before setting | ||
// up a new one. | ||
if (destroyCallReceiver) { | ||
destroyCallReceiver(); | ||
} | ||
// If we're reconnecting, remove methods from the previous connection. | ||
if (methodNames) { | ||
methodNames.forEach(function (methodName) { | ||
delete callSender[methodName]; | ||
// When this promise is resolved, it will destroy the call receiver (stop listening to | ||
// method calls from the child) and delete its methods off the call sender. | ||
var callReceiverDestructionPromise = new DestructionPromise(function (resolveCallReceiverDestructionPromise) { | ||
connectionDestructionPromise.then(resolveCallReceiverDestructionPromise); | ||
destroyCallReceiver = resolveCallReceiverDestructionPromise; | ||
}); | ||
connectCallReceiver(info, methods, callReceiverDestructionPromise); | ||
// If the child reconnected, we need to remove the methods from the previous call receiver | ||
// off the sender. | ||
if (receiverMethodNames) { | ||
receiverMethodNames.forEach(function (receiverMethodName) { | ||
delete callSender[receiverMethodName]; | ||
}); | ||
} | ||
methodNames = event.data.methodNames; | ||
connectCallSender(callSender, info, methodNames, destructionPromise); | ||
clearTimeout(timeoutId); | ||
resolve(callSender); | ||
receiverMethodNames = event.data.methodNames; | ||
connectCallSender(callSender, info, receiverMethodNames, connectionDestructionPromise); | ||
clearTimeout(connectionTimeoutId); | ||
resolveConnectionPromise(callSender); | ||
} | ||
@@ -436,3 +453,3 @@ }; | ||
parent.addEventListener(MESSAGE, handleMessage); | ||
destructionPromise.then(function () { | ||
connectionDestructionPromise.then(function () { | ||
parent.removeEventListener(MESSAGE, handleMessage); | ||
@@ -486,4 +503,4 @@ | ||
var destroy = void 0; | ||
var destructionPromise = new DestructionPromise(function (resolve) { | ||
return destroy = resolve; | ||
var connectionDestructionPromise = new DestructionPromise(function (resolveConnectionDestructionPromise) { | ||
destroy = resolveConnectionDestructionPromise; | ||
}); | ||
@@ -494,7 +511,7 @@ | ||
var promise = new Penpal.Promise(function (resolve, reject) { | ||
var timeoutId; | ||
var promise = new Penpal.Promise(function (resolveConnectionPromise, reject) { | ||
var connectionTimeoutId = void 0; | ||
if (timeout !== undefined) { | ||
timeoutId = setTimeout(function () { | ||
connectionTimeoutId = setTimeout(function () { | ||
var error = new Error('Connection to parent timed out after ' + timeout + 'ms'); | ||
@@ -522,6 +539,6 @@ error.code = ERR_CONNECTION_TIMEOUT; | ||
connectCallReceiver(info, methods, destructionPromise); | ||
connectCallSender(callSender, info, event.data.methodNames, destructionPromise); | ||
clearTimeout(timeoutId); | ||
resolve(callSender); | ||
connectCallReceiver(info, methods, connectionDestructionPromise); | ||
connectCallSender(callSender, info, event.data.methodNames, connectionDestructionPromise); | ||
clearTimeout(connectionTimeoutId); | ||
resolveConnectionPromise(callSender); | ||
} | ||
@@ -532,3 +549,3 @@ }; | ||
destructionPromise.then(function () { | ||
connectionDestructionPromise.then(function () { | ||
child.removeEventListener(MESSAGE, handleMessageEvent); | ||
@@ -535,0 +552,0 @@ |
@@ -1,1 +0,1 @@ | ||
!function(e,n){var r={};!function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=e.ERR_CONNECTION_DESTROYED="ConnectionDestroyed",r=e.ERR_CONNECTION_TIMEOUT="ConnectionTimeout",t=e.ERR_NOT_IN_IFRAME="NotInIframe",o={"http:":"80","https:":"443"},a=/^(https?:)?\/\/([^\/:]+)(:(\d+))?/,i={ERR_CONNECTION_DESTROYED:n,ERR_CONNECTION_TIMEOUT:r,ERR_NOT_IN_IFRAME:t,Promise:function(){try{return window?window.Promise:null}catch(e){return null}}(),debug:!1},c=function(){var e=0;return function(){return++e}}(),d=function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];if(i.debug){var t;(t=console).log.apply(t,["[Penpal]"].concat(n))}},u=function(e){var n=document.location,r=a.exec(e),t=void 0,i=void 0,c=void 0;return r?(t=r[1]?r[1]:n.protocol,i=r[2],c=r[4]):(t=n.protocol,i=n.hostname,c=n.port),t+"//"+i+(c&&c!==o[t]?":"+c:"")},s=function(e){var n=[];return e(function(){n.forEach(function(e){e()})}),{then:function(e){n.push(e)}}},l=function(e){return{name:e.name,message:e.message,stack:e.stack}},m=function(e){var n=new Error;return Object.keys(e).forEach(function(r){return n[r]=e[r]}),n},f=function(e,r,t,o){var a=r.localName,u=r.local,s=r.remote,l=r.remoteOrigin,f=!1;d(a+": Connecting call sender");var v=function(e){return function(){for(var r=arguments.length,t=Array(r),o=0;o<r;o++)t[o]=arguments[o];if(d(a+": Sending "+e+"() call"),f){var v=new Error("Unable to send "+e+"() call due to destroyed connection");throw v.code=n,v}return new i.Promise(function(n,r){var o=c(),i=function t(i){if(i.source===s&&i.origin===l&&"reply"===i.data.penpal&&i.data.id===o){d(a+": Received "+e+"() reply"),u.removeEventListener("message",t);var c=i.data.returnValue;i.data.returnValueIsError&&(c=m(c)),("fulfilled"===i.data.resolution?n:r)(c)}};u.addEventListener("message",i),s.postMessage({penpal:"call",id:o,methodName:e,args:t},l)})}};o.then(function(){f=!0}),t.reduce(function(e,n){return e[n]=v(n),e},e)},v=function(e,n,r){var t=e.localName,o=e.local,a=e.remote,c=e.remoteOrigin,u=!1;d(t+": Connecting call receiver");var s=function(e){if(e.source===a&&e.origin===c&&"call"===e.data.penpal){var r=e.data,o=r.methodName,s=r.args,m=r.id;if(d(t+": Received "+o+"() call"),o in n){var f=function(e){return function(n){if(d(t+": Sending "+o+"() reply"),u)return void d(t+": Unable to send "+o+"() reply due to destroyed connection");var r={penpal:"reply",id:m,resolution:e,returnValue:n};"rejected"===e&&n instanceof Error&&(r.returnValue=l(n),r.returnValueIsError=!0);try{a.postMessage(r,c)}catch(e){throw"DataCloneError"===e.name&&a.postMessage({penpal:"reply",id:m,resolution:"rejected",returnValue:l(e),returnValueIsError:!0},c),e}}};new i.Promise(function(e){return e(n[o].apply(n,s))}).then(f("fulfilled"),f("rejected"))}}};o.addEventListener("message",s),r.then(function(){u=!0,o.removeEventListener("message",s)})};i.connectToChild=function(e){var t=e.url,o=e.appendTo,a=e.methods,c=void 0===a?{}:a,l=e.timeout,m=void 0,p=new s(function(e){return m=e}),h=window,g=document.createElement("iframe");(o||document.body).appendChild(g),p.then(function(){g.parentNode&&g.parentNode.removeChild(g)});var E=g.contentWindow||g.contentDocument.parentWindow,w=u(t);return{promise:new i.Promise(function(e,o){var a;void 0!==l&&(a=setTimeout(function(){var e=new Error("Connection to child timed out after "+l+"ms");e.code=r,o(e),m()},l));var i={},u=void 0,s=function(n){if(n.source===E&&n.origin===w&&"handshake"===n.data.penpal){d("Parent: Received handshake, sending reply"),n.source.postMessage({penpal:"handshake-reply",methodNames:Object.keys(c)},n.origin);var r={localName:"Parent",local:h,remote:E,remoteOrigin:n.origin};v(r,c,p),u&&u.forEach(function(e){delete i[e]}),u=n.data.methodNames,f(i,r,u,p),clearTimeout(a),e(i)}};h.addEventListener("message",s),p.then(function(){h.removeEventListener("message",s);var e=new Error("Connection destroyed");e.code=n,o(e)}),d("Parent: Loading iframe"),g.src=t}),iframe:g,destroy:m}},i.connectToParent=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=e.parentOrigin,a=void 0===o?"*":o,c=e.methods,u=void 0===c?{}:c,l=e.timeout;if(window===window.top){var m=new Error("connectToParent() must be called within an iframe");throw m.code=t,m}var p=void 0,h=new s(function(e){return p=e}),g=window,E=g.parent;return{promise:new i.Promise(function(e,t){var o;void 0!==l&&(o=setTimeout(function(){var e=new Error("Connection to parent timed out after "+l+"ms");e.code=r,t(e),p()},l));var i=function n(r){if(("*"===a||a===r.origin)&&r.source===E&&"handshake-reply"===r.data.penpal){d("Child: Received handshake reply"),g.removeEventListener("message",n);var t={localName:"Child",local:g,remote:E,remoteOrigin:r.origin},i={};v(t,u,h),f(i,t,r.data.methodNames,h),clearTimeout(o),e(i)}};g.addEventListener("message",i),h.then(function(){g.removeEventListener("message",i);var e=new Error("Connection destroyed");e.code=n,t(e)}),d("Child: Sending handshake"),E.postMessage({penpal:"handshake",methodNames:Object.keys(u)},a)}),destroy:p}},e.default=i}(r),"function"==typeof define&&define.amd?define("Penpal",r.default):e.Penpal=r.default}(this); | ||
!function(e,n){var r={};!function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=e.ERR_CONNECTION_DESTROYED="ConnectionDestroyed",r=e.ERR_CONNECTION_TIMEOUT="ConnectionTimeout",t=e.ERR_NOT_IN_IFRAME="NotInIframe",o={"http:":"80","https:":"443"},a=/^(https?:)?\/\/([^\/:]+)(:(\d+))?/,i={ERR_CONNECTION_DESTROYED:n,ERR_CONNECTION_TIMEOUT:r,ERR_NOT_IN_IFRAME:t,Promise:function(){try{return window?window.Promise:null}catch(e){return null}}(),debug:!1},d=function(){var e=0;return function(){return++e}}(),c=function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];if(i.debug){var t;(t=console).log.apply(t,["[Penpal]"].concat(n))}},u=function(e){var n=document.location,r=a.exec(e),t=void 0,i=void 0,d=void 0;return r?(t=r[1]?r[1]:n.protocol,i=r[2],d=r[4]):(t=n.protocol,i=n.hostname,d=n.port),t+"//"+i+(d&&d!==o[t]?":"+d:"")},s=function(e){var n=[];return e(function(){n.forEach(function(e){e()})}),{then:function(e){n.push(e)}}},l=function(e){return{name:e.name,message:e.message,stack:e.stack}},m=function(e){var n=new Error;return Object.keys(e).forEach(function(r){return n[r]=e[r]}),n},f=function(e,r,t,o){var a=r.localName,u=r.local,s=r.remote,l=r.remoteOrigin,f=!1;c(a+": Connecting call sender");var v=function(e){return function(){for(var r=arguments.length,t=Array(r),o=0;o<r;o++)t[o]=arguments[o];if(c(a+": Sending "+e+"() call"),f){var v=new Error("Unable to send "+e+"() call due to destroyed connection");throw v.code=n,v}return new i.Promise(function(n,r){var o=d(),i=function t(i){if(i.source===s&&i.origin===l&&"reply"===i.data.penpal&&i.data.id===o){c(a+": Received "+e+"() reply"),u.removeEventListener("message",t);var d=i.data.returnValue;i.data.returnValueIsError&&(d=m(d)),("fulfilled"===i.data.resolution?n:r)(d)}};u.addEventListener("message",i),s.postMessage({penpal:"call",id:o,methodName:e,args:t},l)})}};o.then(function(){f=!0}),t.reduce(function(e,n){return e[n]=v(n),e},e)},v=function(e,n,r){var t=e.localName,o=e.local,a=e.remote,d=e.remoteOrigin,u=!1;c(t+": Connecting call receiver");var s=function(e){if(e.source===a&&e.origin===d&&"call"===e.data.penpal){var r=e.data,o=r.methodName,s=r.args,m=r.id;if(c(t+": Received "+o+"() call"),o in n){var f=function(e){return function(n){if(c(t+": Sending "+o+"() reply"),u)return void c(t+": Unable to send "+o+"() reply due to destroyed connection");var r={penpal:"reply",id:m,resolution:e,returnValue:n};"rejected"===e&&n instanceof Error&&(r.returnValue=l(n),r.returnValueIsError=!0);try{a.postMessage(r,d)}catch(e){throw"DataCloneError"===e.name&&a.postMessage({penpal:"reply",id:m,resolution:"rejected",returnValue:l(e),returnValueIsError:!0},d),e}}};new i.Promise(function(e){return e(n[o].apply(n,s))}).then(f("fulfilled"),f("rejected"))}}};o.addEventListener("message",s),r.then(function(){u=!0,o.removeEventListener("message",s)})};i.connectToChild=function(e){var t=e.url,o=e.appendTo,a=e.methods,d=void 0===a?{}:a,l=e.timeout,m=void 0,p=new s(function(e){m=e}),h=window,g=document.createElement("iframe");(o||document.body).appendChild(g),p.then(function(){g.parentNode&&g.parentNode.removeChild(g)});var E=g.contentWindow||g.contentDocument.parentWindow,w=u(t);return{promise:new i.Promise(function(e,o){var a=void 0;void 0!==l&&(a=setTimeout(function(){var e=new Error("Connection to child timed out after "+l+"ms");e.code=r,o(e),m()},l));var i={},u=void 0,y=void 0,N=function(n){if(n.source===E&&n.origin===w&&"handshake"===n.data.penpal){c("Parent: Received handshake, sending reply"),n.source.postMessage({penpal:"handshake-reply",methodNames:Object.keys(d)},n.origin);var r={localName:"Parent",local:h,remote:E,remoteOrigin:n.origin};y&&y();var t=new s(function(e){p.then(e),y=e});v(r,d,t),u&&u.forEach(function(e){delete i[e]}),u=n.data.methodNames,f(i,r,u,p),clearTimeout(a),e(i)}};h.addEventListener("message",N),p.then(function(){h.removeEventListener("message",N);var e=new Error("Connection destroyed");e.code=n,o(e)}),c("Parent: Loading iframe"),g.src=t}),iframe:g,destroy:m}},i.connectToParent=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=e.parentOrigin,a=void 0===o?"*":o,d=e.methods,u=void 0===d?{}:d,l=e.timeout;if(window===window.top){var m=new Error("connectToParent() must be called within an iframe");throw m.code=t,m}var p=void 0,h=new s(function(e){p=e}),g=window,E=g.parent;return{promise:new i.Promise(function(e,t){var o=void 0;void 0!==l&&(o=setTimeout(function(){var e=new Error("Connection to parent timed out after "+l+"ms");e.code=r,t(e),p()},l));var i=function n(r){if(("*"===a||a===r.origin)&&r.source===E&&"handshake-reply"===r.data.penpal){c("Child: Received handshake reply"),g.removeEventListener("message",n);var t={localName:"Child",local:g,remote:E,remoteOrigin:r.origin},i={};v(t,u,h),f(i,t,r.data.methodNames,h),clearTimeout(o),e(i)}};g.addEventListener("message",i),h.then(function(){g.removeEventListener("message",i);var e=new Error("Connection destroyed");e.code=n,t(e)}),c("Child: Sending handshake"),E.postMessage({penpal:"handshake",methodNames:Object.keys(u)},a)}),destroy:p}},e.default=i}(r),"function"==typeof define&&define.amd?define("Penpal",r.default):e.Penpal=r.default}(this); |
@@ -103,3 +103,4 @@ 'use strict'; | ||
// or it won't match the message's event.origin. | ||
return protocol + '//' + hostname + (port && port !== DEFAULT_PORTS[protocol] ? ':' + port : ''); | ||
var portSuffix = port && port !== DEFAULT_PORTS[protocol] ? ':' + port : ''; | ||
return protocol + '//' + hostname + portSuffix; | ||
}; | ||
@@ -349,4 +350,4 @@ | ||
var destroy = void 0; | ||
var destructionPromise = new DestructionPromise(function (resolve) { | ||
return destroy = resolve; | ||
var connectionDestructionPromise = new DestructionPromise(function (resolveConnectionDestructionPromise) { | ||
destroy = resolveConnectionDestructionPromise; | ||
}); | ||
@@ -359,3 +360,3 @@ | ||
destructionPromise.then(function () { | ||
connectionDestructionPromise.then(function () { | ||
if (iframe.parentNode) { | ||
@@ -368,7 +369,7 @@ iframe.parentNode.removeChild(iframe); | ||
var childOrigin = getOriginFromUrl(url); | ||
var promise = new Penpal.Promise(function (resolve, reject) { | ||
var timeoutId; | ||
var promise = new Penpal.Promise(function (resolveConnectionPromise, reject) { | ||
var connectionTimeoutId = void 0; | ||
if (timeout !== undefined) { | ||
timeoutId = setTimeout(function () { | ||
connectionTimeoutId = setTimeout(function () { | ||
var error = new Error('Connection to child timed out after ' + timeout + 'ms'); | ||
@@ -385,4 +386,6 @@ error.code = ERR_CONNECTION_TIMEOUT; | ||
var callSender = {}; | ||
var methodNames = void 0; | ||
var receiverMethodNames = void 0; | ||
var destroyCallReceiver = void 0; | ||
var handleMessage = function handleMessage(event) { | ||
@@ -404,15 +407,29 @@ if (event.source === child && event.origin === childOrigin && event.data.penpal === HANDSHAKE) { | ||
connectCallReceiver(info, methods, destructionPromise); | ||
// If the child reconnected, we need to destroy the previous call receiver before setting | ||
// up a new one. | ||
if (destroyCallReceiver) { | ||
destroyCallReceiver(); | ||
} | ||
// If we're reconnecting, remove methods from the previous connection. | ||
if (methodNames) { | ||
methodNames.forEach(function (methodName) { | ||
delete callSender[methodName]; | ||
// When this promise is resolved, it will destroy the call receiver (stop listening to | ||
// method calls from the child) and delete its methods off the call sender. | ||
var callReceiverDestructionPromise = new DestructionPromise(function (resolveCallReceiverDestructionPromise) { | ||
connectionDestructionPromise.then(resolveCallReceiverDestructionPromise); | ||
destroyCallReceiver = resolveCallReceiverDestructionPromise; | ||
}); | ||
connectCallReceiver(info, methods, callReceiverDestructionPromise); | ||
// If the child reconnected, we need to remove the methods from the previous call receiver | ||
// off the sender. | ||
if (receiverMethodNames) { | ||
receiverMethodNames.forEach(function (receiverMethodName) { | ||
delete callSender[receiverMethodName]; | ||
}); | ||
} | ||
methodNames = event.data.methodNames; | ||
connectCallSender(callSender, info, methodNames, destructionPromise); | ||
clearTimeout(timeoutId); | ||
resolve(callSender); | ||
receiverMethodNames = event.data.methodNames; | ||
connectCallSender(callSender, info, receiverMethodNames, connectionDestructionPromise); | ||
clearTimeout(connectionTimeoutId); | ||
resolveConnectionPromise(callSender); | ||
} | ||
@@ -422,3 +439,3 @@ }; | ||
parent.addEventListener(MESSAGE, handleMessage); | ||
destructionPromise.then(function () { | ||
connectionDestructionPromise.then(function () { | ||
parent.removeEventListener(MESSAGE, handleMessage); | ||
@@ -472,4 +489,4 @@ | ||
var destroy = void 0; | ||
var destructionPromise = new DestructionPromise(function (resolve) { | ||
return destroy = resolve; | ||
var connectionDestructionPromise = new DestructionPromise(function (resolveConnectionDestructionPromise) { | ||
destroy = resolveConnectionDestructionPromise; | ||
}); | ||
@@ -480,7 +497,7 @@ | ||
var promise = new Penpal.Promise(function (resolve, reject) { | ||
var timeoutId; | ||
var promise = new Penpal.Promise(function (resolveConnectionPromise, reject) { | ||
var connectionTimeoutId = void 0; | ||
if (timeout !== undefined) { | ||
timeoutId = setTimeout(function () { | ||
connectionTimeoutId = setTimeout(function () { | ||
var error = new Error('Connection to parent timed out after ' + timeout + 'ms'); | ||
@@ -508,6 +525,6 @@ error.code = ERR_CONNECTION_TIMEOUT; | ||
connectCallReceiver(info, methods, destructionPromise); | ||
connectCallSender(callSender, info, event.data.methodNames, destructionPromise); | ||
clearTimeout(timeoutId); | ||
resolve(callSender); | ||
connectCallReceiver(info, methods, connectionDestructionPromise); | ||
connectCallSender(callSender, info, event.data.methodNames, connectionDestructionPromise); | ||
clearTimeout(connectionTimeoutId); | ||
resolveConnectionPromise(callSender); | ||
} | ||
@@ -518,3 +535,3 @@ }; | ||
destructionPromise.then(function () { | ||
connectionDestructionPromise.then(function () { | ||
child.removeEventListener(MESSAGE, handleMessageEvent); | ||
@@ -521,0 +538,0 @@ |
{ | ||
"name": "penpal", | ||
"version": "3.0.1", | ||
"version": "3.0.2", | ||
"description": "A promise-based library for communicating with iframes via postMessage.", | ||
@@ -5,0 +5,0 @@ "author": "Aaron Hardy <aaron@aaronhardy.com>", |
57255
972