UNPKG

@jsonlines/core

Version:

parse and stringify jsonlines files through streams

173 lines (137 loc) 3.94 kB
'use strict'; require('core-js/modules/es.array.iterator'); require('core-js/modules/es.promise'); var lineSep = require('./line-sep-69d200dd.js'); var stream = require('stream'); function drain(writable) { if (writable.destroyed) { return Promise.reject(new Error("premature close")); } return new Promise((resolve, reject) => { const done = () => { // eslint-disable-next-line @typescript-eslint/no-use-before-define writable.removeListener("close", onClose); // eslint-disable-next-line @typescript-eslint/no-use-before-define writable.removeListener("drain", onDrain); }; const onClose = () => { done(); reject(new Error("premature close")); }; const onDrain = () => { done(); resolve(); }; writable.on("close", onClose); writable.on("drain", onDrain); }); } function resolveAsyncValue(v) { return Promise.resolve(typeof v === "function" ? // v() : v); } async function resolveAsyncDuplexSource(asyncSource) { const sc = await resolveAsyncValue(asyncSource); if (Array.isArray(sc)) { const streams = await Promise.all(sc.map(v => resolveAsyncValue(v))); stream.pipeline(streams); return { writable: streams[0], readable: streams[streams.length - 1] }; } else { const writable = await resolveAsyncValue(sc.writable); const readable = await resolveAsyncValue(sc.readable); return { writable, readable }; } } var _asyncSource = new WeakMap(); var _source = new WeakMap(); var _readSetup2 = new WeakMap(); class AsyncDuplexBase extends stream.Duplex { constructor(asyncSource, options) { super(options); _asyncSource.set(this, { writable: true, value: void 0 }); _source.set(this, { writable: true, value: void 0 }); _readSetup2.set(this, { writable: true, value: void 0 }); lineSep._classPrivateFieldSet(this, _readSetup2, false); lineSep._classPrivateFieldSet(this, _asyncSource, asyncSource); } setupSourceOnce() { if (lineSep._classPrivateFieldGet(this, _source) === undefined) { const asyncSource = lineSep._classPrivateFieldGet(this, _asyncSource); if (!asyncSource) throw new Error("invalid state"); lineSep._classPrivateFieldSet(this, _source, resolveAsyncDuplexSource(asyncSource)); } return lineSep._classPrivateFieldGet(this, _source); } async __writeAsync__(chunk, encoding, callback) { let errIsFromCallback = false; try { const { writable } = await this.setupSourceOnce(); let resolve; let reject; const p = new Promise((rsv, rjt) => { resolve = rsv; reject = rjt; }); if (!writable.write(chunk, encoding, err => { if (err) reject(err);else resolve(); })) { await drain(writable); } await p; try { callback(); } catch (err) { errIsFromCallback = true; throw err; } } catch (err) { if (!errIsFromCallback) callback(err);else throw err; } } _write(chunk, encoding, callback) { void this.__writeAsync__(chunk, encoding, callback); } _read(size) { if (!lineSep._classPrivateFieldGet(this, _readSetup2)) { void this.setupSourceOnce().then(({ readable }) => { readable.on("readable", () => { let chunk; while (null !== (chunk = readable.read(size))) { if (!this.push(chunk)) break; } }).on("end", () => { // EOF this.push(null); }); lineSep._classPrivateFieldSet(this, _readSetup2, true); }); } } _final(callback) { void this.setupSourceOnce().then(({ writable }) => { writable.end(callback); }); } } exports.AsyncDuplexBase = AsyncDuplexBase; //# sourceMappingURL=duplex-base-8f9de019.js.map