UNPKG

@naturalcycles/nodejs-lib

Version:
47 lines (46 loc) 1.41 kB
import { Transform } from 'node:stream'; /** * Transforms chunks of JSON strings/Buffers (objectMode=false) into parsed objects (readableObjectMode=true). * * if strict - will throw an error on JSON.parse / stringify error * * Usage: * * await _pipeline([ * readable, * binarySplit(), * transformJsonParse(), * consumeYourStream... * [) */ export function transformJsonParse(opt = {}) { const { strict = true, reviver } = opt; return new Transform({ writableObjectMode: false, readableObjectMode: true, // highWatermark increased, because it's proven to be faster: https://github.com/nodejs/node/pull/52037 writableHighWaterMark: 64 * 1024, transform(chunk, _, cb) { try { const data = JSON.parse(chunk, reviver); cb(null, data); } catch (err) { if (strict) { cb(err); // emit error } else { console.error(err); cb(); // emit no error, but no result neither } } }, }); } // Based on: https://stackoverflow.com/a/34557997/4919972 export const bufferReviver = (_k, v) => { if (v !== null && typeof v === 'object' && v.type === 'Buffer' && Array.isArray(v.data)) { return Buffer.from(v.data); } return v; };