@smash-sdk/core
Version:
Smash Sdk Core
155 lines (154 loc) • 6.01 kB
JavaScript
"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;