UNPKG

@itwin/imodels-client-management

Version:

iModels API client wrapper for applications that manage iModels.

91 lines 3.92 kB
"use strict"; 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