@itwin/imodels-client-management
Version:
iModels API client wrapper for applications that manage iModels.
91 lines • 3.92 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AxiosRestClient = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
const axios_1 = __importDefault(require("axios"));
const internal_1 = require("../internal/");
const RestClient_1 = require("../types/RestClient");
const AxiosResponseHeadersAdapter_1 = require("./AxiosResponseHeadersAdapter");
/** Default implementation for {@link RestClient} interface that uses `axios` library for sending the requests. */
class AxiosRestClient {
static retryCountUpperBound = 10;
_retryPolicy;
constructor(retryPolicy) {
this._retryPolicy = retryPolicy;
}
async sendGetRequest(params) {
const requestConfig = {
headers: params.headers,
};
if (params.responseType === RestClient_1.ContentType.Png) {
requestConfig.responseType = "arraybuffer";
const response = await this.executeRequest(async () => axios_1.default.get(params.url, requestConfig));
const data = response.body;
if (data instanceof ArrayBuffer)
return { ...response, body: new Uint8Array(data) };
return response;
}
return this.executeRequest(async () => axios_1.default.get(params.url, requestConfig));
}
async sendPostRequest(params) {
const requestConfig = {
headers: params.headers,
};
return this.executeRequest(async () => axios_1.default.post(params.url, params.body.content ?? {}, requestConfig));
}
async sendPutRequest(params) {
const requestConfig = {
headers: params.headers,
};
return this.executeRequest(async () => axios_1.default.put(params.url, params.body?.content, requestConfig));
}
async sendPatchRequest(params) {
const requestConfig = {
headers: params.headers,
};
return this.executeRequest(async () => axios_1.default.patch(params.url, params.body.content ?? {}, requestConfig));
}
async sendDeleteRequest(params) {
const requestConfig = {
headers: params.headers,
};
return this.executeRequest(async () => axios_1.default.delete(params.url, requestConfig));
}
async executeRequest(requestFunc) {
const response = await this.executeWithRetry(requestFunc);
return {
body: response.data,
headers: new AxiosResponseHeadersAdapter_1.AxiosResponseHeadersAdapter(response),
};
}
async executeWithRetry(requestFunc) {
let retriesInvoked = 0;
for (;;) {
try {
return await requestFunc();
}
catch (error) {
if (this._retryPolicy === null ||
retriesInvoked >= this._retryPolicy.maxRetries ||
retriesInvoked >= AxiosRestClient.retryCountUpperBound ||
!(await this._retryPolicy.shouldRetry({ retriesInvoked, error }))) {
throw error;
}
const sleepDurationInMs = this._retryPolicy.getSleepDurationInMs({
retriesInvoked: retriesInvoked++,
});
if (sleepDurationInMs > 0) {
await internal_1.UtilityFunctions.sleep(sleepDurationInMs);
}
}
}
}
}
exports.AxiosRestClient = AxiosRestClient;
//# sourceMappingURL=AxiosRestClient.js.map