var EventEmitter = require('events').EventEmitter exports = module.exports = function (wrapper) { if('function' == typeof wrapper) return wrapper return exports[wrapper] || exports.json } exports.json = function (stream, _JSON) { _JSON = _JSON || JSON var write = stream.write var soFar = '' function parse (line) { var js try { js = _JSON.parse(line) //ignore lines of whitespace... } catch (err) { err.line = line return stream.emit('error', err) //return console.error('invalid JSON', line) } if(js !== undefined) write.call(stream, js) } function onData (data) { var lines = (soFar + data).split('\n') soFar = lines.pop() while(lines.length) { parse(lines.shift()) } } stream.write = onData var end = stream.end stream.end = function (data) { if(data) stream.write(data) //if there is any left over... if(soFar) { parse(soFar) } return end.call(stream) } stream.emit = function (event, data) { if(event == 'data') { data = _JSON.stringify(data) + '\n' } //since all stream events only use one argument, this is okay... EventEmitter.prototype.emit.call(stream, event, data) } return stream } exports.raw = function (stream) { return stream }