@kontent-ai/smart-link
Version:
Kontent.ai Smart Link SDK allowing to automatically inject [smart links](https://docs.kontent.ai/tutorials/develop-apps/build-strong-foundation/set-up-editing-from-preview#a-using-smart-links) to Kontent.ai according to manually specified [HTML data attri
64 lines • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IFrameCommunicator = void 0;
const errors_1 = require("../utils/errors");
const events_1 = require("../utils/events");
const iframe_1 = require("../utils/iframe");
const request_1 = require("../utils/request");
const IFrameCommunicatorTypes_1 = require("./IFrameCommunicatorTypes");
class IFrameCommunicator {
events = new Map();
// biome-ignore lint/suspicious/noExplicitAny: Callbacks for different requestIds have different payload types; the map cannot preserve per-key generics, so the type is intentionally erased here.
callbacks = new Map();
initialize() {
// window === undefined crashes
if (typeof window === "undefined") {
throw new errors_1.InvalidEnvironmentError("IFrameCommunicator can only be initialized in a browser environment.");
}
window.addEventListener("message", this.onMessage, true);
}
destroy() {
this.events = new Map();
window.removeEventListener("message", this.onMessage, true);
}
sendMessageWithResponse = (type, data, callback, metadata) => {
const requestId = (0, request_1.createRequestId)();
if (callback) {
this.callbacks.set(requestId, callback);
}
this.sendMessage(type, data, metadata, requestId);
};
sendMessage = (type, data, metadata, requestId) => {
if (!(0, iframe_1.isInsideIFrame)()) {
throw new errors_1.InvalidEnvironmentError("IFrameCommunicator: iframe message can only be send while inside iframe.");
}
const message = { type, data, metadata, requestId };
window.parent.postMessage(message, "*");
};
addMessageListener = (type, listener) => {
(0, events_1.addListener)(this.events, type, listener);
};
removeMessageListener = (type, listener) => {
(0, events_1.removeListener)(this.events, type, listener);
};
onMessage = (event) => {
if (event.data === undefined) {
return;
}
// biome-ignore lint/suspicious/noExplicitAny: Required to bypass TypeScript's inability to correlate discriminated union properties (type/data/metadata) when spreading as function arguments.x
const message = event.data;
(0, events_1.emitEvents)(this.events, message.type, message.data, message.metadata);
if (message.requestId !== undefined) {
this.executeCallback(message.requestId, message.data);
}
};
executeCallback = (requestId, data) => {
const callback = this.callbacks.get(requestId);
if (callback) {
callback(data);
this.callbacks.delete(requestId);
}
};
}
exports.IFrameCommunicator = IFrameCommunicator;
//# sourceMappingURL=IFrameCommunicator.js.map