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.
		
		
		
		
			
				
					61 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					61 lines
				
				1.7 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var pump = require('pump')
							 | 
						||
| 
								 | 
							
								var inherits = require('inherits')
							 | 
						||
| 
								 | 
							
								var Duplexify = require('duplexify')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var toArray = function(args) {
							 | 
						||
| 
								 | 
							
								  if (!args.length) return []
							 | 
						||
| 
								 | 
							
								  return Array.isArray(args[0]) ? args[0] : Array.prototype.slice.call(args)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var define = function(opts) {
							 | 
						||
| 
								 | 
							
								  var Pumpify = function() {
							 | 
						||
| 
								 | 
							
								    var streams = toArray(arguments)
							 | 
						||
| 
								 | 
							
								    if (!(this instanceof Pumpify)) return new Pumpify(streams)
							 | 
						||
| 
								 | 
							
								    Duplexify.call(this, null, null, opts)
							 | 
						||
| 
								 | 
							
								    if (streams.length) this.setPipeline(streams)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  inherits(Pumpify, Duplexify)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Pumpify.prototype.setPipeline = function() {
							 | 
						||
| 
								 | 
							
								    var streams = toArray(arguments)
							 | 
						||
| 
								 | 
							
								    var self = this
							 | 
						||
| 
								 | 
							
								    var ended = false
							 | 
						||
| 
								 | 
							
								    var w = streams[0]
							 | 
						||
| 
								 | 
							
								    var r = streams[streams.length-1]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    r = r.readable ? r : null
							 | 
						||
| 
								 | 
							
								    w = w.writable ? w : null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var onclose = function() {
							 | 
						||
| 
								 | 
							
								      streams[0].emit('error', new Error('stream was destroyed'))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.on('close', onclose)
							 | 
						||
| 
								 | 
							
								    this.on('prefinish', function() {
							 | 
						||
| 
								 | 
							
								      if (!ended) self.cork()
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    pump(streams, function(err) {
							 | 
						||
| 
								 | 
							
								      self.removeListener('close', onclose)
							 | 
						||
| 
								 | 
							
								      if (err) return self.destroy(err.message === 'premature close' ? null : err)
							 | 
						||
| 
								 | 
							
								      ended = true
							 | 
						||
| 
								 | 
							
								      // pump ends after the last stream is not writable *but*
							 | 
						||
| 
								 | 
							
								      // pumpify still forwards the readable part so we need to catch errors
							 | 
						||
| 
								 | 
							
								      // still, so reenable autoDestroy in this case
							 | 
						||
| 
								 | 
							
								      if (self._autoDestroy === false) self._autoDestroy = true
							 | 
						||
| 
								 | 
							
								      self.uncork()
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.destroyed) return onclose()
							 | 
						||
| 
								 | 
							
								    this.setWritable(w)
							 | 
						||
| 
								 | 
							
								    this.setReadable(r)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Pumpify
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = define({autoDestroy:false, destroy:false})
							 | 
						||
| 
								 | 
							
								module.exports.obj = define({autoDestroy: false, destroy:false, objectMode:true, highWaterMark:16})
							 | 
						||
| 
								 | 
							
								module.exports.ctor = define
							 |