import type { AddPushEventListener, DispatchPushEvent, EventType, PushEvent, PushEventListenerCallback, } from "../api"; class MapOfArrays { private readonly map = new Map(); add(key: K, value: V) { const currentValues = this.get(key); this.map.set(key, currentValues.concat(value)); } removeFrom(key: K, value: V) { const currentValues = this.get(key); this.map.set( key, currentValues.filter((val) => val !== value), ); } get(key: K) { return this.map.get(key) ?? []; } } /** * This handler is used for non-iframe push event communication. * The embedder dispatches events triggering listeners registered by the client. */ export class DefaultEventHandler implements AddPushEventListener, DispatchPushEvent { private readonly callbacksMap = new MapOfArrays< EventType, PushEventListenerCallback >(); addPushEventListener( eventType: EventType, callback: PushEventListenerCallback, ): () => void { this.callbacksMap.add( eventType, callback as PushEventListenerCallback, ); return () => this.callbacksMap.removeFrom( eventType, callback as PushEventListenerCallback, ); } dispatchPushEvent(event: PushEvent) { this.callbacksMap .get(event.eventType) .forEach((callback) => callback(event.payload)); } }