import { Log } from "../log/main"; export const ProtocolMain = { isReady: false, ready() { this.isReady = true; }, url: null, async queue(url: string) { this.url = url; await this.runProtocol(); }, async runProtocol() { return new Promise(async (resolve) => { const run = async () => { if (!this.isReady) { setTimeout(run, 100); return; } if (!this.url) { Log.info( "ProtocolMain.runProtocol.url.Empty", this.filePath, ); return; } const url = this.url; const urlInfo = new URL(url); const command = urlInfo.hostname; const param = urlInfo.searchParams; Log.info("ProtocolMain.runProtocol", { command, param, url, urlInfo, }); if (!command) { Log.info("ProtocolMain.runProtocol.command.Empty", url); return; } if (!this.commandListeners[command]) { Log.info( "ProtocolMain.runProtocol.command.NotFound", command, ); return; } for (const callback of this.commandListeners[command]) { callback(Object.fromEntries(param.entries())); } resolve(undefined); }; run().then(); }); }, commandListeners: {} as { [command: string]: Array<(params: { [key: string]: string }) => void>; }, register( command: string, callback: (params: { [key: string]: string }) => void, ) { if (!this.commandListeners[command]) { this.commandListeners[command] = []; } this.commandListeners[command].push(callback); }, unregister( command: string, callback: (params: { [key: string]: string }) => void, ) { if (!this.commandListeners[command]) { return; } const index = this.commandListeners[command].indexOf(callback); if (index >= 0) { this.commandListeners[command].splice(index, 1); } }, }; export default ProtocolMain;