// // Source: https://github.com/jpommerening/node-lazystream // var util = require('util'); var PassThrough = require('./readable-stream/passthrough') module.exports = { Readable: Readable, Writable: Writable }; util.inherits(Readable, PassThrough); util.inherits(Writable, PassThrough); // Patch the given method of instance so that the callback // is executed once, before the actual method is called the // first time. function beforeFirstCall(instance, method, callback) { instance[method] = function () { delete instance[method]; callback.apply(this, arguments); return this[method].apply(this, arguments); }; } function Readable(fn, options) { if (!(this instanceof Readable)) return new Readable(fn, options); PassThrough.call(this, options); beforeFirstCall(this, '_read', function () { var source = fn.call(this, options); var emit = this.emit.bind(this, 'error'); source.on('error', emit); source.pipe(this); }); this.emit('readable'); } function Writable(fn, options) { if (!(this instanceof Writable)) return new Writable(fn, options); PassThrough.call(this, options); beforeFirstCall(this, '_write', function () { var destination = fn.call(this, options); var emit = this.emit.bind(this, 'error'); destination.on('error', emit); this.pipe(destination); }); this.emit('writable'); }