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