summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/taler-wallet-interaction-loader.ts
diff options
context:
space:
mode:
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.ts76
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();