diff options
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform/chrome.ts')
-rw-r--r-- | packages/taler-wallet-webextension/src/platform/chrome.ts | 80 |
1 files changed, 41 insertions, 39 deletions
diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts b/packages/taler-wallet-webextension/src/platform/chrome.ts index 7785e19ef..f951685d2 100644 --- a/packages/taler-wallet-webextension/src/platform/chrome.ts +++ b/packages/taler-wallet-webextension/src/platform/chrome.ts @@ -20,9 +20,13 @@ import { Logger, TalerUriType, } from "@gnu-taler/taler-util"; +import { WalletOperations } from "@gnu-taler/taler-wallet-core"; +import { BackgroundOperations } from "../wxApi.js"; import { CrossBrowserPermissionsApi, MessageFromBackend, + MessageFromFrontend, + MessageResponse, Permissions, PlatformAPI, } from "./api.js"; @@ -41,11 +45,11 @@ const api: PlatformAPI = { redirectTabToWalletPage, registerAllIncomingConnections, registerOnInstalled, - listenToAllChannels, + listenToAllChannels: listenToAllChannels as any, registerReloadOnNewVersion, registerTalerHeaderListener, sendMessageToAllChannels, - sendMessageToWalletBackground, + sendMessageToBackground, useServiceWorkerAsBackgroundProcess, containsTalerHeaderListener, keepAlive, @@ -302,30 +306,22 @@ function openWalletPageFromPopup(page: string): void { let i = 0; -async function sendMessageToWalletBackground( - operation: string, - payload: any, -): Promise<any> { - return new Promise<any>((resolve, reject) => { - logger.trace("send operation to the wallet background", operation); - chrome.runtime.sendMessage( - { operation, payload, id: `id_${i++ % 1000}` }, - (backgroundResponse) => { - logger.trace( - "BUG: got response from background", - backgroundResponse, - chrome.runtime.lastError, - ); +async function sendMessageToBackground< + Op extends WalletOperations | BackgroundOperations, +>(message: MessageFromFrontend<Op>): Promise<MessageResponse> { + const messageWithId = { ...message, id: `id_${i++ % 1000}` }; - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError.message); - } else { - resolve(backgroundResponse); - } - // return true to keep the channel open - return true; - }, - ); + return new Promise<any>((resolve, reject) => { + logger.trace("send operation to the wallet background", message); + chrome.runtime.sendMessage(messageWithId, (backgroundResponse) => { + if (chrome.runtime.lastError) { + reject(chrome.runtime.lastError.message); + } else { + resolve(backgroundResponse); + } + // return true to keep the channel open + return true; + }); }); } @@ -377,21 +373,27 @@ function registerAllIncomingConnections(): void { } function listenToAllChannels( - cb: ( - message: any, - sender: any, - callback: (r: CoreApiResponse) => void, - ) => void, + notifyNewMessage: <Op extends WalletOperations | BackgroundOperations>( + message: MessageFromFrontend<Op> & { id: string }, + ) => Promise<MessageResponse>, ): void { - chrome.runtime.onMessage.addListener((m, s, c) => { - cb(m, s, (apiResponse) => { - logger.trace("BUG: sending response to client", apiResponse); - try { - c(apiResponse); - } catch (e) { - logger.error("wallet operation ended with error", e); - } - }); + chrome.runtime.onMessage.addListener((message, sender, reply) => { + notifyNewMessage(message) + .then((apiResponse) => { + try { + reply(apiResponse); + } catch (e) { + logger.error( + "sending response to frontend failed", + message, + apiResponse, + e, + ); + } + }) + .catch((e) => { + logger.error("notify to background failed", e); + }); // keep the connection open return true; |