diff options
author | Florian Dold <florian.dold@gmail.com> | 2020-08-03 13:00:48 +0530 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2020-08-03 13:01:05 +0530 |
commit | ffd2a62c3f7df94365980302fef3bc3376b48182 (patch) | |
tree | 270af6f16b4cc7f5da2afdba55c8bc9dbea5eca5 /src/walletCoreApiHandler.ts | |
parent | aa481e42675fb7c4dcbbeec0ba1c61e1953b9596 (diff) | |
download | wallet-core-ffd2a62c3f7df94365980302fef3bc3376b48182.tar.xz |
modularize repo, use pnpm, improve typechecking
Diffstat (limited to 'src/walletCoreApiHandler.ts')
-rw-r--r-- | src/walletCoreApiHandler.ts | 325 |
1 files changed, 0 insertions, 325 deletions
diff --git a/src/walletCoreApiHandler.ts b/src/walletCoreApiHandler.ts deleted file mode 100644 index 7ab6a6284..000000000 --- a/src/walletCoreApiHandler.ts +++ /dev/null @@ -1,325 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2020 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -import { Wallet } from "./wallet"; -import { - OperationFailedError, - OperationFailedAndReportedError, - makeErrorDetails, -} from "./operations/errors"; -import { TalerErrorCode } from "./TalerErrorCode"; -import { codecForTransactionsRequest } from "./types/transactions"; -import { - makeCodecForObject, - codecForString, - Codec, - makeCodecOptional, -} from "./util/codec"; -import { Amounts } from "./util/amounts"; -import { OperationErrorDetails } from "./types/walletTypes"; - -interface AddExchangeRequest { - exchangeBaseUrl: string; -} - -const codecForAddExchangeRequest = (): Codec<AddExchangeRequest> => - makeCodecForObject<AddExchangeRequest>() - .property("exchangeBaseUrl", codecForString) - .build("AddExchangeRequest"); - -interface GetExchangeTosRequest { - exchangeBaseUrl: string; -} - -const codecForGetExchangeTosRequest = (): Codec<GetExchangeTosRequest> => - makeCodecForObject<GetExchangeTosRequest>() - .property("exchangeBaseUrl", codecForString) - .build("GetExchangeTosRequest"); - -interface AcceptManualWithdrawalRequest { - exchangeBaseUrl: string; - amount: string; -} - -const codecForAcceptManualWithdrawalRequet = (): Codec< - AcceptManualWithdrawalRequest -> => - makeCodecForObject<AcceptManualWithdrawalRequest>() - .property("exchangeBaseUrl", codecForString) - .property("amount", codecForString) - .build("AcceptManualWithdrawalRequest"); - -interface GetWithdrawalDetailsForAmountRequest { - exchangeBaseUrl: string; - amount: string; -} - -interface AcceptBankIntegratedWithdrawalRequest { - talerWithdrawUri: string; - exchangeBaseUrl: string; -} - -const codecForAcceptBankIntegratedWithdrawalRequest = (): Codec< - AcceptBankIntegratedWithdrawalRequest -> => - makeCodecForObject<AcceptBankIntegratedWithdrawalRequest>() - .property("exchangeBaseUrl", codecForString) - .property("talerWithdrawUri", codecForString) - .build("AcceptBankIntegratedWithdrawalRequest"); - -const codecForGetWithdrawalDetailsForAmountRequest = (): Codec< - GetWithdrawalDetailsForAmountRequest -> => - makeCodecForObject<GetWithdrawalDetailsForAmountRequest>() - .property("exchangeBaseUrl", codecForString) - .property("amount", codecForString) - .build("GetWithdrawalDetailsForAmountRequest"); - -interface AcceptExchangeTosRequest { - exchangeBaseUrl: string; - etag: string; -} - -const codecForAcceptExchangeTosRequest = (): Codec<AcceptExchangeTosRequest> => - makeCodecForObject<AcceptExchangeTosRequest>() - .property("exchangeBaseUrl", codecForString) - .property("etag", codecForString) - .build("AcceptExchangeTosRequest"); - -interface ApplyRefundRequest { - talerRefundUri: string; -} - -const codecForApplyRefundRequest = (): Codec<ApplyRefundRequest> => - makeCodecForObject<ApplyRefundRequest>() - .property("talerRefundUri", codecForString) - .build("ApplyRefundRequest"); - -interface GetWithdrawalDetailsForUriRequest { - talerWithdrawUri: string; -} - -const codecForGetWithdrawalDetailsForUri = (): Codec< - GetWithdrawalDetailsForUriRequest -> => - makeCodecForObject<GetWithdrawalDetailsForUriRequest>() - .property("talerWithdrawUri", codecForString) - .build("GetWithdrawalDetailsForUriRequest"); - -interface AbortProposalRequest { - proposalId: string; -} - -const codecForAbortProposalRequest = (): Codec<AbortProposalRequest> => - makeCodecForObject<AbortProposalRequest>() - .property("proposalId", codecForString) - .build("AbortProposalRequest"); - -interface PreparePayRequest { - talerPayUri: string; -} - -const codecForPreparePayRequest = (): Codec<PreparePayRequest> => - makeCodecForObject<PreparePayRequest>() - .property("talerPayUri", codecForString) - .build("PreparePay"); - -interface ConfirmPayRequest { - proposalId: string; - sessionId?: string; -} - -const codecForConfirmPayRequest = (): Codec<ConfirmPayRequest> => - makeCodecForObject<ConfirmPayRequest>() - .property("proposalId", codecForString) - .property("sessionId", makeCodecOptional(codecForString)) - .build("ConfirmPay"); - -/** - * Implementation of the "wallet-core" API. - */ - -async function dispatchRequestInternal( - wallet: Wallet, - operation: string, - payload: unknown, -): Promise<Record<string, any>> { - switch (operation) { - case "withdrawTestkudos": - await wallet.withdrawTestBalance(); - return {}; - case "getTransactions": { - const req = codecForTransactionsRequest().decode(payload); - return await wallet.getTransactions(req); - } - case "addExchange": { - const req = codecForAddExchangeRequest().decode(payload); - await wallet.updateExchangeFromUrl(req.exchangeBaseUrl); - return {}; - } - case "listExchanges": { - return await wallet.getExchanges(); - } - case "getWithdrawalDetailsForUri": { - const req = codecForGetWithdrawalDetailsForUri().decode(payload); - return await wallet.getWithdrawalDetailsForUri(req.talerWithdrawUri); - } - case "acceptManualWithdrawal": { - const req = codecForAcceptManualWithdrawalRequet().decode(payload); - const res = await wallet.acceptManualWithdrawal( - req.exchangeBaseUrl, - Amounts.parseOrThrow(req.amount), - ); - return res; - } - case "getWithdrawalDetailsForAmount": { - const req = codecForGetWithdrawalDetailsForAmountRequest().decode( - payload, - ); - return await wallet.getWithdrawalDetailsForAmount( - req.exchangeBaseUrl, - Amounts.parseOrThrow(req.amount), - ); - } - case "getBalances": { - return await wallet.getBalances(); - } - case "getPendingOperations": { - return await wallet.getPendingOperations(); - } - case "setExchangeTosAccepted": { - const req = codecForAcceptExchangeTosRequest().decode(payload); - await wallet.acceptExchangeTermsOfService( - req.exchangeBaseUrl, - req.etag, - ); - return {}; - } - case "applyRefund": { - const req = codecForApplyRefundRequest().decode(payload); - return await wallet.applyRefund(req.talerRefundUri); - } - case "acceptBankIntegratedWithdrawal": { - const req = codecForAcceptBankIntegratedWithdrawalRequest().decode( - payload, - ); - return await wallet.acceptWithdrawal( - req.talerWithdrawUri, - req.exchangeBaseUrl, - ); - } - case "getExchangeTos": { - const req = codecForGetExchangeTosRequest().decode(payload); - return wallet.getExchangeTos(req.exchangeBaseUrl); - } - case "abortProposal": { - const req = codecForAbortProposalRequest().decode(payload); - await wallet.refuseProposal(req.proposalId); - return {}; - } - case "retryPendingNow": { - await wallet.runPending(true); - return {}; - } - case "preparePay": { - const req = codecForPreparePayRequest().decode(payload); - return await wallet.preparePayForUri(req.talerPayUri); - } - case "confirmPay": { - const req = codecForConfirmPayRequest().decode(payload); - return await wallet.confirmPay(req.proposalId, req.sessionId); - } - } - throw OperationFailedError.fromCode( - TalerErrorCode.WALLET_CORE_API_OPERATION_UNKNOWN, - "unknown operation", - { - operation, - }, - ); -} - -export type CoreApiResponse = - | CoreApiResponseSuccess - | CoreApiResponseError; - -export type CoreApiEnvelope = - | CoreApiResponse - | CoreApiNotification; - -export interface CoreApiNotification { - type: "notification"; - payload: unknown; -} - -export interface CoreApiResponseSuccess { - // To distinguish the message from notifications - type: "response"; - operation: string, - id: string; - result: unknown; -} - -export interface CoreApiResponseError { - // To distinguish the message from notifications - type: "error"; - operation: string, - id: string; - error: OperationErrorDetails; -} - -/** - * Handle a request to the wallet-core API. - */ -export async function handleCoreApiRequest( - w: Wallet, - operation: string, - id: string, - payload: unknown, -): Promise<CoreApiResponse> { - try { - const result = await dispatchRequestInternal(w, operation, payload); - return { - type: "response", - operation, - id, - result, - }; - } catch (e) { - if ( - e instanceof OperationFailedError || - e instanceof OperationFailedAndReportedError - ) { - return { - type: "error", - operation, - id, - error: e.operationError, - }; - } else { - return { - type: "error", - operation, - id, - error: makeErrorDetails( - TalerErrorCode.WALLET_UNEXPECTED_EXCEPTION, - `unexpected exception: ${e}`, - {}, - ), - }; - } - } -} |