taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit e4f2587cabdcea92d2096114393aa1daca610671
parent ea1aff81df642000a1c458a91fc8aee239d3bd3a
Author: Florian Dold <florian@dold.me>
Date:   Sun, 16 Oct 2022 23:11:34 +0200

webextension: introduce typesafe wallet-core API client

Diffstat:
Mpackages/taler-wallet-core/src/wallet-api-types.ts | 12+++++++-----
Mpackages/taler-wallet-webextension/src/wxApi.ts | 41+++++++++++++++++++++++++++++++++++------
2 files changed, 42 insertions(+), 11 deletions(-)

diff --git 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<Op extends WalletApiOperation & keyof WalletOperations>( + call<Op extends WalletCoreOpKeys>( operation: Op, - payload: RequestType<Op>, - ): Promise<ResponseType<Op>>; + payload: WalletCoreRequestType<Op>, + ): Promise<WalletCoreResponseType<Op>>; } diff --git 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<any> { let response: CoreApiResponse; try { @@ -136,13 +144,31 @@ async function callBackend(operation: string, payload: any): Promise<any> { return response.result; } -/** - * Start refreshing a coin. - */ -export function refresh(coinPub: string): Promise<void> { - return callBackend("refresh-coin", { coinPub }); +export class WxWalletCoreApiClient implements WalletCoreApiClient { + async call<Op extends WalletCoreOpKeys>( + operation: Op, + payload: WalletCoreRequestType<Op>, + ): Promise<WalletCoreResponseType<Op>> { + 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<ConfirmPayResult> { - return callBackend("confirmPay", { proposalId, sessionId }); + return wxClient.call(WalletApiOperation.ConfirmPay, { + proposalId, + sessionId, + }); } /**