UNPKG

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
"use strict"; 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;