New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

penpal

Package Overview
Dependencies
Maintainers
1
Versions
65
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

penpal - npm Package Compare versions

Comparing version 3.0.1 to 3.0.2

dist/penpal.gz

73

dist/penpal.js

@@ -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>",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc