don't die on auto-refund, fix pending operations

This commit is contained in:
Florian Dold 2019-12-06 11:01:39 +01:00
parent e01f94e345
commit 52da599ddb
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
5 changed files with 49 additions and 37 deletions

View File

@ -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.
*/

View File

@ -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,
});
}
});

View File

@ -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 });
}

View File

@ -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<ExchangeRecord> {
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<void> {
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<void> {
try {
return acceptTip(this.ws, talerTipUri);
} catch (e) {
this.latch.trigger();
}
}
async getTipStatus(talerTipUri: string): Promise<TipStatus> {
@ -646,7 +656,11 @@ export class Wallet {
}
async abortFailedPayment(contractTermsHash: string): Promise<void> {
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<DownloadedWithdrawInfo> {
try {
return getWithdrawalInfo(this.ws, talerWithdrawUri);
} finally {
this.latch.trigger();
}
}
async acceptWithdrawal(
talerWithdrawUri: string,
selectedExchange: string,
): Promise<AcceptWithdrawalResponse> {
try {
return acceptWithdrawal(this.ws, talerWithdrawUri, selectedExchange);
} finally {
this.latch.trigger();
}
}
async getPurchaseDetails(hc: string): Promise<PurchaseDetails> {

View File

@ -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;
}
/**