@naturalcycles/nodejs-lib
Version:
Standard library for Node.js
49 lines (48 loc) • 1.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformLimit = exports.TransformLimit = void 0;
const index_1 = require("../../index");
const stream_util_1 = require("../stream.util");
/**
* Class only exists to be able to do `instanceof TransformLimit`
* and to set sourceReadable+streamDone to it in `_pipeline`.
*/
class TransformLimit extends index_1.AbortableTransform {
}
exports.TransformLimit = TransformLimit;
/**
* 0 or falsy value means "no limit"
*/
function transformLimit(opt = {}) {
const { logger = console, limit, debug } = opt;
if (!limit) {
// No limit - returning pass-through transform
return (0, index_1.transformNoOp)();
}
let i = 0; // so we start first chunk with 1
let ended = false;
return new TransformLimit({
objectMode: true,
...opt,
transform(chunk, _, cb) {
i++;
if (i === limit) {
ended = true;
logger.log(`transformLimit of ${limit} reached`);
this.push(chunk);
(0, stream_util_1.pipelineClose)('transformLimit', this, opt.sourceReadable || this.sourceReadable, opt.streamDone || this.streamDone, logger);
cb(); // after pause
}
else if (!ended) {
cb(null, chunk);
}
else {
if (debug)
logger.log(`transformLimit.transform after limit`, i);
// If we ever HANG (don't call cb) - Node will do process.exit(0) to us
cb(); // ended, don't emit anything
}
},
});
}
exports.transformLimit = transformLimit;