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;