aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/platform/chrome.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform/chrome.ts')
-rw-r--r--packages/taler-wallet-webextension/src/platform/chrome.ts80
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;