UNPKG

penpal

Version:

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

66 lines (54 loc) 2.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _connectCallReceiver = _interopRequireDefault(require("../connectCallReceiver")); var _connectCallSender = _interopRequireDefault(require("../connectCallSender")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Handles an ACK handshake message. */ var _default = (methods, childOrigin, originForSending, destructor, log) => { const { destroy, onDestroy } = destructor; let destroyCallReceiver; let receiverMethodNames; // We resolve the promise with the call sender. If the child reconnects // (for example, after refreshing or navigating to another page that // uses Penpal, we'll update the call sender with methods that match the // latest provided by the child. const callSender = {}; return event => { if (event.origin !== childOrigin) { log("Parent: Handshake - Received ACK message from origin ".concat(event.origin, " which did not match expected origin ").concat(childOrigin)); return; } log('Parent: Handshake - Received ACK'); const info = { localName: 'Parent', local: window, remote: event.source, originForSending: originForSending, originForReceiving: childOrigin }; // If the child reconnected, we need to destroy the prior call receiver // before setting up a new one. if (destroyCallReceiver) { destroyCallReceiver(); } destroyCallReceiver = (0, _connectCallReceiver.default)(info, methods, log); onDestroy(destroyCallReceiver); // If the child reconnected, we need to remove the methods from the // previous call receiver off the sender. if (receiverMethodNames) { receiverMethodNames.forEach(receiverMethodName => { delete callSender[receiverMethodName]; }); } receiverMethodNames = event.data.methodNames; const destroyCallSender = (0, _connectCallSender.default)(callSender, info, receiverMethodNames, destroy, log); onDestroy(destroyCallSender); return callSender; }; }; exports.default = _default;