UNPKG

readline-responsive

Version:

Responsive version of readline, pause() and resume() method work immediately.

116 lines (93 loc) 2.1 kB
/** * readlineResponsive * pause() and resume() method work immediately. * * params : * @ (stream) inputStream * @ (string) filePath * * methods : * - resume * - pause * - close * * events : * - line * - resume * - pause * - close */ const readline = require("readline"), fs = require("fs"), stream = require("stream"), events = require("events"); const readlineResponsive = function (input) { /** * Declare variables */ const buffer = [], returnObj = new events.EventEmitter(); const STREAMING = 0, PAUSED = 1, CLOSED = 2; let rStream, status, srcStreamClosed = false; init(); function init () { if (typeof(input) === 'string') input = fs.createReadStream(input); //check input stream if (!(input instanceof stream.Readable)) throw "Initialize Failed. Invalid inputStream."; //create readline object rStream = readline.createInterface({ input }); status = STREAMING; rStream.on('line', line => { //Already closed if (status === CLOSED) return; buffer.push(line); if (status === STREAMING && buffer.length === 1) { _consumeBuffer(); } }); rStream.on('close', () => { srcStreamClosed = true; if (buffer.length === 0 && status === STREAMING) { status = CLOSED; returnObj.emit('close'); } }); } function resume () { if (status === CLOSED) return; status = STREAMING; _consumeBuffer(); if (status === STREAMING) rStream.resume(); } function pause () { status = PAUSED; rStream.pause(); } function close () { status = CLOSED; rStream.close(); } /** * private functions */ function _consumeBuffer () { while(status === STREAMING && buffer.length) { returnObj.emit('line', buffer.shift()); } if (srcStreamClosed && buffer.length === 0) { status = CLOSED; returnObj.emit('close'); } } returnObj.resume = resume; returnObj.pause = pause; returnObj.close = close; return returnObj; }; module.exports = readlineResponsive;