49 lines
1.5 KiB
JavaScript
49 lines
1.5 KiB
JavaScript
var Transform = require('stream').Transform;
|
|
|
|
function Liner() {
|
|
Transform.call(this, { objectMode: true });
|
|
}
|
|
|
|
Liner.prototype = {
|
|
_transform: function (chunk, encoding, done) {
|
|
var data = chunk.toString()
|
|
if (this._lastLineData) data = this._lastLineData + data
|
|
|
|
var lines = data.split('\n')
|
|
this._lastLineData = lines.splice(lines.length - 1, 1)[0]
|
|
|
|
lines.forEach(this.push.bind(this))
|
|
done()
|
|
},
|
|
_flush: function (done) {
|
|
if (this._lastLineData) this.push(this._lastLineData)
|
|
this._lastLineData = null
|
|
done()
|
|
}
|
|
}
|
|
|
|
extend(Transform, Liner);
|
|
|
|
function extend(base, sub) {
|
|
// Avoid instantiating the base class just to setup inheritance
|
|
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
|
|
// for a polyfill
|
|
// Also, do a recursive merge of two prototypes, so we don't overwrite
|
|
// the existing prototype, but still maintain the inheritance chain
|
|
// Thanks to @ccnokes
|
|
var origProto = sub.prototype;
|
|
sub.prototype = Object.create(base.prototype);
|
|
for (var key in origProto) {
|
|
sub.prototype[key] = origProto[key];
|
|
}
|
|
// Remember the constructor property was set wrong, let's fix it
|
|
sub.prototype.constructor = sub;
|
|
// In ECMAScript5+ (all modern browsers), you can make the constructor property
|
|
// non-enumerable if you define it like this instead
|
|
Object.defineProperty(sub.prototype, 'constructor', {
|
|
enumerable: false,
|
|
value: sub
|
|
});
|
|
}
|
|
|
|
module.exports = Liner; |