@lakutata/core
Version:
Lakutata Framework Core
171 lines • 7.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpRequest = void 0;
const Plugin_1 = require("../base/Plugin");
const needle_1 = require("needle");
const HttpRequestException_1 = require("../exceptions/HttpRequestException");
const fs_1 = __importDefault(require("fs"));
class HttpRequest extends Plugin_1.Plugin {
async multipartUpload(setting) {
return new Promise((resolve, reject) => {
const method = setting.method ? setting.method : 'put';
const url = setting.url.toString();
const filename = setting.filename;
const file = setting.file;
const contentType = setting.contentType ? setting.contentType : 'application/octet-stream';
const field = setting.field ? setting.field : 'file';
const uploadDataObject = {
[field]: {
filename: filename,
content_type: contentType,
file: file
}
};
if (!fs_1.default.existsSync(file))
return reject(new HttpRequestException_1.HttpRequestException([`File [${file}] does not exist`, method.toUpperCase(), url]));
const fileStat = fs_1.default.statSync(file);
if (!fileStat.isFile())
return reject(new HttpRequestException_1.HttpRequestException([`[${file}] is not file`, method.toUpperCase(), url]));
(0, needle_1.request)(method, url, uploadDataObject, Object.assign(setting.options ? setting.options : {}, { multipart: true }), (error, response) => {
if (error) {
reject(new HttpRequestException_1.HttpRequestException([error.message, method.toUpperCase(), url.toString()]));
}
else {
resolve(response.body);
}
});
});
}
async download(setting, progressCallback) {
return new Promise((resolve, reject) => {
const method = setting.method ? setting.method : 'get';
const filename = setting.filename;
const url = setting.url.toString();
const params = setting.params ? setting.params : null;
const options = Object.assign(setting.options ? setting.options : {}, { output: filename });
const stream = (0, needle_1.request)(method, url, params, options);
let dataSize = 0;
let receivedDataSize = 0;
let progress = 0;
const internalProgressCallback = (exception, isDone, progress) => {
if (progressCallback)
progressCallback(exception, isDone, progress);
if (exception) {
reject(exception);
}
if (isDone) {
resolve();
}
};
stream
.on('header', (statusCode, headers) => {
dataSize = headers['content-length'] ? parseInt(headers['content-length']) : 0;
internalProgressCallback(null, false, progress);
})
.on('readable', () => {
let chunk;
while (chunk = stream.read()) {
receivedDataSize += chunk.length;
if (dataSize > 0) {
progress = (receivedDataSize / dataSize) * 100;
}
else {
progress = 0;
}
fs_1.default.appendFileSync(filename, chunk);
internalProgressCallback(null, false, progress);
}
})
.on('done', (downloadError => {
let downloadException = null;
if (downloadError) {
downloadException = new HttpRequestException_1.HttpRequestException([downloadError.message, method.toUpperCase(), url.toString()]);
}
else if (dataSize === 0) {
downloadException = new HttpRequestException_1.HttpRequestException(['Received 0 length data from server', method.toUpperCase(), url.toString()]);
}
internalProgressCallback(downloadException, true, progress);
}))
.once('error', error => {
internalProgressCallback(new HttpRequestException_1.HttpRequestException([error.message, method.toUpperCase(), url.toString()]), false, progress);
});
});
}
async get(url, options) {
return new Promise((resolve, reject) => {
(0, needle_1.get)(url.toString(), options, (error, response) => {
if (error) {
reject(new HttpRequestException_1.HttpRequestException([error.message, 'GET', url.toString()]));
}
else {
resolve(response.body);
}
});
});
}
async post(url, body, options) {
return new Promise((resolve, reject) => {
(0, needle_1.post)(url.toString(), body, options, (error, response) => {
if (error) {
reject(new HttpRequestException_1.HttpRequestException([error.message, 'POST', url.toString()]));
}
else {
resolve(response.body);
}
});
});
}
async put(url, body, options) {
return new Promise((resolve, reject) => {
(0, needle_1.put)(url.toString(), body, options, (error, response) => {
if (error) {
reject(new HttpRequestException_1.HttpRequestException([error.message, 'PUT', url.toString()]));
}
else {
resolve(response.body);
}
});
});
}
async patch(url, body, options) {
return new Promise((resolve, reject) => {
(0, needle_1.patch)(url.toString(), body, options, (error, response) => {
if (error) {
reject(new HttpRequestException_1.HttpRequestException([error.message, 'PATCH', url.toString()]));
}
else {
resolve(response.body);
}
});
});
}
async delete(url, body, options) {
return new Promise((resolve, reject) => {
(0, needle_1.delete)(url.toString(), body, options, (error, response) => {
if (error) {
reject(new HttpRequestException_1.HttpRequestException([error.message, 'DELETE', url.toString()]));
}
else {
resolve(response.body);
}
});
});
}
async head(url, options) {
return new Promise((resolve) => {
(0, needle_1.head)(url.toString(), options, (error) => {
if (error) {
resolve(false);
}
else {
resolve(true);
}
});
});
}
}
exports.HttpRequest = HttpRequest;
//# sourceMappingURL=HttpRequest.js.map