import { Operations, getSequenceID } from '../models/Commons'; const isDev = false; export function setPostListener() { window.addEventListener('message', postMessageListener, false); } export function getUrlParameterByName(name: string, url?: string) { if (!url) { url = window.location.href; } name = name.replace(/[\[\]]/g, '\\$&'); const regex = new RegExp('[?&]' + name + '(=([^&#]*))'), results = regex.exec(url); if (!results) { return null; } if (!results[2]) { return null; } return decodeURIComponent(results[2].replace(/\+/g, ' ')); } const callbacks: { [id: string]: Function } = {}; const registeredEvents: { [operation: number]: () => Promise } = {}; export function sendRequestToFramework(operation: Operations, data?: any[]): Promise { const result = new Promise((resolve, reject) => { const requestId = getSequenceID(); callbacks[requestId] = (data: any, errors?: any) => { if (errors !== undefined) { reject(errors); } else { resolve(data); } }; const message = { id: requestId, operation: operation, data: data }; window.parent.postMessage(JSON.stringify(message), '*'); }); return result; } export function sendRegisterRequestToFramework(eventHandler: (...params: any[]) => Promise, operation: Operations): Promise { const result = new Promise((resolve, reject) => { const requestId = getSequenceID(); registeredEvents[operation] = eventHandler; callbacks[requestId] = (data: any, errors?: any) => { if (errors !== undefined) { delete registeredEvents[operation]; reject(errors); } else { resolve(); } }; const message = { id: requestId, registerOperation: operation }; window.parent.postMessage(JSON.stringify(message), '*'); }); return result; } function postMessageListener(event: MessageEvent) { if (!isJSON(event.data)) { return; } try { const message = JSON.parse(event.data); if ('isResponse' in message) { if (message.request && message.request.id && callbacks[message.request.id]) { callbacks[message.request.id](message.resolve, message.reject); delete callbacks[message.request.id]; } } else { if ('operation' in message && registeredEvents[message.operation]) { registeredEvents[message.operation](...message.data).then( (value: any) => sendResponse(message, true, value), (value: any) => sendResponse(message, false, value) ); } } } catch (e) {} } function isJSON(input: any) { try { JSON.parse(input); } catch (e) { return false; } return true; } function sendResponse(request: IRequest, resolves: boolean, data: any) { const response: IResponse = { request: request, isResponse: true, reject: resolves ? undefined : data, resolve: resolves ? data : undefined }; window.parent.postMessage(JSON.stringify(response), '*'); } export interface IResponse { request: IRequest; isResponse: boolean; reject: any; resolve: any; } export interface IRequest { operation: Operations; data: any[]; }