@logi.one/rest-client
Version:
This is a free, ultra-lightweight and easy to use rest client for node.js supporting JSON requests and streams with no external dependencies.
128 lines (127 loc) • 5.11 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStream = getStream;
exports.postStream = postStream;
exports.putStream = putStream;
const promises_1 = require("stream/promises");
const request_error_1 = require("./request-error");
const search_1 = require("./search");
async function getStream(url, options) {
url = (0, search_1.appendSearchToURL)(url, options?.search);
const { protocol, httpRequestOptions } = getHTTPRequestOptions('GET', url, options);
const request = await importHttpRequest(protocol);
return new Promise((resolve, reject) => {
const req = request(httpRequestOptions, (response) => {
if (!response.statusCode) {
reject(new Error('No status code'));
}
else if (response.statusCode < 200 || response.statusCode > 299) {
reject(new request_error_1.RequestError(response.statusMessage || '', response.statusCode, getHeaders(response.headers), response));
}
else {
resolve(response);
}
});
req.on('error', (err) => {
reject(err);
});
req.end();
});
}
async function postStream(url, readableStream, options) {
return postOrPutStream('POST', url, readableStream, options);
}
async function putStream(url, readableStream, options) {
return postOrPutStream('PUT', url, readableStream, options);
}
async function postOrPutStream(method, url, readableStream, options) {
url = (0, search_1.appendSearchToURL)(url, options?.search);
const { protocol, httpRequestOptions } = getHTTPRequestOptions(method, url, options);
const request = await importHttpRequest(protocol);
let req;
const promise = new Promise((resolve, reject) => {
req = request(httpRequestOptions, (response) => {
if (!response.statusCode) {
reject(new Error('No status code'));
}
else if (response.statusCode < 200 || response.statusCode > 299) {
reject(new request_error_1.RequestError(response.statusMessage || '', response.statusCode, getHeaders(response.headers), response));
}
else {
resolve(response);
}
});
});
await (0, promises_1.pipeline)(readableStream, req);
return promise;
}
function getHeaders(incomingHttpHeaders) {
const headers = new Headers();
for (const key in incomingHttpHeaders) {
if (incomingHttpHeaders.hasOwnProperty(key)) {
const value = incomingHttpHeaders[key];
if (Array.isArray(value)) {
for (const v of value) {
headers.append(key, v);
}
}
else {
headers.append(key, value ?? '');
}
}
}
return headers;
}
function getHTTPRequestOptions(method, url, options = {}) {
const urlParsed = new URL(url);
const headers = options.headers || {};
headers['User-Agent'] = headers['User-Agent'] || 'node';
if (options.token) {
headers.Authorization = `Bearer ${options.token}`;
}
const httpRequestOptions = {
hostname: urlParsed.hostname,
port: urlParsed.port ? +urlParsed.port : (urlParsed.protocol === 'http:' ? 80 : 443),
path: `${urlParsed.pathname}${urlParsed.search}`,
method,
headers
};
return { protocol: urlParsed.protocol, httpRequestOptions };
}
async function importHttpRequest(protocol) {
const { request } = await (protocol === 'https:' ? Promise.resolve().then(() => __importStar(require('https'))) : Promise.resolve().then(() => __importStar(require('http'))));
return request;
}
;