@composite-fetcher/with-retries
Version:
A fetcher core plugin to handle and retry failed requests
56 lines (55 loc) • 1.54 kB
JavaScript
// 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
};