diff options
Diffstat (limited to 'packages/taler-util/src/http-client/utils.ts')
-rw-r--r-- | packages/taler-util/src/http-client/utils.ts | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/packages/taler-util/src/http-client/utils.ts b/packages/taler-util/src/http-client/utils.ts index d6623cf00..c579cd852 100644 --- a/packages/taler-util/src/http-client/utils.ts +++ b/packages/taler-util/src/http-client/utils.ts @@ -18,7 +18,7 @@ * Imports. */ import { base64FromArrayBuffer } from "../base64.js"; -import { stringToBytes } from "../taler-crypto.js"; +import { encodeCrock, getRandomBytes, stringToBytes } from "../taler-crypto.js"; import { AccessToken, LongPollParams, PaginationParams } from "./types.js"; /** @@ -90,3 +90,27 @@ export interface CacheEvictor<T> { export const nullEvictor: CacheEvictor<unknown> = { notifySuccess: () => Promise.resolve(), }; + +export class IdempotencyRetry { + public readonly uid: string; + public readonly timesLeft: number; + public readonly maxTries: number; + + private constructor(timesLeft: number, maxTimesLeft: number) { + this.timesLeft = timesLeft; + this.maxTries = maxTimesLeft; + this.uid = encodeCrock(getRandomBytes(32)) + } + + static tryFiveTimes() { + return new IdempotencyRetry(5, 5) + } + + next(): IdempotencyRetry | undefined { + const left = this.timesLeft -1 + if (left <= 0) { + return undefined + } + return new IdempotencyRetry(left, this.maxTries); + } +} |