penpal
Version:
A promise-based library for communicating with iframes via postMessage.
66 lines (54 loc) • 2.16 kB
JavaScript
;
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;