UNPKG

@hazae41/piscine

Version:

Create async pools with automatic retry

1 lines 6.59 kB
{"version":3,"file":"loop.cjs","sources":["../../../../../src/mods/loop/loop.ts"],"sourcesContent":["\nexport type Looper<T> =\n (index: number) => Promise<T>\n\nexport class TooManyRetriesError extends Error {\n readonly #class = TooManyRetriesError\n readonly name = this.#class.name\n\n constructor(options?: ErrorOptions) {\n super(`Too many retries`, options)\n }\n\n static from(cause: unknown) {\n return new TooManyRetriesError({ cause })\n }\n\n}\n\nexport type Looped<T> =\n | Cancel<T>\n | Retry<T>\n | Skip<T>\n\nexport namespace Looped {\n\n export type Infer<T> =\n | Cancel.Infer<T>\n | Skip.Infer<T>\n | Retry.Infer<T>\n\n export type Inner<T> =\n | Cancel.Inner<T>\n | Skip.Inner<T>\n | Retry.Inner<T>\n\n}\n\nexport class Cancel<T> {\n\n constructor(\n readonly inner: T\n ) { }\n\n static new<T>(inner: T) {\n return new Cancel(inner)\n }\n\n isCancel(): this is Cancel<T> {\n return true\n }\n\n isRetry(): false {\n return false\n }\n\n isSkip(): false {\n return false\n }\n\n}\n\nexport namespace Cancel {\n\n export type Infer<T> = Cancel<Inner<T>>\n\n export type Inner<T> = T extends Cancel<infer Inner> ? Inner : never\n\n}\n\nexport class Retry<T> {\n\n constructor(\n readonly inner: T\n ) { }\n\n static new<T>(inner: T) {\n return new Retry(inner)\n }\n\n isCancel(): false {\n return false\n }\n\n isRetry(): this is Retry<T> {\n return true\n }\n\n isSkip(): false {\n return false\n }\n\n}\n\nexport namespace Retry {\n\n export type Infer<T> = Retry<Inner<T>>\n\n export type Inner<T> = T extends Retry<infer Inner> ? Inner : never\n\n export function runSync<T>(f: () => T) {\n try {\n return f()\n } catch (error) {\n throw new Retry(error)\n }\n }\n\n export async function run<T>(f: () => Promise<T>) {\n try {\n return await f()\n } catch (error) {\n throw new Retry(error)\n }\n }\n\n}\n\nexport class Skip<T> {\n\n constructor(\n readonly inner: T\n ) { }\n\n static new<T>(inner: T) {\n return new Skip(inner)\n }\n\n isCancel(): false {\n return false\n }\n\n isRetry(): false {\n return false\n }\n\n isSkip(): this is Skip<T> {\n return true\n }\n\n}\n\nexport namespace Skip {\n\n export type Infer<T> = Skip<Inner<T>>\n\n export type Inner<T> = T extends Skip<infer Inner> ? Inner : never\n\n export function runSync<T>(f: () => T) {\n try {\n return f()\n } catch (error) {\n throw new Skip(error)\n }\n }\n\n export async function run<T>(f: () => Promise<T>) {\n try {\n return await f()\n } catch (error) {\n throw new Skip(error)\n }\n }\n\n}\n\nexport interface LoopOptions {\n readonly init?: number\n readonly base?: number\n readonly max?: number\n}\n\nexport async function loopOrThrow<T>(\n looper: Looper<T>,\n options: LoopOptions = {}\n) {\n const { init = 1000, base = 2, max = 3 } = options\n\n const errors = new Array<unknown>()\n\n for (let i = 0; i < max; i++) {\n try {\n return await looper(i)\n } catch (error) {\n if (error instanceof Cancel)\n throw error.inner\n\n if (error instanceof Skip) {\n errors.push(error)\n continue\n }\n\n if (error instanceof Retry) {\n errors.push(error)\n await new Promise(ok => setTimeout(ok, init * (base ** i)))\n continue\n }\n\n throw error\n }\n }\n\n throw TooManyRetriesError.from(errors)\n}"],"names":[],"mappings":"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"}