New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

interframe

Package Overview
Dependencies
Maintainers
1
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

interframe - npm Package Compare versions

Comparing version
1.3.1
to
1.4.0
+1
.nvmrc
8
# Generally, we allow slightly longer lines (110 for code, 140 for comments),
# but we limit this to a value that leads to better results when using auto formatting.
printWidth: 90
# Use two spaces for tabs
tabWidth: 2
# Unify with convention used in JSX, HTML and CSS to use double quotes
singleQuote: false
# Don't use semicolons where they are not required
semi: false
# Don't do noisy trailing commas
trailingComma: none
# More space is better for readability
bracketSpacing: true
# Put the > of a multi-line JSX element at the end of the last line
jsxBracketSameLine: false
# Include parentheses around a sole arrow function parameter.
arrowParens: always
+45
-44

@@ -1,2 +0,2 @@

/*! interframe v1.3.1 by Sebastian Fastner <s.fastner@sebastian-software.de> */
/*! interframe v1.4.0 by Sebastian Fastner <s.fastner@sebastian-software.de> */
'use strict';

@@ -11,3 +11,4 @@

/* eslint-disable filenames/match-exported, max-params */
/* eslint-disable filenames/match-exported, max-params, compat/compat */
/* eslint-env browser */

@@ -26,20 +27,7 @@ var TYPE = "application/interframe-ssoft-v1+json";

var listeners = [];
var handshakeCallback = [];
var responseResolver = {};
var handshakeCallback = new Set();
var responseResolver = new Map();
var preHandshakeSendQueue = [];
var isHandshaken = false;
function addListener(callback) {
listeners.push(callback);
return callback;
}
function removeListener(callback) {
var pos = listeners.indexOf(callback);
if (pos >= 0) {
listeners.splice(pos, 1);
}
}
function send(namespace) {

@@ -78,10 +66,11 @@ var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

var timer = setTimeout(function () {
responseResolver[id] = undefined; // eslint-disable-line security/detect-object-injection
responseResolver["delete"](id);
resolve();
}, PROMISE_TIMEOUT);
responseResolver[id] = { // eslint-disable-line security/detect-object-injection
responseResolver.set(id, {
// eslint-disable-line security/detect-object-injection
resolve: resolve,
timer: timer
};
});
});

@@ -93,4 +82,7 @@ }

var message = { type: TYPE };
if (acknowledgement) message.handshakeConfirmation = true;else message.handshake = true;
var message = {
type: TYPE,
handshakeConfirmation: Boolean(acknowledgement),
handshake: !acknowledgement
};

@@ -101,7 +93,6 @@ targetWindow.postMessage(JSON.stringify(message), origin);

function isSafeMessage(msgSource, msgOrigin, msgType) {
var safeSource = msgSource === targetWindow;
var safeOrigin = origin === "*" || msgOrigin === origin;
var safeType = msgType === TYPE;
var jsdom = window.navigator.userAgent.indexOf("jsdom") >= 0 && msgSource === null;
return safeSource && safeOrigin && safeType;
return (msgSource === targetWindow || jsdom) && (origin === "*" || msgOrigin === origin) && msgType === TYPE;
}

@@ -130,8 +121,9 @@

}
handshakeCallback.length = 0;
handshakeCallback.clear();
var _loop = function _loop(sendItem) {
var _loop = function (sendItem) {
send(sendItem.namespace, sendItem.data, sendItem.responseId).then(function (response) {
return sendItem.resolve(response);
})["catch"](function () {
}) // eslint-disable-line promise/prefer-await-to-then
["catch"](function () {
return sendItem.resolve();

@@ -166,3 +158,3 @@ });

open: function open() {
message.isPromise = true;
message.isPromise = true; // eslint-disable-line immutable/no-mutation

@@ -181,7 +173,7 @@ return Object.assign({}, messageData, {

function handleMessage(messageData) {
if (messageData.responseId && responseResolver[messageData.responseId]) {
var resolver = responseResolver[messageData.responseId];
if (messageData.responseId && responseResolver.has(messageData.responseId)) {
var resolver = responseResolver.get(messageData.responseId);
clearTimeout(resolver.timer);
resolver.resolve(messageData);
responseResolver[messageData.responseId] = undefined;
responseResolver["delete"](messageData.responseId);
} else {

@@ -202,3 +194,2 @@ var message = createMessage(messageData);

var listener = _ref3;
listener(createMessage(message));

@@ -209,5 +200,5 @@ }

function messageListener(event) {
var ownWindow = sourceWindow || window;
ownWindow.addEventListener("message", function (event) {
var data = void 0;
try {

@@ -226,7 +217,4 @@ data = JSON.parse(event.data);

return handleMessage(data);
}
}, false);
var ownWindow = sourceWindow || window;
ownWindow.addEventListener("message", messageListener, false);
sendHandshake();

@@ -236,7 +224,11 @@

if (isHandshaken) {
if (typeof callback === "function") callback();
if (typeof callback === "function") {
callback();
}
return true;
}
handshakeCallback.push(callback);
if (typeof callback === "function") {
handshakeCallback.add(callback);
}
return false;

@@ -246,4 +238,13 @@ }

return {
addListener: addListener,
removeListener: removeListener,
addListener: function (callback) {
listeners.push(callback);
return callback;
},
removeListener: function (callback) {
var pos = listeners.indexOf(callback);
if (pos >= 0) {
listeners.splice(pos, 1);
}
},
send: send,

@@ -250,0 +251,0 @@

@@ -1,1 +0,1 @@

{"version":3,"file":"interframe.commonjs.js","sources":["../src/nextID.js","../src/index.js"],"sourcesContent":["let id = 0\n\nexport default function nextID()\n{\n id += 1\n return id\n}\n","/* eslint-disable filenames/match-exported, max-params */\n\nimport nextID from \"./nextID\"\n\nconst TYPE = \"application/interframe-ssoft-v1+json\"\nconst PROMISE_TIMEOUT = 3000\n\nfunction interframe(targetWindow, origin = \"*\", sourceWindow)\n{\n if (!targetWindow)\n {\n throw new Error(\"parameter 'targetWindow' is missing\")\n }\n\n const listeners = []\n const handshakeCallback = []\n const responseResolver = {}\n const preHandshakeSendQueue = []\n let isHandshaken = false\n\n function addListener(callback)\n {\n listeners.push(callback)\n return callback\n }\n\n function removeListener(callback)\n {\n const pos = listeners.indexOf(callback)\n\n if (pos >= 0) {\n listeners.splice(pos, 1)\n }\n }\n\n function send(namespace, data = null, responseId)\n {\n if (!namespace)\n {\n throw new Error(\"parameter 'namespace' is missing\")\n }\n if (typeof namespace !== \"string\")\n {\n throw new Error(\"parameter 'namespace' must be a string\")\n }\n\n if (!isHandshaken) {\n return new Promise((resolve) =>\n {\n preHandshakeSendQueue.push({\n namespace,\n data,\n responseId,\n resolve\n })\n })\n }\n\n const id = nextID()\n targetWindow.postMessage(JSON.stringify({\n id,\n responseId,\n type: TYPE,\n namespace,\n data\n }), origin)\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n responseResolver[id] = undefined // eslint-disable-line security/detect-object-injection\n resolve()\n }, PROMISE_TIMEOUT)\n\n responseResolver[id] = { // eslint-disable-line security/detect-object-injection\n resolve,\n timer\n }\n })\n }\n\n function sendHandshake(acknowledgement = false)\n {\n const message = { type: TYPE }\n if (acknowledgement)\n message.handshakeConfirmation = true\n else\n message.handshake = true\n\n targetWindow.postMessage(JSON.stringify(message), origin)\n }\n\n function isSafeMessage(msgSource, msgOrigin, msgType)\n {\n const safeSource = msgSource === targetWindow\n const safeOrigin = (origin === \"*\") || (msgOrigin === origin)\n const safeType = msgType === TYPE\n\n return safeSource && safeOrigin && safeType\n }\n\n function handleHandshake(data)\n {\n if (data.handshake)\n sendHandshake(true)\n\n isHandshaken = true\n\n for (const hsCallback of handshakeCallback) {\n hsCallback()\n }\n handshakeCallback.length = 0\n\n for (const sendItem of preHandshakeSendQueue) {\n send(\n sendItem.namespace,\n sendItem.data,\n sendItem.responseId\n ).then(\n (response) => sendItem.resolve(response)\n ).catch(\n () => sendItem.resolve()\n )\n }\n }\n\n function createMessage(messageData)\n {\n const message = {\n id: messageData.id,\n data: messageData.data,\n namespace: messageData.namespace,\n\n open: () => {\n message.isPromise = true\n\n return Object.assign(\n {},\n messageData,\n {\n response: (data) =>\n {\n send(messageData.namespace, data, messageData.id)\n }\n }\n )\n }\n }\n\n return message\n }\n\n function handleMessage(messageData)\n {\n if (messageData.responseId && responseResolver[messageData.responseId])\n {\n const resolver = responseResolver[messageData.responseId]\n clearTimeout(resolver.timer)\n resolver.resolve(messageData)\n responseResolver[messageData.responseId] = undefined\n }\n else\n {\n const message = createMessage(messageData)\n for (const listener of listeners)\n listener(createMessage(message))\n }\n }\n\n function messageListener(event)\n {\n let data\n\n try\n {\n data = JSON.parse(event.data)\n }\n catch (error)\n {\n return false\n }\n\n if (!isSafeMessage(event.source, event.origin, data.type))\n {\n return false\n }\n\n if (data.handshake || data.handshakeConfirmation)\n return handleHandshake(data)\n\n return handleMessage(data)\n }\n\n const ownWindow = sourceWindow || window\n ownWindow.addEventListener(\"message\", messageListener, false)\n\n sendHandshake()\n\n function hasHandshake(callback)\n {\n if (isHandshaken)\n {\n if (typeof callback === \"function\")\n callback()\n return true\n }\n\n handshakeCallback.push(callback)\n return false\n }\n\n return {\n addListener,\n removeListener,\n send,\n\n hasHandshake\n }\n}\n\nexport default interframe\n"],"names":["id","nextID","TYPE","PROMISE_TIMEOUT","interframe","targetWindow","origin","sourceWindow","Error","listeners","handshakeCallback","responseResolver","preHandshakeSendQueue","isHandshaken","addListener","callback","push","removeListener","pos","indexOf","splice","send","namespace","data","responseId","Promise","resolve","postMessage","JSON","stringify","timer","setTimeout","undefined","sendHandshake","acknowledgement","message","type","handshakeConfirmation","handshake","isSafeMessage","msgSource","msgOrigin","msgType","safeSource","safeOrigin","safeType","handleHandshake","hsCallback","length","sendItem","then","response","createMessage","messageData","isPromise","Object","assign","handleMessage","resolver","listener","messageListener","event","parse","error","source","ownWindow","window","addEventListener","hasHandshake"],"mappings":"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"}
{"version":3,"file":"interframe.commonjs.js","sources":["../src/nextID.js","../src/index.js"],"sourcesContent":["let id = 0\n\nexport default function nextID()\n{\n id += 1\n return id\n}\n","/* eslint-disable filenames/match-exported, max-params, compat/compat */\n/* eslint-env browser */\n\nimport nextID from \"./nextID\"\n\nconst TYPE = \"application/interframe-ssoft-v1+json\"\nconst PROMISE_TIMEOUT = 3000\n\nfunction interframe(targetWindow, origin = \"*\", sourceWindow) {\n if (!targetWindow) {\n throw new Error(\"parameter 'targetWindow' is missing\")\n }\n\n const listeners = []\n const handshakeCallback = new Set()\n const responseResolver = new Map()\n const preHandshakeSendQueue = []\n let isHandshaken = false\n\n function addListener(callback) {\n listeners.push(callback)\n return callback\n }\n\n function removeListener(callback) {\n const pos = listeners.indexOf(callback)\n\n if (pos >= 0) {\n listeners.splice(pos, 1)\n }\n }\n\n function send(namespace, data = null, responseId) {\n if (!namespace) {\n throw new Error(\"parameter 'namespace' is missing\")\n }\n if (typeof namespace !== \"string\") {\n throw new Error(\"parameter 'namespace' must be a string\")\n }\n\n if (!isHandshaken) {\n return new Promise((resolve) => {\n preHandshakeSendQueue.push({\n namespace,\n data,\n responseId,\n resolve\n })\n })\n }\n\n const id = nextID()\n targetWindow.postMessage(\n JSON.stringify({\n id,\n responseId,\n type: TYPE,\n namespace,\n data\n }),\n origin\n )\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n responseResolver.delete(id)\n resolve()\n }, PROMISE_TIMEOUT)\n\n responseResolver.set(id, {\n // eslint-disable-line security/detect-object-injection\n resolve,\n timer\n })\n })\n }\n\n function sendHandshake(acknowledgement = false) {\n const message = {\n type: TYPE,\n handshakeConfirmation: Boolean(acknowledgement),\n handshake: !acknowledgement\n }\n\n targetWindow.postMessage(JSON.stringify(message), origin)\n }\n\n function isSafeMessage(msgSource, msgOrigin, msgType) {\n const jsdom = window.navigator.userAgent.indexOf(\"jsdom\") >= 0 && msgSource === null\n const safeSource = msgSource === targetWindow || jsdom\n const safeOrigin = origin === \"*\" || msgOrigin === origin\n const safeType = msgType === TYPE\n\n return safeSource && safeOrigin && safeType\n }\n\n function handleHandshake(data) {\n if (data.handshake) sendHandshake(true)\n\n isHandshaken = true\n\n for (const hsCallback of handshakeCallback) {\n hsCallback()\n }\n handshakeCallback.clear()\n\n for (const sendItem of preHandshakeSendQueue) {\n send(sendItem.namespace, sendItem.data, sendItem.responseId)\n .then((response) => sendItem.resolve(response)) // eslint-disable-line promise/prefer-await-to-then\n .catch(() => sendItem.resolve())\n }\n }\n\n function createMessage(messageData) {\n const message = {\n id: messageData.id,\n data: messageData.data,\n namespace: messageData.namespace,\n\n open: () => {\n message.isPromise = true // eslint-disable-line immutable/no-mutation\n\n return Object.assign({}, messageData, {\n response: (data) => {\n send(messageData.namespace, data, messageData.id)\n }\n })\n }\n }\n\n return message\n }\n\n function handleMessage(messageData) {\n if (messageData.responseId && responseResolver.has(messageData.responseId)) {\n const resolver = responseResolver.get(messageData.responseId)\n clearTimeout(resolver.timer)\n resolver.resolve(messageData)\n responseResolver.delete(messageData.responseId)\n } else {\n const message = createMessage(messageData)\n for (const listener of listeners) listener(createMessage(message))\n }\n }\n\n function messageListener(event) {\n let data\n try {\n data = JSON.parse(event.data)\n } catch (error) {\n return false\n }\n\n if (!isSafeMessage(event.source, event.origin, data.type)) {\n return false\n }\n\n if (data.handshake || data.handshakeConfirmation) return handleHandshake(data)\n\n return handleMessage(data)\n }\n\n const ownWindow = sourceWindow || window\n ownWindow.addEventListener(\"message\", messageListener, false)\n\n sendHandshake()\n\n function hasHandshake(callback) {\n if (isHandshaken) {\n if (typeof callback === \"function\") {\n callback()\n }\n return true\n }\n\n if (typeof callback === \"function\") {\n handshakeCallback.add(callback)\n }\n return false\n }\n\n return {\n addListener,\n removeListener,\n send,\n\n hasHandshake\n }\n}\n\nexport default interframe\n"],"names":["id","nextID","TYPE","PROMISE_TIMEOUT","interframe","targetWindow","origin","sourceWindow","Error","listeners","handshakeCallback","Set","responseResolver","Map","preHandshakeSendQueue","isHandshaken","send","namespace","data","responseId","Promise","resolve","push","postMessage","JSON","stringify","timer","setTimeout","set","sendHandshake","acknowledgement","message","Boolean","isSafeMessage","msgSource","msgOrigin","msgType","jsdom","window","navigator","userAgent","indexOf","handleHandshake","handshake","hsCallback","clear","sendItem","then","response","createMessage","messageData","isPromise","Object","assign","handleMessage","has","resolver","get","listener","ownWindow","addEventListener","event","parse","error","source","type","handshakeConfirmation","hasHandshake","callback","add","pos","splice"],"mappings":"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"}

@@ -1,2 +0,2 @@

/*! interframe v1.3.1 by Sebastian Fastner <s.fastner@sebastian-software.de> */
/*! interframe v1.4.0 by Sebastian Fastner <s.fastner@sebastian-software.de> */
var id = 0;

@@ -9,3 +9,4 @@

/* eslint-disable filenames/match-exported, max-params */
/* eslint-disable filenames/match-exported, max-params, compat/compat */
/* eslint-env browser */

@@ -24,20 +25,7 @@ var TYPE = "application/interframe-ssoft-v1+json";

var listeners = [];
var handshakeCallback = [];
var responseResolver = {};
var handshakeCallback = new Set();
var responseResolver = new Map();
var preHandshakeSendQueue = [];
var isHandshaken = false;
function addListener(callback) {
listeners.push(callback);
return callback;
}
function removeListener(callback) {
var pos = listeners.indexOf(callback);
if (pos >= 0) {
listeners.splice(pos, 1);
}
}
function send(namespace) {

@@ -76,10 +64,11 @@ var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

var timer = setTimeout(function () {
responseResolver[id] = undefined; // eslint-disable-line security/detect-object-injection
responseResolver["delete"](id);
resolve();
}, PROMISE_TIMEOUT);
responseResolver[id] = { // eslint-disable-line security/detect-object-injection
responseResolver.set(id, {
// eslint-disable-line security/detect-object-injection
resolve: resolve,
timer: timer
};
});
});

@@ -91,4 +80,7 @@ }

var message = { type: TYPE };
if (acknowledgement) message.handshakeConfirmation = true;else message.handshake = true;
var message = {
type: TYPE,
handshakeConfirmation: Boolean(acknowledgement),
handshake: !acknowledgement
};

@@ -99,7 +91,6 @@ targetWindow.postMessage(JSON.stringify(message), origin);

function isSafeMessage(msgSource, msgOrigin, msgType) {
var safeSource = msgSource === targetWindow;
var safeOrigin = origin === "*" || msgOrigin === origin;
var safeType = msgType === TYPE;
var jsdom = window.navigator.userAgent.indexOf("jsdom") >= 0 && msgSource === null;
return safeSource && safeOrigin && safeType;
return (msgSource === targetWindow || jsdom) && (origin === "*" || msgOrigin === origin) && msgType === TYPE;
}

@@ -128,8 +119,9 @@

}
handshakeCallback.length = 0;
handshakeCallback.clear();
var _loop = function _loop(sendItem) {
var _loop = function (sendItem) {
send(sendItem.namespace, sendItem.data, sendItem.responseId).then(function (response) {
return sendItem.resolve(response);
})["catch"](function () {
}) // eslint-disable-line promise/prefer-await-to-then
["catch"](function () {
return sendItem.resolve();

@@ -164,3 +156,3 @@ });

open: function open() {
message.isPromise = true;
message.isPromise = true; // eslint-disable-line immutable/no-mutation

@@ -179,7 +171,7 @@ return Object.assign({}, messageData, {

function handleMessage(messageData) {
if (messageData.responseId && responseResolver[messageData.responseId]) {
var resolver = responseResolver[messageData.responseId];
if (messageData.responseId && responseResolver.has(messageData.responseId)) {
var resolver = responseResolver.get(messageData.responseId);
clearTimeout(resolver.timer);
resolver.resolve(messageData);
responseResolver[messageData.responseId] = undefined;
responseResolver["delete"](messageData.responseId);
} else {

@@ -200,3 +192,2 @@ var message = createMessage(messageData);

var listener = _ref3;
listener(createMessage(message));

@@ -207,5 +198,5 @@ }

function messageListener(event) {
var ownWindow = sourceWindow || window;
ownWindow.addEventListener("message", function (event) {
var data = void 0;
try {

@@ -224,7 +215,4 @@ data = JSON.parse(event.data);

return handleMessage(data);
}
}, false);
var ownWindow = sourceWindow || window;
ownWindow.addEventListener("message", messageListener, false);
sendHandshake();

@@ -234,7 +222,11 @@

if (isHandshaken) {
if (typeof callback === "function") callback();
if (typeof callback === "function") {
callback();
}
return true;
}
handshakeCallback.push(callback);
if (typeof callback === "function") {
handshakeCallback.add(callback);
}
return false;

@@ -244,4 +236,13 @@ }

return {
addListener: addListener,
removeListener: removeListener,
addListener: function (callback) {
listeners.push(callback);
return callback;
},
removeListener: function (callback) {
var pos = listeners.indexOf(callback);
if (pos >= 0) {
listeners.splice(pos, 1);
}
},
send: send,

@@ -248,0 +249,0 @@

@@ -1,1 +0,1 @@

{"version":3,"file":"interframe.esmodules.js","sources":["../src/nextID.js","../src/index.js"],"sourcesContent":["let id = 0\n\nexport default function nextID()\n{\n id += 1\n return id\n}\n","/* eslint-disable filenames/match-exported, max-params */\n\nimport nextID from \"./nextID\"\n\nconst TYPE = \"application/interframe-ssoft-v1+json\"\nconst PROMISE_TIMEOUT = 3000\n\nfunction interframe(targetWindow, origin = \"*\", sourceWindow)\n{\n if (!targetWindow)\n {\n throw new Error(\"parameter 'targetWindow' is missing\")\n }\n\n const listeners = []\n const handshakeCallback = []\n const responseResolver = {}\n const preHandshakeSendQueue = []\n let isHandshaken = false\n\n function addListener(callback)\n {\n listeners.push(callback)\n return callback\n }\n\n function removeListener(callback)\n {\n const pos = listeners.indexOf(callback)\n\n if (pos >= 0) {\n listeners.splice(pos, 1)\n }\n }\n\n function send(namespace, data = null, responseId)\n {\n if (!namespace)\n {\n throw new Error(\"parameter 'namespace' is missing\")\n }\n if (typeof namespace !== \"string\")\n {\n throw new Error(\"parameter 'namespace' must be a string\")\n }\n\n if (!isHandshaken) {\n return new Promise((resolve) =>\n {\n preHandshakeSendQueue.push({\n namespace,\n data,\n responseId,\n resolve\n })\n })\n }\n\n const id = nextID()\n targetWindow.postMessage(JSON.stringify({\n id,\n responseId,\n type: TYPE,\n namespace,\n data\n }), origin)\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n responseResolver[id] = undefined // eslint-disable-line security/detect-object-injection\n resolve()\n }, PROMISE_TIMEOUT)\n\n responseResolver[id] = { // eslint-disable-line security/detect-object-injection\n resolve,\n timer\n }\n })\n }\n\n function sendHandshake(acknowledgement = false)\n {\n const message = { type: TYPE }\n if (acknowledgement)\n message.handshakeConfirmation = true\n else\n message.handshake = true\n\n targetWindow.postMessage(JSON.stringify(message), origin)\n }\n\n function isSafeMessage(msgSource, msgOrigin, msgType)\n {\n const safeSource = msgSource === targetWindow\n const safeOrigin = (origin === \"*\") || (msgOrigin === origin)\n const safeType = msgType === TYPE\n\n return safeSource && safeOrigin && safeType\n }\n\n function handleHandshake(data)\n {\n if (data.handshake)\n sendHandshake(true)\n\n isHandshaken = true\n\n for (const hsCallback of handshakeCallback) {\n hsCallback()\n }\n handshakeCallback.length = 0\n\n for (const sendItem of preHandshakeSendQueue) {\n send(\n sendItem.namespace,\n sendItem.data,\n sendItem.responseId\n ).then(\n (response) => sendItem.resolve(response)\n ).catch(\n () => sendItem.resolve()\n )\n }\n }\n\n function createMessage(messageData)\n {\n const message = {\n id: messageData.id,\n data: messageData.data,\n namespace: messageData.namespace,\n\n open: () => {\n message.isPromise = true\n\n return Object.assign(\n {},\n messageData,\n {\n response: (data) =>\n {\n send(messageData.namespace, data, messageData.id)\n }\n }\n )\n }\n }\n\n return message\n }\n\n function handleMessage(messageData)\n {\n if (messageData.responseId && responseResolver[messageData.responseId])\n {\n const resolver = responseResolver[messageData.responseId]\n clearTimeout(resolver.timer)\n resolver.resolve(messageData)\n responseResolver[messageData.responseId] = undefined\n }\n else\n {\n const message = createMessage(messageData)\n for (const listener of listeners)\n listener(createMessage(message))\n }\n }\n\n function messageListener(event)\n {\n let data\n\n try\n {\n data = JSON.parse(event.data)\n }\n catch (error)\n {\n return false\n }\n\n if (!isSafeMessage(event.source, event.origin, data.type))\n {\n return false\n }\n\n if (data.handshake || data.handshakeConfirmation)\n return handleHandshake(data)\n\n return handleMessage(data)\n }\n\n const ownWindow = sourceWindow || window\n ownWindow.addEventListener(\"message\", messageListener, false)\n\n sendHandshake()\n\n function hasHandshake(callback)\n {\n if (isHandshaken)\n {\n if (typeof callback === \"function\")\n callback()\n return true\n }\n\n handshakeCallback.push(callback)\n return false\n }\n\n return {\n addListener,\n removeListener,\n send,\n\n hasHandshake\n }\n}\n\nexport default interframe\n"],"names":["id","nextID","TYPE","PROMISE_TIMEOUT","interframe","targetWindow","origin","sourceWindow","Error","listeners","handshakeCallback","responseResolver","preHandshakeSendQueue","isHandshaken","addListener","callback","push","removeListener","pos","indexOf","splice","send","namespace","data","responseId","Promise","resolve","postMessage","JSON","stringify","timer","setTimeout","undefined","sendHandshake","acknowledgement","message","type","handshakeConfirmation","handshake","isSafeMessage","msgSource","msgOrigin","msgType","safeSource","safeOrigin","safeType","handleHandshake","hsCallback","length","sendItem","then","response","createMessage","messageData","isPromise","Object","assign","handleMessage","resolver","listener","messageListener","event","parse","error","source","ownWindow","window","addEventListener","hasHandshake"],"mappings":"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"}
{"version":3,"file":"interframe.esmodules.js","sources":["../src/nextID.js","../src/index.js"],"sourcesContent":["let id = 0\n\nexport default function nextID()\n{\n id += 1\n return id\n}\n","/* eslint-disable filenames/match-exported, max-params, compat/compat */\n/* eslint-env browser */\n\nimport nextID from \"./nextID\"\n\nconst TYPE = \"application/interframe-ssoft-v1+json\"\nconst PROMISE_TIMEOUT = 3000\n\nfunction interframe(targetWindow, origin = \"*\", sourceWindow) {\n if (!targetWindow) {\n throw new Error(\"parameter 'targetWindow' is missing\")\n }\n\n const listeners = []\n const handshakeCallback = new Set()\n const responseResolver = new Map()\n const preHandshakeSendQueue = []\n let isHandshaken = false\n\n function addListener(callback) {\n listeners.push(callback)\n return callback\n }\n\n function removeListener(callback) {\n const pos = listeners.indexOf(callback)\n\n if (pos >= 0) {\n listeners.splice(pos, 1)\n }\n }\n\n function send(namespace, data = null, responseId) {\n if (!namespace) {\n throw new Error(\"parameter 'namespace' is missing\")\n }\n if (typeof namespace !== \"string\") {\n throw new Error(\"parameter 'namespace' must be a string\")\n }\n\n if (!isHandshaken) {\n return new Promise((resolve) => {\n preHandshakeSendQueue.push({\n namespace,\n data,\n responseId,\n resolve\n })\n })\n }\n\n const id = nextID()\n targetWindow.postMessage(\n JSON.stringify({\n id,\n responseId,\n type: TYPE,\n namespace,\n data\n }),\n origin\n )\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n responseResolver.delete(id)\n resolve()\n }, PROMISE_TIMEOUT)\n\n responseResolver.set(id, {\n // eslint-disable-line security/detect-object-injection\n resolve,\n timer\n })\n })\n }\n\n function sendHandshake(acknowledgement = false) {\n const message = {\n type: TYPE,\n handshakeConfirmation: Boolean(acknowledgement),\n handshake: !acknowledgement\n }\n\n targetWindow.postMessage(JSON.stringify(message), origin)\n }\n\n function isSafeMessage(msgSource, msgOrigin, msgType) {\n const jsdom = window.navigator.userAgent.indexOf(\"jsdom\") >= 0 && msgSource === null\n const safeSource = msgSource === targetWindow || jsdom\n const safeOrigin = origin === \"*\" || msgOrigin === origin\n const safeType = msgType === TYPE\n\n return safeSource && safeOrigin && safeType\n }\n\n function handleHandshake(data) {\n if (data.handshake) sendHandshake(true)\n\n isHandshaken = true\n\n for (const hsCallback of handshakeCallback) {\n hsCallback()\n }\n handshakeCallback.clear()\n\n for (const sendItem of preHandshakeSendQueue) {\n send(sendItem.namespace, sendItem.data, sendItem.responseId)\n .then((response) => sendItem.resolve(response)) // eslint-disable-line promise/prefer-await-to-then\n .catch(() => sendItem.resolve())\n }\n }\n\n function createMessage(messageData) {\n const message = {\n id: messageData.id,\n data: messageData.data,\n namespace: messageData.namespace,\n\n open: () => {\n message.isPromise = true // eslint-disable-line immutable/no-mutation\n\n return Object.assign({}, messageData, {\n response: (data) => {\n send(messageData.namespace, data, messageData.id)\n }\n })\n }\n }\n\n return message\n }\n\n function handleMessage(messageData) {\n if (messageData.responseId && responseResolver.has(messageData.responseId)) {\n const resolver = responseResolver.get(messageData.responseId)\n clearTimeout(resolver.timer)\n resolver.resolve(messageData)\n responseResolver.delete(messageData.responseId)\n } else {\n const message = createMessage(messageData)\n for (const listener of listeners) listener(createMessage(message))\n }\n }\n\n function messageListener(event) {\n let data\n try {\n data = JSON.parse(event.data)\n } catch (error) {\n return false\n }\n\n if (!isSafeMessage(event.source, event.origin, data.type)) {\n return false\n }\n\n if (data.handshake || data.handshakeConfirmation) return handleHandshake(data)\n\n return handleMessage(data)\n }\n\n const ownWindow = sourceWindow || window\n ownWindow.addEventListener(\"message\", messageListener, false)\n\n sendHandshake()\n\n function hasHandshake(callback) {\n if (isHandshaken) {\n if (typeof callback === \"function\") {\n callback()\n }\n return true\n }\n\n if (typeof callback === \"function\") {\n handshakeCallback.add(callback)\n }\n return false\n }\n\n return {\n addListener,\n removeListener,\n send,\n\n hasHandshake\n }\n}\n\nexport default interframe\n"],"names":["id","nextID","TYPE","PROMISE_TIMEOUT","interframe","targetWindow","origin","sourceWindow","Error","listeners","handshakeCallback","Set","responseResolver","Map","preHandshakeSendQueue","isHandshaken","send","namespace","data","responseId","Promise","resolve","push","postMessage","JSON","stringify","timer","setTimeout","set","sendHandshake","acknowledgement","message","Boolean","isSafeMessage","msgSource","msgOrigin","msgType","jsdom","window","navigator","userAgent","indexOf","handleHandshake","handshake","hsCallback","clear","sendItem","then","response","createMessage","messageData","isPromise","Object","assign","handleMessage","has","resolver","get","listener","ownWindow","addEventListener","event","parse","error","source","type","handshakeConfirmation","hasHandshake","callback","add","pos","splice"],"mappings":"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"}
{
"name": "interframe",
"version": "1.3.1",
"version": "1.4.0",
"description": "postMessage web api based lightweight interframe communication layer",

@@ -31,9 +31,13 @@ "main": "lib/interframe.commonjs.js",

"devDependencies": {
"jest": "^20.0.4",
"prepublish": "^1.1.3",
"prettier": "^1.5.3",
"readable-code": "^3.4.5",
"release-it": "^2.8.2",
"rimraf": "^2.6.1"
"babel-core": "^6.26.0",
"babel-jest": "^22.2.2",
"eslint": "^4.17.0",
"eslint-config-readable": "^1.10.2",
"jest": "^22.2.2",
"jsdom": "^11.6.2",
"prepublish": "^1.6.2",
"prettier": "^1.10.2",
"release-it": "^7.0.2",
"rimraf": "^2.6.2"
}
}