// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // Text line stream var stream = require('stream'); var util = require('util'); function LineStream() { var self = this; stream.call(self); self.readable = true; self.writable = true; self.buffer = ''; self.downstream = null; self.on('pipe', function(upstream) { upstream.on('end', function(data, encoding) { self.emit('end', data, encoding); }); }); } function LineStream2() { if (!(this instanceof LineStream2)) { return new LineStream2(); } stream.Transform.call(this); this.setEncoding('utf8'); } util.inherits(LineStream2, stream.Transform); LineStream2.prototype._transform = function(message, encoding, done) { var self = this; message = message.toString(encoding); var lines = message.split(/\n/); // If the data ends in "\n" this will be ""; otherwise the final partial line. var remainder = lines.pop(); if (remainder) { this.unshift(remainder); } lines.forEach(function(line) { self.push(line); }); done(); }; util.inherits(LineStream, stream); LineStream.prototype.write = function(data) { var self = this; data = data || ''; if (typeof data !== 'string') { return self.error(new Error('Data was not a string: ' + util.inspect(data))); } self.buffer += data; var lines = self.buffer.split(/\n/); self.buffer = lines.pop(); // If the data ended in "\n" this will be ""; otherwise the final partial line. lines.forEach(function(line) { self.emit('data', line); }); }; LineStream.prototype.end = function(data) { var self = this; self.is_ending = true; self.writable = false; // Always call write, even with no data, so it can fire the "end" event. self.write(data); }; LineStream.prototype.error = function(er) { var self = this; self.readable = false; self.writable = false; self.emit('error', er); // The write() method sometimes returns this value, so if there was an error, make write() return false. return false; }; module.exports = LineStream; module.exports.v2 = LineStream2;