Skip to content
This repository has been archived by the owner on Jan 13, 2025. It is now read-only.

Add axios retry interceptor #269

Merged
merged 2 commits into from
Aug 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 53 additions & 1 deletion packages/hethers/dist/hethers.umd.js
Original file line number Diff line number Diff line change
Expand Up @@ -194724,6 +194724,11 @@ CRfzmSw=
return Event;
}());
exports.Event = Event;
var DEFAULT_RETRY_OPTIONS = {
maxAttempts: 3,
waitTime: 2,
errorCodes: [400, 408, 429, 500, 502, 503, 504, 511]
};
var defaultFormatter = null;
var MIRROR_NODE_TRANSACTIONS_ENDPOINT = '/api/v1/transactions/';
var MIRROR_NODE_CONTRACTS_RESULTS_ENDPOINT = '/api/v1/contracts/results/';
Expand All @@ -194740,9 +194745,9 @@ CRfzmSw=
var _this = this;
logger.checkNew(_newTarget, lib$i.Provider);
_this = _super.call(this) || this;
_this._options = options || {};
_this._events = [];
_this._emittedEvents = {};
_this._options = _this._getOptions(options);
_this._previousPollingTimestamps = {};
_this.formatter = _newTarget.getFormatter();
// If network is any, this Provider allows the underlying
Expand Down Expand Up @@ -194791,8 +194796,55 @@ CRfzmSw=
}
}
_this._pollingInterval = 3000;
_this._configureAxiosInterceptor(_this._options);
return _this;
}
BaseProvider.prototype._getOptions = function (options) {
var tmpOptions = (typeof options === 'object' && Object.keys(options).length)
? options
: { headers: {}, retry: DEFAULT_RETRY_OPTIONS };
tmpOptions.retry = (typeof options === 'object' && Object.keys(options).length === 3)
? tmpOptions.retry
: DEFAULT_RETRY_OPTIONS;
return tmpOptions;
};
BaseProvider.prototype._configureAxiosInterceptor = function (options) {
var _this = this;
axios_1.default.interceptors.request.use(function (config) {
if (!config._retriedRequest) {
config._retry = true;
config._attempts = 0;
config._waitTime = options.retry.waitTime;
}
return config;
}, function (error) {
return Promise.reject(error);
});
axios_1.default.interceptors.response.use(function (response) {
return response;
}, function (error) {
var config = error.config;
var originalRequest = config;
if (error.response) {
if (_this._options.retry.errorCodes.includes(error.response.status) && originalRequest._retry) {
originalRequest._retriedRequest = true;
originalRequest._attempts += 1;
originalRequest._waitTime = originalRequest._waitTime * originalRequest._attempts;
if (originalRequest._attempts >= _this._options.retry.maxAttempts) {
originalRequest._retry = false;
}
return _this._retryRequest(originalRequest._waitTime, originalRequest);
}
}
return Promise.reject(error);
});
};
BaseProvider.prototype._retryRequest = function (seconds, originalRequest) {
return new Promise(function (resolve, reject) {
setTimeout(function () { return resolve((0, axios_1.default)(originalRequest)); }, seconds * 1000);
});
};
;
BaseProvider.prototype._makeRequest = function (uri) {
return axios_1.default.get(this._mirrorNodeUrl + uri, { headers: this._options.headers });
};
Expand Down
2 changes: 1 addition & 1 deletion packages/hethers/dist/hethers.umd.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/hethers/dist/hethers.umd.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/hethers/dist/hethers.umd.min.js.map

Large diffs are not rendered by default.

20 changes: 19 additions & 1 deletion packages/providers/lib.esm/base-provider.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ import { Timestamp, TransactionReceipt as HederaTransactionReceipt } from '@hash
import { Formatter } from "./formatter";
import { AccountLike } from "@hethers/address";
import { AccountId, Client } from "@hashgraph/sdk";
declare module "axios" {
interface AxiosRequestConfig {
_retry?: boolean;
_retriedRequest?: boolean;
_attempts?: number;
_waitTime?: number;
}
}
export declare class Event {
readonly listener: Listener;
readonly once: boolean;
Expand All @@ -27,7 +35,13 @@ export interface Avatar {
}>;
}
export interface ProviderOptions {
headers?: Record<string, string>;
headers: Record<string, string>;
retry: RetryOptions;
}
interface RetryOptions {
maxAttempts: number;
waitTime: number;
errorCodes: Array<number>;
}
export declare class BaseProvider extends Provider {
_networkPromise: Promise<Network>;
Expand All @@ -48,6 +62,9 @@ export declare class BaseProvider extends Provider {
private readonly hederaClient;
private readonly _mirrorNodeUrl;
constructor(network: Networkish | Promise<Network> | HederaNetworkConfigLike, options?: ProviderOptions);
private _getOptions;
private _configureAxiosInterceptor;
private _retryRequest;
private _makeRequest;
_ready(): Promise<Network>;
static getFormatter(): Formatter;
Expand Down Expand Up @@ -118,4 +135,5 @@ export declare class BaseProvider extends Provider {
poll(): Promise<void>;
purgeOldEvents(): void;
}
export {};
//# sourceMappingURL=base-provider.d.ts.map
2 changes: 1 addition & 1 deletion packages/providers/lib.esm/base-provider.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 52 additions & 1 deletion packages/providers/lib.esm/base-provider.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/providers/lib.esm/base-provider.js.map

Large diffs are not rendered by default.

20 changes: 19 additions & 1 deletion packages/providers/lib/base-provider.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ import { Timestamp, TransactionReceipt as HederaTransactionReceipt } from '@hash
import { Formatter } from "./formatter";
import { AccountLike } from "@hethers/address";
import { AccountId, Client } from "@hashgraph/sdk";
declare module "axios" {
interface AxiosRequestConfig {
_retry?: boolean;
_retriedRequest?: boolean;
_attempts?: number;
_waitTime?: number;
}
}
export declare class Event {
readonly listener: Listener;
readonly once: boolean;
Expand All @@ -27,7 +35,13 @@ export interface Avatar {
}>;
}
export interface ProviderOptions {
headers?: Record<string, string>;
headers: Record<string, string>;
retry: RetryOptions;
}
interface RetryOptions {
maxAttempts: number;
waitTime: number;
errorCodes: Array<number>;
}
export declare class BaseProvider extends Provider {
_networkPromise: Promise<Network>;
Expand All @@ -48,6 +62,9 @@ export declare class BaseProvider extends Provider {
private readonly hederaClient;
private readonly _mirrorNodeUrl;
constructor(network: Networkish | Promise<Network> | HederaNetworkConfigLike, options?: ProviderOptions);
private _getOptions;
private _configureAxiosInterceptor;
private _retryRequest;
private _makeRequest;
_ready(): Promise<Network>;
static getFormatter(): Formatter;
Expand Down Expand Up @@ -118,4 +135,5 @@ export declare class BaseProvider extends Provider {
poll(): Promise<void>;
purgeOldEvents(): void;
}
export {};
//# sourceMappingURL=base-provider.d.ts.map
Loading