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
			| 
											2 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'); | ||
|  | } | ||
|  | 
 |