UNPKG

@ethersphere/bee-js

Version:
82 lines (81 loc) 3.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.http = exports.DEFAULT_HTTP_CONFIG = void 0; const axios_1 = __importDefault(require("axios")); const cafe_utility_1 = require("cafe-utility"); const debug_1 = __importDefault(require("debug")); const index_1 = require("../index"); const debug = (0, debug_1.default)('bee-js:http'); const { AxiosError } = axios_1.default; const MAX_FAILED_ATTEMPTS = 100000; const DELAY_FAST = 200; const DELAY_SLOW = 1000; const DELAY_THRESHOLD = cafe_utility_1.Dates.minutes(1) / DELAY_FAST; exports.DEFAULT_HTTP_CONFIG = { headers: { accept: 'application/json, text/plain, */*', }, maxBodyLength: Infinity, maxContentLength: Infinity, }; /** * Main function to make HTTP requests. * @param options User defined settings * @param config Internal settings and/or Bee settings */ async function http(options, config) { const requestConfig = cafe_utility_1.Objects.deepMerge3(exports.DEFAULT_HTTP_CONFIG, config, options); if (requestConfig.data && typeof Buffer !== 'undefined' && Buffer.isBuffer(requestConfig.data)) { requestConfig.data = requestConfig.data.buffer.slice(requestConfig.data.byteOffset, requestConfig.data.byteOffset + requestConfig.data.byteLength); } if (requestConfig.params) { const keys = Object.keys(requestConfig.params); for (const key of keys) { const value = requestConfig.params[key]; if (value === undefined) { delete requestConfig.params[key]; } } } let failedAttempts = 0; while (failedAttempts < MAX_FAILED_ATTEMPTS) { try { debug(`${requestConfig.method || 'get'} ${cafe_utility_1.Strings.joinUrl([ requestConfig.baseURL, requestConfig.url, ])}`, { headers: { ...requestConfig.headers }, params: requestConfig.params }); maybeRunOnRequestHook(options, requestConfig); const response = await (0, axios_1.default)(requestConfig); return response; } catch (e) { if (e instanceof AxiosError) { if (e.code === 'ECONNABORTED' && options.endlesslyRetry) { failedAttempts++; await cafe_utility_1.System.sleepMillis(failedAttempts < DELAY_THRESHOLD ? DELAY_FAST : DELAY_SLOW); } else { throw new index_1.BeeResponseError(config.method || 'get', config.url || '<unknown>', e.message, e.response?.data, e.response?.status, e.code); } } else { throw e; } } } throw Error('Max number of failed attempts reached'); } exports.http = http; function maybeRunOnRequestHook(options, requestConfig) { if (options.onRequest) { options.onRequest({ method: requestConfig.method || 'GET', url: cafe_utility_1.Strings.joinUrl([requestConfig.baseURL, requestConfig.url]), headers: { ...requestConfig.headers }, params: requestConfig.params, }); } }