diff --git a/src/talerTypes.ts b/src/talerTypes.ts index a65813678..91dd913b6 100644 --- a/src/talerTypes.ts +++ b/src/talerTypes.ts @@ -310,6 +310,12 @@ export class ContractTerms { @Checkable.String() H_wire: string; + /** + * Hash of the merchant's wire details. + */ + @Checkable.Optional(Checkable.String()) + auto_refund: string; + /** * Wire method the merchant wants to use. */ diff --git a/src/wallet-impl/pending.ts b/src/wallet-impl/pending.ts index 2d4b16cf4..02f8d9ef9 100644 --- a/src/wallet-impl/pending.ts +++ b/src/wallet-impl/pending.ts @@ -18,7 +18,6 @@ * Imports. */ import { - PendingOperationInfo, PendingOperationsResponse, getTimestampNow, Timestamp, @@ -158,20 +157,6 @@ async function gatherReservePending( }); break; case ReserveRecordStatus.WAIT_CONFIRM_BANK: - if (onlyDue) { - break; - } - resp.pendingOperations.push({ - type: "reserve", - givesLifeness: false, - stage: reserve.reserveStatus, - timestampCreated: reserve.created, - reserveType, - reservePub: reserve.reservePub, - bankWithdrawConfirmUrl: reserve.bankWithdrawConfirmUrl, - retryInfo: reserve.retryInfo, - }); - break; case ReserveRecordStatus.WITHDRAWING: case ReserveRecordStatus.QUERYING_STATUS: case ReserveRecordStatus.REGISTERING_BANK: @@ -327,9 +312,11 @@ async function gatherProposalPending( resp.pendingOperations.push({ type: "proposal-download", givesLifeness: true, - merchantBaseUrl: proposal.download!!.contractTerms.merchant_base_url, + merchantBaseUrl: proposal.download?.contractTerms.merchant_base_url || "", proposalId: proposal.proposalId, proposalTimestamp: proposal.timestamp, + lastError: proposal.lastError, + retryInfo: proposal.retryInfo, }); } }); diff --git a/src/wallet-impl/reserves.ts b/src/wallet-impl/reserves.ts index 8b8fbc7e3..d6568bd30 100644 --- a/src/wallet-impl/reserves.ts +++ b/src/wallet-impl/reserves.ts @@ -326,6 +326,7 @@ async function processReserveBankStatusImpl( r.bankWithdrawConfirmUrl = status.confirm_transfer_url; return r; }); + await incrementReserveRetry(ws, reservePub, undefined); } ws.notify( { type: NotificationType.Wildcard }); } diff --git a/src/wallet.ts b/src/wallet.ts index 276e3c371..a4fc09f7d 100644 --- a/src/wallet.ts +++ b/src/wallet.ts @@ -295,20 +295,17 @@ export class Wallet { numGivingLiveness++; } } - let timeout; + let dt; if ( allPending.pendingOperations.length === 0 || allPending.nextRetryDelay.d_ms === Number.MAX_SAFE_INTEGER ) { - // Wait forever - timeout = new Promise(() => {}); - console.log("waiting forever"); + // Wait for 5 seconds + dt = 5000; } else { - console.log("waiting for timeout", pending.nextRetryDelay); - timeout = this.timerGroup.resolveAfter( - allPending.nextRetryDelay.d_ms, - ); + dt = Math.min(5000, allPending.nextRetryDelay.d_ms); } + const timeout = this.timerGroup.resolveAfter(dt); this.ws.notify({ type: NotificationType.WaitingForRetry, numGivingLiveness, @@ -319,7 +316,7 @@ export class Wallet { } else { logger.trace("running pending operations that are due"); // FIXME: maybe be a bit smarter about executing these - // opeations in parallel? + // operations in parallel? for (const p of pending.pendingOperations) { try { console.log("running", p); @@ -327,6 +324,7 @@ export class Wallet { } catch (e) { console.error(e); } + this.ws.notify({ type: NotificationType.Wildcard }); } } } @@ -481,7 +479,11 @@ export class Wallet { baseUrl: string, force: boolean = false, ): Promise { - return updateExchangeFromUrl(this.ws, baseUrl, force); + try { + return updateExchangeFromUrl(this.ws, baseUrl, force); + } finally { + this.latch.trigger(); + } } /** @@ -492,7 +494,11 @@ export class Wallet { } async refresh(oldCoinPub: string, force: boolean = false): Promise { - return refresh(this.ws, oldCoinPub, force); + try { + return refresh(this.ws, oldCoinPub, force); + } catch (e) { + this.latch.trigger(); + } } async findExchange( @@ -638,7 +644,11 @@ export class Wallet { } async acceptTip(talerTipUri: string): Promise { - return acceptTip(this.ws, talerTipUri); + try { + return acceptTip(this.ws, talerTipUri); + } catch (e) { + this.latch.trigger(); + } } async getTipStatus(talerTipUri: string): Promise { @@ -646,7 +656,11 @@ export class Wallet { } async abortFailedPayment(contractTermsHash: string): Promise { - return abortFailedPayment(this.ws, contractTermsHash); + try { + return abortFailedPayment(this.ws, contractTermsHash); + } finally { + this.latch.trigger(); + } } public async handleNotifyReserve() { @@ -680,14 +694,22 @@ export class Wallet { async getWithdrawalInfo( talerWithdrawUri: string, ): Promise { - return getWithdrawalInfo(this.ws, talerWithdrawUri); + try { + return getWithdrawalInfo(this.ws, talerWithdrawUri); + } finally { + this.latch.trigger(); + } } async acceptWithdrawal( talerWithdrawUri: string, selectedExchange: string, ): Promise { - return acceptWithdrawal(this.ws, talerWithdrawUri, selectedExchange); + try { + return acceptWithdrawal(this.ws, talerWithdrawUri, selectedExchange); + } finally { + this.latch.trigger(); + } } async getPurchaseDetails(hc: string): Promise { diff --git a/src/walletTypes.ts b/src/walletTypes.ts index 4c3458705..407871666 100644 --- a/src/walletTypes.ts +++ b/src/walletTypes.ts @@ -236,12 +236,6 @@ export interface HistoryEvent { */ timestamp: Timestamp; - /** - * Subject of the entry. Used to group multiple history records together. - * Only the latest history record with the same subjectId will be shown. - */ - subjectId?: string; - /** * Details used when rendering the history record. */ @@ -747,6 +741,8 @@ export interface PendingProposalDownloadOperation { merchantBaseUrl: string; proposalTimestamp: Timestamp; proposalId: string; + lastError?: OperationError; + retryInfo: RetryInfo; } /**