@ethersphere/bee-js
Version:
Javascript client for Bee
82 lines (81 loc) • 3.3 kB
JavaScript
;
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,
});
}
}