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
			| 
								 
											3 years ago
										 
									 | 
							
								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');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |