| |
| var util = require('util'); |
| var PassThrough = require('stream').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 that = this; |
| 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); |
| this.pipe(destination); |
| }); |
| |
| this.emit('writable'); |
| } |
| |