@foxxie/centra
Version:
A fork of Centra to support shortcut methods in Foxxie, and with typescript support.
248 lines (247 loc) • 10.9 kB
JavaScript
"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());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CentraRequest = void 0;
var node_path_1 = require("node:path");
var node_http_1 = require("node:http");
var node_https_1 = require("node:https");
var querystring_1 = require("querystring");
var zlib_1 = require("zlib");
var package_json_1 = require("../package.json");
var CentraResponse_1 = require("./CentraResponse");
var supportedCompressions = ['gzip', 'deflate'];
var CentraRequest = /** @class */ (function () {
function CentraRequest(url, method) {
if (method === void 0) { method = 'GET'; }
this.url = typeof url === 'string' ? new URL(url) : url;
this.method = method;
this.data = null;
this.sendDataAs = null;
this.reqHeaders = {};
this.streamEnabled = false;
this.compressionEnabled = false;
this.timeoutTime = null;
this.ua = "".concat(package_json_1.name, "@").concat(package_json_1.version);
this.coreOptions = {};
this.resOptions = {
maxBuffer: 50 * 1000000 // 50 MB
};
return this;
}
CentraRequest.prototype.query = function (a1, a2) {
var _this = this;
if (typeof a1 === 'object') {
Object.keys(a1).forEach(function (queryKey) {
_this.url.searchParams.append(queryKey, a1[queryKey]);
});
}
else
this.url.searchParams.append(a1, a2);
return this;
};
CentraRequest.prototype.path = function (relativePath) {
this.url.pathname = (0, node_path_1.join)(this.url.pathname, relativePath);
return this;
};
CentraRequest.prototype.body = function (data, sendAs) {
this.sendDataAs = typeof data === 'object' && !sendAs && !Buffer.isBuffer(data) ? 'json' : sendAs ? sendAs.toLowerCase() : 'buffer';
this.data = this.sendDataAs === 'form' ? (0, querystring_1.stringify)(data) : this.sendDataAs === 'json' ? JSON.stringify(data) : data;
return this;
};
CentraRequest.prototype.header = function (a1, a2) {
var _this = this;
if (typeof a1 === 'object') {
Object.keys(a1).forEach(function (headerName) {
_this.reqHeaders[headerName.toLowerCase()] = a1[headerName];
});
}
else
this.reqHeaders[a1.toLowerCase()] = a2;
return this;
};
CentraRequest.prototype.timeout = function (timeout) {
this.timeoutTime = timeout;
return this;
};
CentraRequest.prototype.option = function (name, value) {
this.coreOptions[name] = value;
return this;
};
CentraRequest.prototype.agent = function (agent) {
this.ua = agent;
return this;
};
CentraRequest.prototype.stream = function () {
this.streamEnabled = true;
return this;
};
CentraRequest.prototype.compress = function () {
this.compressionEnabled = true;
if (!this.reqHeaders['accept-encoding'])
this.reqHeaders['accept-encoding'] = supportedCompressions.join(', ');
return this;
};
CentraRequest.prototype.json = function () {
return __awaiter(this, void 0, void 0, function () {
var result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.send()];
case 1:
result = _a.sent();
return [2 /*return*/, result.json()];
}
});
});
};
CentraRequest.prototype.raw = function () {
return __awaiter(this, void 0, void 0, function () {
var result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.send()];
case 1:
result = _a.sent();
return [2 /*return*/, result.body];
}
});
});
};
CentraRequest.prototype.text = function () {
return __awaiter(this, void 0, void 0, function () {
var result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.send()];
case 1:
result = _a.sent();
return [2 /*return*/, result.text()];
}
});
});
};
CentraRequest.prototype.send = function () {
var _this = this;
return new Promise(function (resolve, reject) {
if (_this.data) {
if (!_this.reqHeaders.hasOwnProperty('content-type')) {
if (_this.sendDataAs === 'json') {
_this.reqHeaders['content-type'] = 'application/json';
}
else if (_this.sendDataAs === 'form') {
_this.reqHeaders['content-type'] = 'application/x-www-form-urlencoded';
}
}
if (!_this.reqHeaders.hasOwnProperty('content-length')) {
_this.reqHeaders['content-length'] = Buffer.byteLength(_this.data);
}
}
_this.header('User-Agent', _this.ua);
var options = Object.assign({
protocol: _this.url.protocol,
host: _this.url.hostname,
port: _this.url.port,
path: _this.url.pathname + (_this.url.search === null ? '' : _this.url.search),
method: _this.method,
headers: _this.reqHeaders
}, _this.coreOptions);
var req;
var resHandler = function (res) {
var stream = res;
if (_this.compressionEnabled) {
if (res.headers['content-encoding'] === 'gzip') {
stream = res.pipe((0, zlib_1.createGunzip)());
}
else if (res.headers['content-encoding'] === 'deflate') {
stream = res.pipe((0, zlib_1.createInflate)());
}
}
var centraRes;
if (_this.streamEnabled) {
resolve(stream);
}
else {
centraRes = new CentraResponse_1.CentraResponse(res, _this.resOptions);
stream.on('error', function (err) {
reject(err);
});
stream.on('aborted', function () {
reject(new Error('Server aborted request'));
});
stream.on('data', function (chunk) {
centraRes._addChunk(chunk);
if (_this.resOptions.maxBuffer !== null && centraRes.body.length > _this.resOptions.maxBuffer) {
stream.destroy();
reject('Received a response which was longer than acceptable when buffering. (' + _this.body.length + ' bytes)');
}
});
stream.on('end', function () {
resolve(centraRes);
});
}
};
if (_this.url.protocol === 'http:') {
req = (0, node_http_1.request)(options, resHandler);
}
else if (_this.url.protocol === 'https:') {
req = (0, node_https_1.request)(options, resHandler);
}
else if (_this.url.protocol === 'localhost:') {
req = (0, node_http_1.request)(options, resHandler);
}
else
throw new Error('Bad URL protocol: ' + _this.url.protocol);
if (_this.timeoutTime) {
req.setTimeout(_this.timeoutTime, function () {
req.abort();
if (!_this.streamEnabled) {
reject(new Error('Timeout reached'));
}
});
}
req.on('error', function (err) {
reject(err);
});
if (_this.data)
req.write(_this.data);
req.end();
});
};
return CentraRequest;
}());
exports.CentraRequest = CentraRequest;