rjweb-server
Version:
Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS
92 lines (91 loc) • 3.61 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParseStream = void 0;
const stream_1 = require("stream");
const types_1 = require("util/types");
const toArrayBuffer_1 = __importDefault(require("./toArrayBuffer"));
const failMessage = (0, toArrayBuffer_1.default)('Failed to parse provided Object');
/**
* Parse almost anything into a Buffer that resolves to a string in a streamed manner
* @example
* ```
* const parseStream = new ParseStream(...)
* ```
* @since 7.9.0
*/ class ParseStream extends stream_1.Duplex {
/**
* Create a new Stream for Parsing Content on the fly
* @since 7.9.0
*/ constructor(options = {}, logger) {
const prettify = options?.prettify ?? false;
super({
writableObjectMode: true,
async write(chunk) {
const parsed = await parseContent(chunk, prettify, logger);
this.push(parsed.content, 'binary');
}, read() { }
});
}
}
exports.ParseStream = ParseStream;
/**
* Parse almost anything into a Buffer that resolves to a string
* @since 5.0.0
*/ async function parseContent(content, prettify = false, logger) {
if ((0, types_1.isPromise)(content))
return parseContent(await content, prettify, logger);
if ((0, types_1.isArrayBuffer)(content))
return { headers: {}, content };
if (Buffer.isBuffer(content))
return { headers: {}, content: (0, toArrayBuffer_1.default)(content) };
if ((0, types_1.isMap)(content))
content = Object.fromEntries(content.entries());
if ((0, types_1.isSet)(content))
content = Array.from(content);
const returnObject = { headers: {}, content: new ArrayBuffer(0) };
switch (typeof content) {
case "object":
try {
if (prettify)
returnObject.content = (0, toArrayBuffer_1.default)(JSON.stringify(content, null, 2));
else
returnObject.content = (0, toArrayBuffer_1.default)(JSON.stringify(content));
returnObject.headers['content-type'] = 'application/json';
}
catch (err) {
logger?.error('Failed to parse Object content:', err);
returnObject.content = failMessage;
}
break;
case "string":
returnObject.content = (0, toArrayBuffer_1.default)(content);
if (content.json) {
returnObject.headers['content-type'] = 'application/json';
}
break;
case "symbol":
returnObject.content = (0, toArrayBuffer_1.default)(content.toString());
break;
case "bigint":
case "number":
case "boolean":
returnObject.content = (0, toArrayBuffer_1.default)(String(content));
break;
case "function":
const result = await Promise.resolve(content());
returnObject.content = (await parseContent(result, prettify, logger)).content;
break;
case "undefined":
returnObject.content = new ArrayBuffer(0);
break;
}
if (!(0, types_1.isArrayBuffer)(returnObject.content)) {
logger?.error('Unknown Content Parsing Error occured (nB):', returnObject.content);
returnObject.content = (0, toArrayBuffer_1.default)('Unknown Parsing Error');
}
return returnObject;
}
exports.default = parseContent;