UNPKG

@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
"use strict"; 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