diff options
author | Sebastian <sebasjm@gmail.com> | 2023-01-17 15:58:20 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-01-17 16:01:26 -0300 |
commit | eeea3e62a01638b37c8bb8d6f8fdeac129a4afae (patch) | |
tree | fd1e97f0c3dda5b4077e7e0b53d8c844a8fc9aa4 /packages/taler-wallet-core/src | |
parent | 5be2d128ed088a77d6448ac1ebf25aba3716bd81 (diff) | |
download | wallet-core-eeea3e62a01638b37c8bb8d6f8fdeac129a4afae.tar.xz |
stronger type check to be sure that ErrorDetails is consistent
Diffstat (limited to 'packages/taler-wallet-core/src')
-rw-r--r-- | packages/taler-wallet-core/src/errors.ts | 66 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/operations/backup/index.ts | 2 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/util/http.ts | 14 |
3 files changed, 61 insertions, 21 deletions
diff --git a/packages/taler-wallet-core/src/errors.ts b/packages/taler-wallet-core/src/errors.ts index 7dbba2e2e..038bdbc7c 100644 --- a/packages/taler-wallet-core/src/errors.ts +++ b/packages/taler-wallet-core/src/errors.ts @@ -32,6 +32,8 @@ import { TransactionType, } from "@gnu-taler/taler-util"; +type empty = Record<string, never>; + export interface DetailsMap { [TalerErrorCode.WALLET_PENDING_OPERATION_FAILED]: { innerError: TalerErrorDetail; @@ -44,13 +46,13 @@ export interface DetailsMap { exchangeProtocolVersion: string; walletProtocolVersion: string; }; - [TalerErrorCode.WALLET_WITHDRAWAL_OPERATION_ABORTED_BY_BANK]: {}; - [TalerErrorCode.WALLET_TIPPING_COIN_SIGNATURE_INVALID]: {}; + [TalerErrorCode.WALLET_WITHDRAWAL_OPERATION_ABORTED_BY_BANK]: empty; + [TalerErrorCode.WALLET_TIPPING_COIN_SIGNATURE_INVALID]: empty; [TalerErrorCode.WALLET_ORDER_ALREADY_CLAIMED]: { orderId: string; claimUrl: string; }; - [TalerErrorCode.WALLET_CONTRACT_TERMS_MALFORMED]: {}; + [TalerErrorCode.WALLET_CONTRACT_TERMS_MALFORMED]: empty; [TalerErrorCode.WALLET_CONTRACT_TERMS_SIGNATURE_INVALID]: { merchantPub: string; orderId: string; @@ -62,18 +64,46 @@ export interface DetailsMap { [TalerErrorCode.WALLET_INVALID_TALER_PAY_URI]: { talerPayUri: string; }; - [TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR]: {}; - [TalerErrorCode.WALLET_UNEXPECTED_EXCEPTION]: {}; - [TalerErrorCode.WALLET_BANK_INTEGRATION_PROTOCOL_VERSION_INCOMPATIBLE]: {}; - [TalerErrorCode.WALLET_CORE_API_OPERATION_UNKNOWN]: {}; - [TalerErrorCode.WALLET_HTTP_REQUEST_THROTTLED]: {}; - [TalerErrorCode.WALLET_HTTP_REQUEST_GENERIC_TIMEOUT]: {}; - [TalerErrorCode.WALLET_NETWORK_ERROR]: {}; - [TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE]: {}; - [TalerErrorCode.WALLET_EXCHANGE_COIN_SIGNATURE_INVALID]: {}; - [TalerErrorCode.WALLET_WITHDRAWAL_GROUP_INCOMPLETE]: {}; - [TalerErrorCode.WALLET_CORE_NOT_AVAILABLE]: {}; - [TalerErrorCode.GENERIC_UNEXPECTED_REQUEST_ERROR]: {}; + [TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR]: { + requestUrl: string; + requestMethod: string; + httpStatusCode: number; + errorResponse?: any; + }; + [TalerErrorCode.WALLET_UNEXPECTED_EXCEPTION]: { + stack?: string; + }; + [TalerErrorCode.WALLET_BANK_INTEGRATION_PROTOCOL_VERSION_INCOMPATIBLE]: { + exchangeProtocolVersion: string; + walletProtocolVersion: string; + }; + [TalerErrorCode.WALLET_CORE_API_OPERATION_UNKNOWN]: { + operation: string; + }; + [TalerErrorCode.WALLET_HTTP_REQUEST_THROTTLED]: { + requestUrl: string; + requestMethod: string; + throttleStats: Record<string, unknown>; + }; + [TalerErrorCode.WALLET_HTTP_REQUEST_GENERIC_TIMEOUT]: empty; + [TalerErrorCode.WALLET_NETWORK_ERROR]: { + requestUrl: string; + requestMethod: string; + }; + [TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE]: { + requestUrl: string; + requestMethod: string; + httpStatusCode: number; + validationError?: string; + }; + [TalerErrorCode.WALLET_EXCHANGE_COIN_SIGNATURE_INVALID]: empty; + [TalerErrorCode.WALLET_WITHDRAWAL_GROUP_INCOMPLETE]: { + errorsPerCoin: Record<number, TalerErrorDetail>; + }; + [TalerErrorCode.WALLET_CORE_NOT_AVAILABLE]: empty; + [TalerErrorCode.GENERIC_UNEXPECTED_REQUEST_ERROR]: { + httpStatusCode: number; + }; [TalerErrorCode.WALLET_PAY_MERCHANT_SERVER_ERROR]: { requestError: TalerErrorDetail; }; @@ -84,7 +114,7 @@ export interface DetailsMap { detail: string; }; [TalerErrorCode.WALLET_WITHDRAWAL_KYC_REQUIRED]: { - // FIXME! + kycUrl: string; }; [TalerErrorCode.WALLET_DEPOSIT_GROUP_INSUFFICIENT_BALANCE]: { insufficientBalanceDetails: PayMerchantInsufficientBalanceDetails; @@ -94,7 +124,7 @@ export interface DetailsMap { }; } -type ErrBody<Y> = Y extends keyof DetailsMap ? DetailsMap[Y] : never; +type ErrBody<Y> = Y extends keyof DetailsMap ? DetailsMap[Y] : empty; export function makeErrorDetail<C extends TalerErrorCode>( code: C, @@ -133,7 +163,7 @@ function getDefaultHint(code: number): string { } } -export class TalerProtocolViolationError<T = any> extends Error { +export class TalerProtocolViolationError extends Error { constructor(hint?: string) { let msg: string; if (hint) { diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts index 27d27da0d..7d3953ebb 100644 --- a/packages/taler-wallet-core/src/operations/backup/index.ts +++ b/packages/taler-wallet-core/src/operations/backup/index.ts @@ -734,7 +734,7 @@ async function runFirstBackupCycleForProvider( case OperationAttemptResultType.Error: throw TalerError.fromDetail( TalerErrorCode.WALLET_UNEXPECTED_EXCEPTION, - resp.errorDetail, + resp.errorDetail as any, //FIXME create an error for backup problems ); case OperationAttemptResultType.Finished: return { diff --git a/packages/taler-wallet-core/src/util/http.ts b/packages/taler-wallet-core/src/util/http.ts index 118da40fe..1da31a315 100644 --- a/packages/taler-wallet-core/src/util/http.ts +++ b/packages/taler-wallet-core/src/util/http.ts @@ -68,7 +68,7 @@ export interface HttpRequestOptions { */ cancellationToken?: CancellationToken; - body?: string | ArrayBuffer | Object; + body?: string | ArrayBuffer | Record<string, unknown>; } /** @@ -185,6 +185,7 @@ export async function readUnexpectedResponseDetails( TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, { requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, httpStatusCode: httpResponse.status, errorResponse: errJson, }, @@ -211,6 +212,7 @@ export async function readSuccessResponseJsonOrErrorCode<T>( TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, httpStatusCode: httpResponse.status, validationError: e.toString(), }, @@ -223,11 +225,18 @@ export async function readSuccessResponseJsonOrErrorCode<T>( }; } +type HttpErrorDetails = { + requestUrl: string; + requestMethod: string; + httpStatusCode: number; +}; + export function getHttpResponseErrorDetails( httpResponse: HttpResponse, -): Record<string, unknown> { +): HttpErrorDetails { return { requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, httpStatusCode: httpResponse.status, }; } @@ -240,6 +249,7 @@ export function throwUnexpectedRequestError( TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, { requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, httpStatusCode: httpResponse.status, errorResponse: talerErrorResponse, }, |