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

56 lines 2.13 kB
import { isInsideIFrame } from '../utils/iframe'; import { addListener, emitEvents, removeListener } from '../utils/events'; import { IFrameMessageType, } from './IFrameCommunicatorTypes'; import { createRequestId } from '../utils/request'; import { InvalidEnvironmentError } from '../utils/errors'; export class IFrameCommunicator { events = new Map(); callbacks = new Map(); initialize() { if (!window) { throw 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 = createRequestId(); if (callback) { this.callbacks.set(requestId, callback); } this.sendMessage(type, data, metadata, requestId); }; sendMessage = (type, data, metadata, requestId) => { if (!isInsideIFrame()) { throw InvalidEnvironmentError('IFrameCommunicator: iframe message can only be send while inside iframe.'); } const message = { type, data, metadata, requestId }; window.parent.postMessage(message, '*'); }; addMessageListener = (type, listener) => { addListener(this.events, type, listener); }; removeMessageListener = (type, listener) => { removeListener(this.events, type, listener); }; onMessage = (event) => { if (!event.data) return; const message = event.data; emitEvents(this.events, message.type, message.data, message.metadata); if (message.requestId) { this.executeCallback(message.requestId, message.data); } }; executeCallback = (requestId, data) => { const callback = this.callbacks.get(requestId); if (callback) { callback(data); this.callbacks.delete(requestId); } }; } //# sourceMappingURL=IFrameCommunicator.js.map