From a49959d2c8bf82575c5d232217a33d91e7b008e8 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 20 Feb 2023 21:26:08 +0100 Subject: wallet-core: support long-polling for peer push credit --- .../taler-wallet-core/src/operations/common.ts | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) (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 e5eda074c..3905eaf3e 100644 --- a/packages/taler-wallet-core/src/operations/common.ts +++ b/packages/taler-wallet-core/src/operations/common.ts @@ -21,11 +21,13 @@ import { AgeRestriction, AmountJson, Amounts, + CancellationToken, CoinRefreshRequest, CoinStatus, ExchangeEntryStatus, ExchangeListItem, ExchangeTosStatus, + getErrorDetailFromException, j2s, Logger, OperationErrorInfo, @@ -453,3 +455,42 @@ export function makeExchangeListItem( lastUpdateErrorInfo, }; } + +export interface LongpollResult { + ready: boolean; +} + +export function runLongpollAsync( + ws: InternalWalletState, + retryTag: string, + reqFn: (ct: CancellationToken) => Promise, +): void { + const asyncFn = async () => { + if (ws.stopped) { + logger.trace("not long-polling reserve, wallet already stopped"); + await storeOperationPending(ws, retryTag); + return; + } + const cts = CancellationToken.create(); + let res: { ready: boolean } | undefined = undefined; + try { + ws.activeLongpoll[retryTag] = { + cancel: () => { + logger.trace("cancel of reserve longpoll requested"); + cts.cancel(); + }, + }; + res = await reqFn(cts.token); + } catch (e) { + await storeOperationError(ws, retryTag, getErrorDetailFromException(e)); + return; + } finally { + delete ws.activeLongpoll[retryTag]; + } + if (!res.ready) { + await storeOperationPending(ws, retryTag); + } + ws.latch.trigger(); + }; + asyncFn(); +} -- cgit v1.2.3