From e4f2587cabdcea92d2096114393aa1daca610671 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sun, 16 Oct 2022 23:11:34 +0200 Subject: webextension: introduce typesafe wallet-core API client --- packages/taler-wallet-core/src/wallet-api-types.ts | 12 ++++--- packages/taler-wallet-webextension/src/wxApi.ts | 41 ++++++++++++++++++---- 2 files changed, 42 insertions(+), 11 deletions(-) (limited to 'packages') diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index 88e66ff9e..354681734 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -707,17 +707,19 @@ export type WalletOperations = { [WalletApiOperation.SetDevMode]: SetDevModeOp; }; -export type RequestType< +export type WalletCoreRequestType< Op extends WalletApiOperation & keyof WalletOperations, > = WalletOperations[Op] extends { request: infer T } ? T : never; -export type ResponseType< +export type WalletCoreResponseType< Op extends WalletApiOperation & keyof WalletOperations, > = WalletOperations[Op] extends { response: infer T } ? T : never; +export type WalletCoreOpKeys = WalletApiOperation & keyof WalletOperations; + export interface WalletCoreApiClient { - call( + call( operation: Op, - payload: RequestType, - ): Promise>; + payload: WalletCoreRequestType, + ): Promise>; } diff --git a/packages/taler-wallet-webextension/src/wxApi.ts b/packages/taler-wallet-webextension/src/wxApi.ts index 17083cb5b..ffb08e648 100644 --- a/packages/taler-wallet-webextension/src/wxApi.ts +++ b/packages/taler-wallet-webextension/src/wxApi.ts @@ -85,7 +85,12 @@ import { PendingOperationsResponse, RemoveBackupProviderRequest, TalerError, + WalletApiOperation, WalletContractData, + WalletCoreApiClient, + WalletCoreOpKeys, + WalletCoreRequestType, + WalletCoreResponseType, } from "@gnu-taler/taler-wallet-core"; import { MessageFromBackend, platform } from "./platform/api.js"; @@ -121,6 +126,9 @@ export interface UpgradeResponse { oldDbVersion: string; } +/** + * @deprecated Use {@link WxWalletCoreApiClient} instead. + */ async function callBackend(operation: string, payload: any): Promise { let response: CoreApiResponse; try { @@ -136,13 +144,31 @@ async function callBackend(operation: string, payload: any): Promise { return response.result; } -/** - * Start refreshing a coin. - */ -export function refresh(coinPub: string): Promise { - return callBackend("refresh-coin", { coinPub }); +export class WxWalletCoreApiClient implements WalletCoreApiClient { + async call( + operation: Op, + payload: WalletCoreRequestType, + ): Promise> { + let response: CoreApiResponse; + try { + response = await platform.sendMessageToWalletBackground( + operation, + payload, + ); + } catch (e) { + console.log("Error calling backend"); + throw new Error(`Error contacting backend: ${e}`); + } + logger.info("got response", response); + if (response.type === "error") { + throw TalerError.fromUncheckedDetail(response.error); + } + return response.result as any; + } } +const wxClient = new WxWalletCoreApiClient(); + /** * Pay for a proposal. */ @@ -150,7 +176,10 @@ export function confirmPay( proposalId: string, sessionId: string | undefined, ): Promise { - return callBackend("confirmPay", { proposalId, sessionId }); + return wxClient.call(WalletApiOperation.ConfirmPay, { + proposalId, + sessionId, + }); } /** -- cgit v1.2.3