aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-12-06 11:01:39 +0100
committerFlorian Dold <florian.dold@gmail.com>2019-12-06 11:01:39 +0100
commit52da599ddbf5a72115544bc230cdefdb12811fd1 (patch)
treeabd90966659b0c60b8020643e2828bd913ad3db0 /src
parente01f94e345bd94afe1643b55434a00c106d18954 (diff)
downloadwallet-core-52da599ddbf5a72115544bc230cdefdb12811fd1.tar.xz
don't die on auto-refund, fix pending operations
Diffstat (limited to 'src')
-rw-r--r--src/talerTypes.ts6
-rw-r--r--src/wallet-impl/pending.ts19
-rw-r--r--src/wallet-impl/reserves.ts1
-rw-r--r--src/wallet.ts52
-rw-r--r--src/walletTypes.ts8
5 files changed, 49 insertions, 37 deletions
diff --git a/src/talerTypes.ts b/src/talerTypes.ts
index a65813678..91dd913b6 100644
--- a/src/talerTypes.ts
+++ b/src/talerTypes.ts
@@ -311,6 +311,12 @@ export class ContractTerms {
H_wire: string;
/**
+ * Hash of the merchant's wire details.
+ */
+ @Checkable.Optional(Checkable.String())
+ auto_refund: string;
+
+ /**
* Wire method the merchant wants to use.
*/
@Checkable.String()
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<ExchangeRecord> {
- 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<void> {
- 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<void> {
- return acceptTip(this.ws, talerTipUri);
+ 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> {
- 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<DownloadedWithdrawInfo> {
- return getWithdrawalInfo(this.ws, talerWithdrawUri);
+ try {
+ return getWithdrawalInfo(this.ws, talerWithdrawUri);
+ } finally {
+ this.latch.trigger();
+ }
}
async acceptWithdrawal(
talerWithdrawUri: string,
selectedExchange: string,
): Promise<AcceptWithdrawalResponse> {
- return acceptWithdrawal(this.ws, talerWithdrawUri, selectedExchange);
+ try {
+ return acceptWithdrawal(this.ws, talerWithdrawUri, selectedExchange);
+ } finally {
+ this.latch.trigger();
+ }
}
async getPurchaseDetails(hc: string): Promise<PurchaseDetails> {
diff --git a/src/walletTypes.ts b/src/walletTypes.ts
index 4c3458705..407871666 100644
--- a/src/walletTypes.ts
+++ b/src/walletTypes.ts
@@ -237,12 +237,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.
*/
detail: any;
@@ -747,6 +741,8 @@ export interface PendingProposalDownloadOperation {
merchantBaseUrl: string;
proposalTimestamp: Timestamp;
proposalId: string;
+ lastError?: OperationError;
+ retryInfo: RetryInfo;
}
/**