UNPKG

@intuitionrobotics/thunderstorm

Version:
186 lines 8.12 kB
"use strict"; 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