gatsby-source-payload-cms
Version:
Source data from Payload CMS
66 lines (65 loc) • 2.57 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAxiosInstance = void 0;
const axios_1 = __importDefault(require("axios"));
const axios_retry_1 = __importDefault(require("axios-retry"));
/**
* Inspiration from:
* https://gist.github.com/matthewsuan/2bdc9e7f459d5b073d58d1ebc0613169
*/
const throttlingInterceptors = (axiosInstance, maxParallelRequests) => {
const INTERVAL_MS = 50; // Wait time until retrying request
let PENDING_REQUESTS = 0;
/** Axios Request Interceptor */
axiosInstance.interceptors.request.use(function (config) {
return new Promise((resolve, _) => {
const interval = setInterval(() => {
if (PENDING_REQUESTS < maxParallelRequests) {
PENDING_REQUESTS++;
clearInterval(interval);
resolve(config);
}
}, INTERVAL_MS);
});
});
/** Axios Response Interceptor */
axiosInstance.interceptors.response.use(function (response) {
PENDING_REQUESTS = Math.max(0, PENDING_REQUESTS - 1);
return Promise.resolve(response);
}, function (error) {
PENDING_REQUESTS = Math.max(0, PENDING_REQUESTS - 1);
return Promise.reject(error);
});
};
const createAxiosInstance = (pluginConfig) => {
const { maxParallelRequests = Number.POSITIVE_INFINITY, accessToken, accessCollectionSlug, apiURL } = pluginConfig;
const headers = {};
if (accessToken) {
headers.Authorization = `${accessCollectionSlug || 'users'} API-Key ${accessToken}`;
}
const instance = axios_1.default.create({
baseURL: apiURL,
headers,
});
if (pluginConfig.retries) {
// https://github.com/softonic/axios-retry/issues/87
const retryDelay = (retryNumber = 0) => {
const seconds = Math.pow(2, retryNumber) * 1000;
const randomMs = 1000 * Math.random();
return seconds + randomMs;
};
(0, axios_retry_1.default)(instance, {
retries: pluginConfig.retries,
retryDelay,
// retry on Network Error & 5xx responses
retryCondition: axios_retry_1.default.isRetryableError,
});
}
/** Add throttling interceptors */
throttlingInterceptors(instance, maxParallelRequests);
return instance;
};
exports.createAxiosInstance = createAxiosInstance;