diff options
author | Sebastian <sebasjm@gmail.com> | 2023-04-18 10:47:53 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-04-18 10:47:53 -0300 |
commit | b34f3568e8c9dde73f11583a6b46ef1509990397 (patch) | |
tree | 2898223d8e67023dbfd2d338eb145bd06b737a71 /packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts | |
parent | b1a0d034fc1be0824e1eac46661604558264beee (diff) | |
download | wallet-core-b34f3568e8c9dde73f11583a6b46ef1509990397.tar.xz |
check if the script should be injected
remove header listener
Diffstat (limited to 'packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts')
-rw-r--r-- | packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts | 76 |
1 files changed, 73 insertions, 3 deletions
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 <http://www.gnu.org/licenses/> */ +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<Op extends keyof ExtensionOperations> = { + channel: "extension"; + operation: Op; + payload: ExtensionOperations[Op]["request"]; +}; + +export type MessageResponse = CoreApiResponse; + +async function callBackground<Op extends keyof ExtensionOperations>( + operation: Op, + payload: ExtensionOperations[Op]["request"], +): Promise<ExtensionOperations[Op]["response"]> { + const message: MessageFromExtension<Op> = { + 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<Op extends keyof ExtensionOperations>( + message: MessageFromExtension<Op>, +): Promise<MessageResponse> { + const messageWithId = { ...message, id: `id_${nextMessageIndex++ % 1000}` }; + + return new Promise<any>((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(); |