import { log } from './../logger/Logger'; import { IframeMessageRequest } from '../message/IframeMessageRequest' import { IframeMessageResponse } from '../message/IframeMessageResponse' import { nanoid } from "nanoid" import { EventEmitter } from 'events' /** * send message to sub iframe page and revice messge * */ export class IframeMessageService extends EventEmitter { //target window to send Message subWindow: Window //all promise resolves resolves: Map = new Map() constructor(target: Window) { super() this.subWindow = target globalThis.addEventListener('message', (event) => this.reciveMessage(event), false) } async sendMessage(payload: IframeMessageRequest): Promise { return new Promise((resolve) => { let requestId = nanoid() log("send message", { requestId, payload }) this.subWindow.postMessage({ requestId, payload }, "*") this.resolves.set(requestId, resolve) }) } /** * 接收子页面返回的消息 */ reciveMessage({ data }: MessageEvent): void { log("recive data", data) if (data !== undefined) { let { requestId, payload } = data if (requestId !== undefined) { let resolve = this.resolves.get(requestId) if (resolve !== undefined) { log("promise back") //处理异步返回 this.resolves.delete(requestId) resolve(payload) } else { log("pop event ") //直接上报消息 let { type, data } = payload this.emit(type, data) } } } } }