UNPKG

@composite-fetcher/with-retries

Version:

A fetcher core plugin to handle and retry failed requests

56 lines (55 loc) 1.54 kB
// src/withRetries.ts import { BasePlugin } from "@composite-fetcher/core"; import fetch from "isomorphic-fetch"; var withRetriesPlugin = class extends BasePlugin { defaultMaxRetries; constructor(defaultMaxRetries = 3) { super(); this.defaultMaxRetries = defaultMaxRetries; } async retryOperation(promiseFn, onSuccess, onFailure, attempt = 0, retries = 0) { try { const result = await promiseFn(); if (result instanceof Response && !result.ok) { throw new Error(`HTTP error: ${result.status}`); } return onSuccess(result); } catch (err) { if (attempt < retries - 1) { return await this.retryOperation( promiseFn, onSuccess, onFailure, attempt + 1, retries ); } console.error(`Failed after ${retries} attempts`, err); onFailure(err); } } async onPostRequest(context) { if (!context.response.ok && !context.originalRequest.headers.has("x-fetcher-no-retry")) { let retries = this.defaultMaxRetries; if (context.originalRequest.headers.has("x-fetcher-retry-times")) { retries = parseInt( context.originalRequest.headers.get("x-fetcher-retry-times"), 10 ); } const response = await this.retryOperation( async () => fetch(context.originalRequest), (res) => res, (error) => error, 0, retries ); return response; } } }; export { withRetriesPlugin as withRetries };