All files retry.ts

100% Statements 23/23
100% Branches 2/2
100% Functions 5/5
100% Lines 18/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 497x 7x 7x   2x       2x     2x 2x 7x 1x 6x 6x 6x 5x   1x     1x     2x                                     7x 2x    
import { canFail } from "./errors"
import { isError } from "./guards"
import { purry } from "./purry"
 
function __retry<E extends (...args: any[]) => Promise<any>>(
    fn: E,
    errorHandler: (stats: { err: Error; count: number }) => (Promise<boolean> | boolean)
): E {
    const stats = {
        count: 0,
    }
    return (async (...args) => {
        const request = async (): Promise<any> => {
            const result = await canFail(() => fn(...args))
            if (isError(result)) {
                stats.count += 1
                const continueReq = await errorHandler({ count: stats.count, err: result })
                if (continueReq) {
                    return request()
                }
                throw new Error(`Retry operation failed "${stats.count}" times. ${result.message}`)
            }
 
            return result
        }
 
        return request()
    }) as E
}
 
/**
 * Retry promise function
 * @param errorHandler Logic when to retry
 * @param fn the callback function
 * @signature
 *    P.retry(fn, errorHandler)
 * @example
 *    P.retry(async () => {
 *          await delay(1000)
 *          throw new Error("Failed!")
 *    }, ({ count }) => count < 10) // Retry function 10 times
 * @category Array
 */
export function retry<E extends (...args: any[]) => Promise<any>>(errorHandler: (stats: { err: Error; count: number }) => Promise<boolean> | boolean): (fn: E) => E
export function retry<E extends (...args: any[]) => Promise<any>>(fn: E, errorHandler: (stats: { err: Error; count: number }) => Promise<boolean> | boolean): E
export function retry() {
    return purry(__retry, arguments)
}