blob: ebffc30275902602406b560315073c8c0a24b6f2 [file] [log] [blame]
// 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;