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.
		
		
		
		
		
			
		
			
				
					
					
						
							55 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
	
	
							55 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');
 | 
						|
}
 | 
						|
 |