From b34f3568e8c9dde73f11583a6b46ef1509990397 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 18 Apr 2023 10:47:53 -0300 Subject: check if the script should be injected remove header listener --- .../src/taler-wallet-interaction-loader.ts | 76 +++++++++++++++++++++- 1 file changed, 73 insertions(+), 3 deletions(-) (limited to 'packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts') diff --git a/packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts b/packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts index 838b47397..cc5a02260 100644 --- a/packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts +++ b/packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts @@ -14,6 +14,8 @@ GNU Taler; see the file COPYING. If not, see */ +import { CoreApiResponse } from "@gnu-taler/taler-util"; + /** * This will modify all the pages that the user load when navigating with Web Extension enabled * @@ -62,7 +64,7 @@ const logger = { console.error(`${new Date().toISOString()} TALER`, ...msg), }; -function start() { +async function start() { if (shouldNotInject) { return; } @@ -73,8 +75,15 @@ function start() { } createBridgeWithExtension(); logger.debug("bridged created"); - injectTalerSupportScript(debugEnabled); - logger.debug("done"); + + const shouldInject = await callBackground("isInjectionEnabled", undefined); + + if (shouldInject) { + injectTalerSupportScript(debugEnabled); + logger.debug("injection completed"); + } else { + logger.debug("injection is not enabled"); + } } /** @@ -132,4 +141,65 @@ function createBridgeWithExtension() { ); } +export interface ExtensionOperations { + isInjectionEnabled: { + request: void; + response: boolean; + }; +} + +export type MessageFromExtension = { + channel: "extension"; + operation: Op; + payload: ExtensionOperations[Op]["request"]; +}; + +export type MessageResponse = CoreApiResponse; + +async function callBackground( + operation: Op, + payload: ExtensionOperations[Op]["request"], +): Promise { + const message: MessageFromExtension = { + channel: "extension", + operation, + payload, + }; + + const response = await sendMessageToBackground(message); + if (response.type === "error") { + throw new Error(`Background operation "${operation}" failed`); + } + return response.result as any; +} +let nextMessageIndex = 0; +async function sendMessageToBackground( + message: MessageFromExtension, +): Promise { + const messageWithId = { ...message, id: `id_${nextMessageIndex++ % 1000}` }; + + return new Promise((resolve, reject) => { + // logger.trace("send operation to the wallet background", message); + let timedout = false; + const timerId = setTimeout(() => { + timedout = true; + throw new Error("timeout"); + // throw TalerError.fromDetail(TalerErrorCode.GENERIC_TIMEOUT, {}); + }, 5 * 1000); //five seconds + chrome.runtime.sendMessage(messageWithId, (backgroundResponse) => { + if (timedout) { + return false; //already rejected + } + clearTimeout(timerId); + if (chrome.runtime.lastError) { + reject(chrome.runtime.lastError.message); + } else { + resolve(backgroundResponse); + } + // return true to keep the channel open + return true; + }); + }); +} + start(); -- cgit v1.2.3