interframe
Advanced tools
+1
| 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 |
@@ -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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"} |
+11
-7
| { | ||
| "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" | ||
| } | ||
| } |
38195
3.45%9
28.57%391
2.62%10
66.67%