You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.3 KiB
54 lines
1.3 KiB
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'); |
|
} |
|
|
|
|