From 1e6e1a22cdb16975f3a914b2f1be6db0ae1b241d Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 2 Nov 2022 14:23:26 +0100 Subject: wallet-core: fix exchange management test case, surface exchange update error info in list --- .../taler-wallet-core/src/operations/common.ts | 44 +++++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'packages/taler-wallet-core/src/operations/common.ts') diff --git a/packages/taler-wallet-core/src/operations/common.ts b/packages/taler-wallet-core/src/operations/common.ts index e29065390..f35556736 100644 --- a/packages/taler-wallet-core/src/operations/common.ts +++ b/packages/taler-wallet-core/src/operations/common.ts @@ -28,6 +28,7 @@ import { ExchangeTosStatus, j2s, Logger, + OperationErrorInfo, RefreshReason, TalerErrorCode, TalerErrorDetail, @@ -224,30 +225,37 @@ export async function storeOperationPending( }); } -export async function runOperationWithErrorReporting( +export async function runOperationWithErrorReporting( ws: InternalWalletState, opId: string, - f: () => Promise, -): Promise { + f: () => Promise>, +): Promise> { let maybeError: TalerErrorDetail | undefined; try { const resp = await f(); switch (resp.type) { case OperationAttemptResultType.Error: - return await storeOperationError(ws, opId, resp.errorDetail); + await storeOperationError(ws, opId, resp.errorDetail); + return resp; case OperationAttemptResultType.Finished: - return await storeOperationFinished(ws, opId); + await storeOperationFinished(ws, opId); + return resp; case OperationAttemptResultType.Pending: - return await storeOperationPending(ws, opId); + await storeOperationPending(ws, opId); + return resp; case OperationAttemptResultType.Longpoll: - break; + return resp; } } catch (e) { if (e instanceof TalerError) { logger.warn("operation processed resulted in error"); logger.warn(`error was: ${j2s(e.errorDetail)}`); maybeError = e.errorDetail; - return await storeOperationError(ws, opId, maybeError!); + await storeOperationError(ws, opId, maybeError!); + return { + type: OperationAttemptResultType.Error, + errorDetail: e.errorDetail, + }; } else if (e instanceof Error) { // This is a bug, as we expect pending operations to always // do their own error handling and only throw WALLET_PENDING_OPERATION_FAILED @@ -261,7 +269,11 @@ export async function runOperationWithErrorReporting( }, `unexpected exception (message: ${e.message})`, ); - return await storeOperationError(ws, opId, maybeError); + await storeOperationError(ws, opId, maybeError); + return { + type: OperationAttemptResultType.Error, + errorDetail: maybeError, + }; } else { logger.error("Uncaught exception, value is not even an error."); maybeError = makeErrorDetail( @@ -269,7 +281,11 @@ export async function runOperationWithErrorReporting( {}, `unexpected exception (not even an error)`, ); - return await storeOperationError(ws, opId, maybeError); + await storeOperationError(ws, opId, maybeError); + return { + type: OperationAttemptResultType.Error, + errorDetail: maybeError, + }; } } } @@ -357,7 +373,13 @@ export function getExchangeTosStatus( export function makeExchangeListItem( r: ExchangeRecord, exchangeDetails: ExchangeDetailsRecord | undefined, + lastError: TalerErrorDetail | undefined, ): ExchangeListItem { + const lastUpdateErrorInfo: OperationErrorInfo | undefined = lastError + ? { + error: lastError, + } + : undefined; if (!exchangeDetails) { return { exchangeBaseUrl: r.baseUrl, @@ -367,6 +389,7 @@ export function makeExchangeListItem( exchangeStatus: ExchangeEntryStatus.Unknown, permanent: r.permanent, ageRestrictionOptions: [], + lastUpdateErrorInfo, }; } let exchangeStatus; @@ -381,5 +404,6 @@ export function makeExchangeListItem( ageRestrictionOptions: exchangeDetails.ageMask ? AgeRestriction.getAgeGroupsFromMask(exchangeDetails.ageMask) : [], + lastUpdateErrorInfo, }; } -- cgit v1.2.3