You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.3 KiB
75 lines
1.3 KiB
const {EventEmitter} = require('events');
|
|
|
|
class LineBuffer extends EventEmitter {
|
|
constructor(options) {
|
|
super();
|
|
|
|
this.encoding = options.encoding;
|
|
|
|
this.buffer = null;
|
|
|
|
// part of cork/uncork
|
|
this.corked = false;
|
|
this.queue = [];
|
|
}
|
|
|
|
// Events:
|
|
// line: here is a line
|
|
// done: all lines emitted
|
|
|
|
write(chunk) {
|
|
// find line or lines in chunk and emit them if not corked
|
|
// or queue them if corked
|
|
const data = this.buffer ? this.buffer + chunk : chunk;
|
|
const lines = data.split(/\r?\n/g);
|
|
|
|
// save the last line
|
|
this.buffer = lines.pop();
|
|
|
|
lines.forEach(function(line) {
|
|
if (this.corked) {
|
|
this.queue.push(line);
|
|
} else {
|
|
this.emit('line', line);
|
|
}
|
|
});
|
|
|
|
return !this.corked;
|
|
}
|
|
|
|
cork() {
|
|
this.corked = true;
|
|
}
|
|
|
|
uncork() {
|
|
this.corked = false;
|
|
this._flush();
|
|
|
|
// tell the source I'm ready again
|
|
this.emit('drain');
|
|
}
|
|
|
|
setDefaultEncoding() {
|
|
// ?
|
|
}
|
|
|
|
end() {
|
|
if (this.buffer) {
|
|
this.emit('line', this.buffer);
|
|
this.buffer = null;
|
|
}
|
|
this.emit('done');
|
|
}
|
|
|
|
_flush() {
|
|
if (!this.corked) {
|
|
this.queue.forEach(line => {
|
|
this.emit('line', line);
|
|
});
|
|
this.queue = [];
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = LineBuffer;
|