summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts33
1 files changed, 18 insertions, 15 deletions
diff --git a/packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts b/packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts
index c7e447dab..e5ae6b73b 100644
--- a/packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts
+++ b/packages/taler-wallet-core/src/operations/pay-peer-pull-debit.ts
@@ -42,6 +42,7 @@ import {
TalerPreciseTimestamp,
TalerProtocolViolationError,
TransactionAction,
+ TransactionIdStr,
TransactionMajorState,
TransactionMinorState,
TransactionState,
@@ -69,6 +70,7 @@ import {
PendingTaskType,
RefreshOperationStatus,
StoreNames,
+ TaskId,
WalletStoresV1,
createRefreshGroup,
timestampPreciseToDb,
@@ -93,7 +95,6 @@ import {
constructTransactionIdentifier,
notifyTransition,
parseTransactionIdentifier,
- stopLongpolling,
} from "./transactions.js";
const logger = new Logger("pay-peer-pull-debit.ts");
@@ -103,8 +104,8 @@ const logger = new Logger("pay-peer-pull-debit.ts");
*/
export class PeerPullDebitTransactionContext implements TransactionContext {
ws: InternalWalletState;
- transactionId: string;
- taskId: string;
+ readonly transactionId: TransactionIdStr;
+ readonly taskId: TaskId;
peerPullDebitId: string;
constructor(ws: InternalWalletState, peerPullDebitId: string) {
@@ -140,7 +141,6 @@ export class PeerPullDebitTransactionContext implements TransactionContext {
const transactionId = this.transactionId;
const ws = this.ws;
const peerPullDebitId = this.peerPullDebitId;
- stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
@@ -185,11 +185,11 @@ export class PeerPullDebitTransactionContext implements TransactionContext {
return undefined;
});
notifyTransition(ws, transactionId, transitionInfo);
+ ws.taskScheduler.stopShepherdTask(taskId);
}
async resumeTransaction(): Promise<void> {
const ctx = this;
- stopLongpolling(ctx.ws, ctx.taskId);
await ctx.transition(async (pi) => {
switch (pi.status) {
case PeerPullDebitRecordStatus.SuspendedDeposit:
@@ -207,11 +207,11 @@ export class PeerPullDebitTransactionContext implements TransactionContext {
return TransitionResult.Stay;
}
});
+ this.ws.taskScheduler.startShepherdTask(this.taskId);
}
async failTransaction(): Promise<void> {
const ctx = this;
- stopLongpolling(ctx.ws, ctx.taskId);
await ctx.transition(async (pi) => {
switch (pi.status) {
case PeerPullDebitRecordStatus.SuspendedDeposit:
@@ -225,6 +225,7 @@ export class PeerPullDebitTransactionContext implements TransactionContext {
return TransitionResult.Stay;
}
});
+ this.ws.taskScheduler.stopShepherdTask(this.taskId);
}
async abortTransaction(): Promise<void> {
@@ -325,7 +326,9 @@ export class PeerPullDebitTransactionContext implements TransactionContext {
}
},
);
+ ws.taskScheduler.stopShepherdTask(this.taskId);
notifyTransition(ws, this.transactionId, transitionInfo);
+ ws.taskScheduler.startShepherdTask(this.taskId);
}
}
@@ -405,7 +408,7 @@ async function handlePurseCreationConflict(
}
await tx.peerPullDebit.put(myPpi);
});
- return TaskRunResult.finished();
+ return TaskRunResult.backoff();
}
async function processPeerPullDebitPendingDeposit(
@@ -469,7 +472,7 @@ async function processPeerPullDebitPendingDeposit(
}
case HttpStatusCode.Gone: {
await ctx.abortTransaction();
- return TaskRunResult.finished();
+ return TaskRunResult.backoff();
}
case HttpStatusCode.Conflict: {
return handlePurseCreationConflict(ctx, peerPullInc, httpResp);
@@ -529,7 +532,7 @@ async function processPeerPullDebitAbortingRefresh(
});
notifyTransition(ws, transactionId, transitionInfo);
// FIXME: Shouldn't this be finished in some cases?!
- return TaskRunResult.pending();
+ return TaskRunResult.backoff();
}
export async function processPeerPullDebit(
@@ -607,7 +610,7 @@ export async function confirmPeerPullDebit(
coinSelRes.result.coins,
);
- const ppi = await ws.db
+ await ws.db
.mktx((x) => [
x.exchanges,
x.coins,
@@ -643,19 +646,19 @@ export async function confirmPeerPullDebit(
};
}
await tx.peerPullDebit.put(pi);
- return pi;
});
- const transactionId = constructTransactionIdentifier({
- tag: TransactionType.PeerPullDebit,
- peerPullDebitId,
- });
+ const ctx = new PeerPullDebitTransactionContext(ws, peerPullDebitId);
+
+ const transactionId = ctx.transactionId;
ws.notify({
type: NotificationType.BalanceChange,
hintTransactionId: transactionId,
});
+ ws.taskScheduler.startShepherdTask(ctx.taskId);
+
return {
transactionId,
};