import { TypedRequest } from '@apiglobal/typedrequest'; import * as plugins from './dees-comms.plugins.js'; let BroadcastChannel = globalThis.BroadcastChannel; if (!BroadcastChannel) { BroadcastChannel = plugins.BroadCastChannelPolyfill as any; } /** * a comm class for client side communication between workers and tabs. */ export class DeesComms { // sending messages private postChannel = new BroadcastChannel('dees-comms'); public typedrouter = new plugins.typedrequest.TypedRouter(); public typedtarget = new plugins.typedrequest.TypedTarget({ postMethodWithTypedRouter: async (messageArg) => { this.postMessage(messageArg); }, typedRouterRef: this.typedrouter, }); // receiving messages private subscriptionChannel = new BroadcastChannel('dees-comms'); constructor() { this.subscriptionChannel.onmessage = async (eventArg) => { const message = (eventArg as any).method ? eventArg : eventArg.data; console.log(JSON.stringify(message)); const response = await this.typedrouter.routeAndAddResponse(message); if (response) { this.postMessage(response); } }; } /** * creates a typedrequest with this classes postMessage as postMethod */ public createTypedRequest( methodName: T['method'] ): TypedRequest { const typedrequest = new plugins.typedrequest.TypedRequest(this.typedtarget, methodName); return typedrequest; } /** * posts a typedrequestmessage */ public async postMessage( messageArg: T ): Promise { this.postChannel.postMessage(messageArg); } /** * subscribe to messages */ public async createTypedHandler( methodArg: T['method'], handlerFunction: plugins.typedrequest.THandlerFunction ) { this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler(methodArg, handlerFunction) ); } }