UNPKG

@smash-sdk/core

Version:

Smash Sdk Core

155 lines (154 loc) 6.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Client = void 0; const config_1 = require("../config/config"); const sdkError_1 = require("../errors/sdkError"); const error_1 = require("../helper/error"); const node_1 = require("../helper/node"); const refreshTokenManager_1 = require("../helper/refreshTokenManager"); const http_1 = require("../http"); class Client { constructor(params) { this.service = params.service; this.client = params.client || new http_1.AxiosClient(); this.client.setHttpConfiguration({ timeout: this.getTimeout(params), httpAgent: params.httpAgent, httpsAgent: params.httpsAgent, }); this.token = params.token ? params.token : config_1.config.getToken(); this.region = this.getRegion(params); this.host = this.getHost(params); this.userAgent = params.userAgent; if (params.refreshTokenMethod) { this.refreshTokenManager = new refreshTokenManager_1.RefreshTokenManager(params.refreshTokenMethod); this.refreshTokenMethod = this.refreshTokenManager.getRefreshTokenMethod(); } else if (config_1.config.getRefreshTokenMethod() && config_1.config.getRefreshTokenManager() !== undefined) { this.refreshTokenManager = config_1.config.getRefreshTokenManager(); this.refreshTokenMethod = this.refreshTokenManager?.getRefreshTokenMethod(); } } getRegion(params) { const region = config_1.config.getRegion(); if (params.type === 'global' && params.region) { throw new sdkError_1.InvalidRegionError('Invalid region: region ' + params.region + ' provided in constructor not available'); } if (!params.host && params.type === 'regional' && !params.region && !region) { throw new sdkError_1.InvalidRegionOrHostError('Invalid region or host: no host or no region provided in constructor and no region configured in config'); } if (params.type === 'global') { return 'global'; } if (params.region && params.type === 'regional') { return params.region; } if (region && params.type === 'regional') { return region; } if (!params.host) { throw new sdkError_1.InvalidRegionError('Invalid region: no region provided in constructor and no region configured in config'); } } getHost(params) { if (params.host) { return params.host; } const host = config_1.config.getHost(this.service, this.region); if (host) { return host; } throw new sdkError_1.InvalidHostError('Invalid host: no host provided in constructor and no host configured in config'); } getTimeout(params) { if (params.timeout) { return params.timeout; } const timeout = config_1.config.getTimeout(); if (timeout) { return timeout; } return undefined; } getHttpAgent(params) { if (params.httpAgent) { return params.httpAgent; } const httpAgent = config_1.config.getHttpAgent(); if (httpAgent) { return httpAgent; } return undefined; } getHttpsAgent(params) { if (params.httpsAgent) { return params.httpsAgent; } const httpsAgent = config_1.config.getHttpsAgent(); if (httpsAgent) { return httpsAgent; } return undefined; } handle(request, retries = 0) { return new Promise(async (resolve, reject) => { if ((0, node_1.isNode)()) { request.headers['User-Agent'] = this.userAgent; } request = this.cleanRequest(request); try { const smashResponse = await this.client.handle(request); if (smashResponse.statusCode === 401 && typeof request.refreshTokenMethod === 'function') { try { const token = await request.refreshTokenMethod(smashResponse, retries); if (token) { this.token = token; const newRequest = request; newRequest.headers = { ...request.headers, Authorization: 'Bearer ' + this.token }; const newResponse = await this.handle(newRequest, ++retries); resolve(newResponse); } else { resolve(smashResponse); } } catch (error) { reject(error); } } else { resolve(smashResponse); } } catch (error) { reject(error); } }); } parseResponse(response, errors) { if (this.isValidStatusCode(response.statusCode)) { return response.body ? response.body : {}; } else if (response?.body?.name && errors[(0, error_1.formatErrorName)((response?.body).name)]) { const body = response?.body; const error = new errors[(0, error_1.formatErrorName)((response?.body).name)](body); throw error; } else { throw new sdkError_1.UnknownError(response?.body); } } isValidStatusCode(code) { return code >= 200 && code < 300; } clean(data) { Object.keys(data).forEach(key => data[key] === undefined && delete data[key]); return data; } cleanRequest(request) { request.headers = this.clean(request.headers); request.queryParameters = this.clean(request.queryParameters); return request; } } exports.Client = Client;