readline-responsive
Version:
Responsive version of readline, pause() and resume() method work immediately.
116 lines (93 loc) • 2.1 kB
JavaScript
/**
* 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;