@intuitionrobotics/thunderstorm
Version:
186 lines • 8.12 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AxiosHttpClient = exports.AxiosHttpModule = exports.AxiosHttpModule_Class = void 0;
const axios_1 = require("axios");
const types_1 = require("../../../shared/types");
const ts_common_1 = require("@intuitionrobotics/ts-common");
const BaseHttpRequest_1 = require("../../../shared/BaseHttpRequest");
const BaseHttpModule_1 = require("../../../shared/BaseHttpModule");
const fs = require("fs");
class AxiosHttpModule_Class extends BaseHttpModule_1.BaseHttpModule_Class {
constructor(name) {
super(name || "AxiosHttpModule");
this.requestOption = {};
}
init() {
super.init();
const origin = this.config.origin;
if (origin)
this.origin = origin;
}
createRequest(method, key, data) {
return new AxiosHttpRequest(key, data, this.shouldCompress())
.setOrigin(this.origin)
.setMethod(method)
.setTimeout(this.timeout)
.setDefaultHeaders(this.defaultHeaders)
.setHandleRequestSuccess(this.handleRequestSuccess)
.setHandleRequestFailure(this.handleRequestFailure)
.setDefaultRequestHandler(this.processDefaultResponseHandlers)
.setRequestOption(this.requestOption);
}
setRequestOption(requestOption) {
this.requestOption = requestOption;
return this;
}
downloadFile(url_1, outputFile_1) {
return __awaiter(this, arguments, void 0, function* (url, outputFile, key = `Download file: ${url}`) {
const downloadRequest = yield this.createRequest(types_1.HttpMethod.GET, key)
.setResponseType("arraybuffer")
.setUrl(url);
const downloadResponse = yield downloadRequest.executeSync();
const outputFolder = outputFile.substring(0, outputFile.lastIndexOf("/"));
if (!fs.existsSync(outputFolder))
fs.mkdirSync(outputFolder);
fs.writeFileSync(outputFile, downloadResponse);
return outputFile;
});
}
}
exports.AxiosHttpModule_Class = AxiosHttpModule_Class;
exports.AxiosHttpModule = new AxiosHttpModule_Class();
class AxiosHttpRequest extends BaseHttpRequest_1.BaseHttpRequest {
constructor(requestKey, requestData, shouldCompress) {
super(requestKey, requestData);
this.requestOption = {};
this.compress = shouldCompress === undefined ? false : shouldCompress;
this.cancelSignal = axios_1.default.CancelToken.source();
}
getStatus() {
if (!this.status)
throw new ts_common_1.BadImplementationException('Missing status..');
return this.status;
}
getResponse() {
var _a;
return (_a = this.response) === null || _a === void 0 ? void 0 : _a.data;
}
resolveResponse() {
return this.getResponse();
}
abortImpl() {
this.cancelSignal.cancel(`Request with key: '${this.key}' aborted by the user.`);
}
getErrorResponse() {
return { debugMessage: this.getResponse() };
}
setRequestOption(requestOption) {
this.requestOption = requestOption;
return this;
}
executeImpl() {
//loop through whatever preprocessor
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
var _a, _b;
if (this.aborted)
return resolve();
let nextOperator = this.url.indexOf("?") === -1 ? "?" : "&";
let fullUrl = this.url;
const params = this.params;
if (params)
fullUrl = (0, ts_common_1._keys)(params).reduce((url, paramKey) => {
const param = params[paramKey];
if (!param)
return url;
const toRet = `${url}${nextOperator}${String(paramKey)}=${encodeURIComponent(param)}`;
nextOperator = "&";
return toRet;
}, this.url);
// TODO set progress listener
// this.xhr.upload.onprogress = this.onProgressListener;
const body = this.body;
// TODO add zipping of body
// if (typeof body === "string" && this.compress)
// return gzip(body, (error: Error | null, result: Buffer) => {
// if (error)
// return reject(error);
//
// xhr.send(result);
// });
//
// this.xhr.send(body as BodyInit);
const headers = Object.keys(this.headers).reduce((carry, headerKey) => {
carry[headerKey] = this.headers[headerKey].join('; ');
return carry;
}, {});
const options = Object.assign(Object.assign({}, this.requestOption), { url: fullUrl, method: this.method, headers: headers,
// TODO will probably need to use the abortController with a timeout for this.
timeout: this.timeout, cancelToken: this.cancelSignal.token });
if (body)
options.data = body;
if (this.responseType)
options.responseType = this.responseType;
try {
this.response = yield axios_1.default.request(options);
this.status = ((_a = this.response) === null || _a === void 0 ? void 0 : _a.status) || 200;
return resolve();
}
catch (e) {
if (!(e instanceof axios_1.default.AxiosError)) {
this.status = 500;
return reject(e);
}
if (axios_1.default.isCancel(e)) {
// Should already be set when I abort but just in case its aborted somehow else
this.aborted = true;
console.log('Api cancelled: ', e.message);
}
this.response = e["response"];
this.status = ((_b = this.response) === null || _b === void 0 ? void 0 : _b.status) || 500;
return reject(e);
}
}));
}
getResponseHeader(headerKey) {
if (!this.response)
throw new ts_common_1.BadImplementationException(`axios didn't return yet`);
return this.response.headers[headerKey];
}
}
class AxiosHttpClient extends BaseHttpModule_1.BaseHttpModule_Class {
constructor(name, config) {
super(name);
this.requestOption = {};
this.setConfig(config);
super.init();
const origin = this.config.origin;
if (origin)
this.origin = origin;
}
createRequest(method, key, data) {
return new AxiosHttpRequest(key, data, this.shouldCompress())
.setOrigin(this.origin)
.setMethod(method)
.setTimeout(this.timeout)
.setDefaultHeaders(this.defaultHeaders)
.setHandleRequestSuccess(this.handleRequestSuccess)
.setHandleRequestFailure(this.handleRequestFailure)
.setDefaultRequestHandler(this.processDefaultResponseHandlers)
.setRequestOption(this.requestOption);
}
setRequestOption(requestOption) {
this.requestOption = requestOption;
return this;
}
}
exports.AxiosHttpClient = AxiosHttpClient;
//# sourceMappingURL=AxiosHttpModule.js.map