UNPKG

penpal

Version:

A promise-based library for communicating with iframes via postMessage.

58 lines (48 loc) 2.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _enums = require("../enums"); var _connectCallReceiver = _interopRequireDefault(require("../connectCallReceiver")); var _connectCallSender = _interopRequireDefault(require("../connectCallSender")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Handles a SYN-ACK handshake message. */ var _default = (parentOrigin, serializedMethods, destructor, log) => { const { destroy, onDestroy } = destructor; return event => { let originQualifies = parentOrigin instanceof RegExp ? parentOrigin.test(event.origin) : parentOrigin === '*' || parentOrigin === event.origin; if (!originQualifies) { log("Child: Handshake - Received SYN-ACK from origin ".concat(event.origin, " which did not match expected origin ").concat(parentOrigin)); return; } log('Child: Handshake - Received SYN-ACK, responding with ACK'); // If event.origin is "null", the remote protocol is file: or data: and we // must post messages with "*" as targetOrigin when sending messages. // https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Using_window.postMessage_in_extensions const originForSending = event.origin === 'null' ? '*' : event.origin; const ackMessage = { penpal: _enums.MessageType.Ack, methodNames: Object.keys(serializedMethods) }; window.parent.postMessage(ackMessage, originForSending); const info = { localName: 'Child', local: window, remote: window.parent, originForSending, originForReceiving: event.origin }; const destroyCallReceiver = (0, _connectCallReceiver.default)(info, serializedMethods, log); onDestroy(destroyCallReceiver); const callSender = {}; const destroyCallSender = (0, _connectCallSender.default)(callSender, info, event.data.methodNames, destroy, log); onDestroy(destroyCallSender); return callSender; }; }; exports.default = _default;