request.js 11 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.request = request;
  6. exports.requestWithRetry = requestWithRetry;
  7. var _stream = require("stream");
  8. var _util = require("util");
  9. const pipelineAsync = (0, _util.promisify)(_stream.pipeline);
  10. async function request(transport, opt, body = null) {
  11. return new Promise((resolve, reject) => {
  12. const requestObj = transport.request(opt, response => {
  13. resolve(response);
  14. });
  15. requestObj.on('error', reject);
  16. if (!body || Buffer.isBuffer(body) || typeof body === 'string') {
  17. requestObj.end(body);
  18. } else {
  19. pipelineAsync(body, requestObj).catch(reject);
  20. }
  21. });
  22. }
  23. const MAX_RETRIES = 1;
  24. const BASE_DELAY_MS = 100; // Base delay for exponential backoff
  25. const MAX_DELAY_MS = 60000; // Max delay for exponential backoff
  26. // Retryable error codes for HTTP ( ref: minio-go)
  27. const retryHttpCodes = {
  28. 408: true,
  29. 429: true,
  30. 499: true,
  31. 500: true,
  32. 502: true,
  33. 503: true,
  34. 504: true,
  35. 520: true
  36. };
  37. exports.retryHttpCodes = retryHttpCodes;
  38. const isHttpRetryable = httpResCode => {
  39. return retryHttpCodes[httpResCode] !== undefined;
  40. };
  41. const sleep = ms => {
  42. return new Promise(resolve => setTimeout(resolve, ms));
  43. };
  44. const getExpBackOffDelay = (retryCount, baseDelayMs, maximumDelayMs) => {
  45. const backOffBy = baseDelayMs * (1 << retryCount);
  46. const additionalDelay = Math.random() * backOffBy;
  47. return Math.min(backOffBy + additionalDelay, maximumDelayMs);
  48. };
  49. async function requestWithRetry(transport, opt, body = null, maxRetries = MAX_RETRIES, baseDelayMs = BASE_DELAY_MS, maximumDelayMs = MAX_DELAY_MS) {
  50. let attempt = 0;
  51. let isRetryable = false;
  52. while (attempt <= maxRetries) {
  53. try {
  54. const response = await request(transport, opt, body);
  55. // Check if the HTTP status code is retryable
  56. if (isHttpRetryable(response.statusCode)) {
  57. isRetryable = true;
  58. throw new Error(`Retryable HTTP status: ${response.statusCode}`); // trigger retry attempt with calculated delay
  59. }
  60. return response; // Success, return the raw response
  61. } catch (err) {
  62. if (isRetryable) {
  63. attempt++;
  64. isRetryable = false;
  65. if (attempt > maxRetries) {
  66. throw new Error(`Request failed after ${maxRetries} retries: ${err}`);
  67. }
  68. const delay = getExpBackOffDelay(attempt, baseDelayMs, maximumDelayMs);
  69. // eslint-disable-next-line no-console
  70. console.warn(`${new Date().toLocaleString()} Retrying request (attempt ${attempt}/${maxRetries}) after ${delay}ms due to: ${err}`);
  71. await sleep(delay);
  72. } else {
  73. throw err; // re-throw if any request, syntax errors
  74. }
  75. }
  76. }
  77. throw new Error(`${MAX_RETRIES} Retries exhausted, request failed.`);
  78. }
  79. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3RyZWFtIiwicmVxdWlyZSIsIl91dGlsIiwicGlwZWxpbmVBc3luYyIsInByb21pc2lmeSIsInBpcGVsaW5lIiwicmVxdWVzdCIsInRyYW5zcG9ydCIsIm9wdCIsImJvZHkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlcXVlc3RPYmoiLCJyZXNwb25zZSIsIm9uIiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJlbmQiLCJjYXRjaCIsIk1BWF9SRVRSSUVTIiwiQkFTRV9ERUxBWV9NUyIsIk1BWF9ERUxBWV9NUyIsInJldHJ5SHR0cENvZGVzIiwiZXhwb3J0cyIsImlzSHR0cFJldHJ5YWJsZSIsImh0dHBSZXNDb2RlIiwidW5kZWZpbmVkIiwic2xlZXAiLCJtcyIsInNldFRpbWVvdXQiLCJnZXRFeHBCYWNrT2ZmRGVsYXkiLCJyZXRyeUNvdW50IiwiYmFzZURlbGF5TXMiLCJtYXhpbXVtRGVsYXlNcyIsImJhY2tPZmZCeSIsImFkZGl0aW9uYWxEZWxheSIsIk1hdGgiLCJyYW5kb20iLCJtaW4iLCJyZXF1ZXN0V2l0aFJldHJ5IiwibWF4UmV0cmllcyIsImF0dGVtcHQiLCJpc1JldHJ5YWJsZSIsInN0YXR1c0NvZGUiLCJFcnJvciIsImVyciIsImRlbGF5IiwiY29uc29sZSIsIndhcm4iLCJEYXRlIiwidG9Mb2NhbGVTdHJpbmciXSwic291cmNlcyI6WyJyZXF1ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgdHlwZSAqIGFzIGh0dHBzIGZyb20gJ25vZGU6aHR0cHMnXG5pbXBvcnQgdHlwZSAqIGFzIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnbm9kZTpzdHJlYW0nXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNwb3J0IH0gZnJvbSAnLi90eXBlLnRzJ1xuXG5jb25zdCBwaXBlbGluZUFzeW5jID0gcHJvbWlzaWZ5KHBpcGVsaW5lKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gIG9wdDogaHR0cHMuUmVxdWVzdE9wdGlvbnMsXG4gIGJvZHk6IEJ1ZmZlciB8IHN0cmluZyB8IHN0cmVhbS5SZWFkYWJsZSB8IG51bGwgPSBudWxsLFxuKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8aHR0cC5JbmNvbWluZ01lc3NhZ2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0T2JqID0gdHJhbnNwb3J0LnJlcXVlc3Qob3B0LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgfSlcblxuICAgIHJlcXVlc3RPYmoub24oJ2Vycm9yJywgcmVqZWN0KVxuXG4gICAgaWYgKCFib2R5IHx8IEJ1ZmZlci5pc0J1ZmZlcihib2R5KSB8fCB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcXVlc3RPYmouZW5kKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBpcGVsaW5lQXN5bmMoYm9keSwgcmVxdWVzdE9iaikuY2F0Y2gocmVqZWN0KVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgTUFYX1JFVFJJRVMgPSAxXG5jb25zdCBCQVNFX0RFTEFZX01TID0gMTAwIC8vIEJhc2UgZGVsYXkgZm9yIGV4cG9uZW50aWFsIGJhY2tvZmZcbmNvbnN0IE1BWF9ERUxBWV9NUyA9IDYwMDAwIC8vIE1heCBkZWxheSBmb3IgZXhwb25lbnRpYWwgYmFja29mZlxuXG4vLyBSZXRyeWFibGUgZXJyb3IgY29kZXMgZm9yIEhUVFAgKCByZWY6IG1pbmlvLWdvKVxuZXhwb3J0IGNvbnN0IHJldHJ5SHR0cENvZGVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHtcbiAgNDA4OiB0cnVlLFxuICA0Mjk6IHRydWUsXG4gIDQ5OTogdHJ1ZSxcbiAgNTAwOiB0cnVlLFxuICA1MDI6IHRydWUsXG4gIDUwMzogdHJ1ZSxcbiAgNTA0OiB0cnVlLFxuICA1MjA6IHRydWUsXG59XG5cbmNvbnN0IGlzSHR0cFJldHJ5YWJsZSA9IChodHRwUmVzQ29kZTogbnVtYmVyKSA9PiB7XG4gIHJldHVybiByZXRyeUh0dHBDb2Rlc1todHRwUmVzQ29kZV0gIT09IHVuZGVmaW5lZFxufVxuXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG59XG5cbmNvbnN0IGdldEV4cEJhY2tPZmZEZWxheSA9IChyZXRyeUNvdW50OiBudW1iZXIsIGJhc2VEZWxheU1zOiBudW1iZXIsIG1heGltdW1EZWxheU1zOiBudW1iZXIpID0+IHtcbiAgY29uc3QgYmFja09mZkJ5ID0gYmFzZURlbGF5TXMgKiAoMSA8PCByZXRyeUNvdW50KVxuICBjb25zdCBhZGRpdGlvbmFsRGVsYXkgPSBNYXRoLnJhbmRvbSgpICogYmFja09mZkJ5XG4gIHJldHVybiBNYXRoLm1pbihiYWNrT2ZmQnkgKyBhZGRpdGlvbmFsRGVsYXksIG1heGltdW1EZWxheU1zKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFdpdGhSZXRyeShcbiAgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gIG9wdDogaHR0cHMuUmVxdWVzdE9wdGlvbnMsXG4gIGJvZHk6IEJ1ZmZlciB8IHN0cmluZyB8IHN0cmVhbS5SZWFkYWJsZSB8IG51bGwgPSBudWxsLFxuICBtYXhSZXRyaWVzOiBudW1iZXIgPSBNQVhfUkVUUklFUyxcbiAgYmFzZURlbGF5TXM6IG51bWJlciA9IEJBU0VfREVMQVlfTVMsXG4gIG1heGltdW1EZWxheU1zOiBudW1iZXIgPSBNQVhfREVMQVlfTVMsXG4pOiBQcm9taXNlPGh0dHAuSW5jb21pbmdNZXNzYWdlPiB7XG4gIGxldCBhdHRlbXB0ID0gMFxuICBsZXQgaXNSZXRyeWFibGUgPSBmYWxzZVxuICB3aGlsZSAoYXR0ZW1wdCA8PSBtYXhSZXRyaWVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh0cmFuc3BvcnQsIG9wdCwgYm9keSlcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGlzIHJldHJ5YWJsZVxuICAgICAgaWYgKGlzSHR0cFJldHJ5YWJsZShyZXNwb25zZS5zdGF0dXNDb2RlIGFzIG51bWJlcikpIHtcbiAgICAgICAgaXNSZXRyeWFibGUgPSB0cnVlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmV0cnlhYmxlIEhUVFAgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCkgLy8gdHJpZ2dlciByZXRyeSBhdHRlbXB0IHdpdGggY2FsY3VsYXRlZCBkZWxheVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2UgLy8gU3VjY2VzcywgcmV0dXJuIHRoZSByYXcgcmVzcG9uc2VcbiAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1JldHJ5YWJsZSkge1xuICAgICAgICBhdHRlbXB0KytcbiAgICAgICAgaXNSZXRyeWFibGUgPSBmYWxzZVxuXG4gICAgICAgIGlmIChhdHRlbXB0ID4gbWF4UmV0cmllcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSByZXRyaWVzOiAke2Vycn1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gZ2V0RXhwQmFja09mZkRlbGF5KGF0dGVtcHQsIGJhc2VEZWxheU1zLCBtYXhpbXVtRGVsYXlNcylcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKX0gUmV0cnlpbmcgcmVxdWVzdCAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pIGFmdGVyICR7ZGVsYXl9bXMgZHVlIHRvOiAke2Vycn1gLFxuICAgICAgICApXG4gICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyIC8vIHJlLXRocm93IGlmIGFueSByZXF1ZXN0LCBzeW50YXggZXJyb3JzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGAke01BWF9SRVRSSUVTfSBSZXRyaWVzIGV4aGF1c3RlZCwgcmVxdWVzdCBmYWlsZWQuYClcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUlBLE1BQU1FLGFBQWEsR0FBRyxJQUFBQyxlQUFTLEVBQUNDLGdCQUFRLENBQUM7QUFFbEMsZUFBZUMsT0FBT0EsQ0FDM0JDLFNBQW9CLEVBQ3BCQyxHQUF5QixFQUN6QkMsSUFBOEMsR0FBRyxJQUFJLEVBQ3RCO0VBQy9CLE9BQU8sSUFBSUMsT0FBTyxDQUF1QixDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUM1RCxNQUFNQyxVQUFVLEdBQUdOLFNBQVMsQ0FBQ0QsT0FBTyxDQUFDRSxHQUFHLEVBQUdNLFFBQVEsSUFBSztNQUN0REgsT0FBTyxDQUFDRyxRQUFRLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUZELFVBQVUsQ0FBQ0UsRUFBRSxDQUFDLE9BQU8sRUFBRUgsTUFBTSxDQUFDO0lBRTlCLElBQUksQ0FBQ0gsSUFBSSxJQUFJTyxNQUFNLENBQUNDLFFBQVEsQ0FBQ1IsSUFBSSxDQUFDLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUM5REksVUFBVSxDQUFDSyxHQUFHLENBQUNULElBQUksQ0FBQztJQUN0QixDQUFDLE1BQU07TUFDTE4sYUFBYSxDQUFDTSxJQUFJLEVBQUVJLFVBQVUsQ0FBQyxD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