diff --git a/frontends/web/src/utils/qttransport.ts b/frontends/web/src/utils/qttransport.ts index dd6e4e0e42..a4be6707cd 100644 --- a/frontends/web/src/utils/qttransport.ts +++ b/frontends/web/src/utils/qttransport.ts @@ -19,46 +19,36 @@ import { QWebChannel } from './qwebchannel'; import { TMsgCallback, TQueryPromiseMap } from './transport-common'; import { runningInQtWebEngine } from './env'; -let cache: any = null; let webChannel: any = null; let queryID: number = 0; const queryPromises: TQueryPromiseMap = {}; const currentListeners: TMsgCallback[] = []; -function initTransport() { - return new Promise((resolve, reject) => { - if (webChannel) { - resolve(webChannel); - } else if (cache) { - const check = function() { - if (webChannel) { - resolve(webChannel); - } else { - window.setTimeout(check, 1); - } - }; - check(); - } else if (runningInQtWebEngine()) { - const initWebChannel = function(channel: any) { - webChannel = channel; - webChannel.objects.backend.gotResponse.connect(( - queryID: number, - response: string, - ) => { - queryPromises[queryID].resolve(JSON.parse(response)); - delete queryPromises[queryID]; - }); - webChannel.objects.backend.pushNotify.connect((msg: string) => { - currentListeners.forEach(listener => listener(JSON.parse(msg))); - }); - resolve(webChannel); - - }; - cache = new QWebChannel((window.qt!).webChannelTransport, initWebChannel); - } else { - reject(); - } - }); +async function initTransport() { + if (!runningInQtWebEngine()) { + throw new Error('Must be running in Qt'); + } + if (webChannel) { + return webChannel; + } + const initWebChannel = function(channel: any) { + channel.objects.backend.gotResponse.connect(( + queryID: number, + response: string, + ) => { + queryPromises[queryID].resolve(JSON.parse(response)); + delete queryPromises[queryID]; + }); + channel.objects.backend.pushNotify.connect((msg: string) => { + currentListeners.forEach(listener => listener(JSON.parse(msg))); + }); + webChannel = channel; + }; + new QWebChannel((window.qt!).webChannelTransport, initWebChannel); + while (!webChannel) { + await new Promise(r => setTimeout(r, 1)); + } + return webChannel; } export function call(query: string) {