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.
		
		
		
		
		
			
		
			
				
					71 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					71 lines
				
				1.7 KiB
			| 
											2 years ago
										 | module.exports = collect | ||
|  | 
 | ||
|  | function collect (stream) { | ||
|  |   if (stream._collected) return | ||
|  | 
 | ||
|  |   if (stream._paused) return stream.on('resume', collect.bind(null, stream)) | ||
|  | 
 | ||
|  |   stream._collected = true | ||
|  |   stream.pause() | ||
|  | 
 | ||
|  |   stream.on('data', save) | ||
|  |   stream.on('end', save) | ||
|  |   var buf = [] | ||
|  |   function save (b) { | ||
|  |     if (typeof b === 'string') b = new Buffer(b) | ||
|  |     if (Buffer.isBuffer(b) && !b.length) return | ||
|  |     buf.push(b) | ||
|  |   } | ||
|  | 
 | ||
|  |   stream.on('entry', saveEntry) | ||
|  |   var entryBuffer = [] | ||
|  |   function saveEntry (e) { | ||
|  |     collect(e) | ||
|  |     entryBuffer.push(e) | ||
|  |   } | ||
|  | 
 | ||
|  |   stream.on('proxy', proxyPause) | ||
|  |   function proxyPause (p) { | ||
|  |     p.pause() | ||
|  |   } | ||
|  | 
 | ||
|  |   // replace the pipe method with a new version that will
 | ||
|  |   // unlock the buffered stuff.  if you just call .pipe()
 | ||
|  |   // without a destination, then it'll re-play the events.
 | ||
|  |   stream.pipe = (function (orig) { | ||
|  |     return function (dest) { | ||
|  |       // console.error(' === open the pipes', dest && dest.path)
 | ||
|  | 
 | ||
|  |       // let the entries flow through one at a time.
 | ||
|  |       // Once they're all done, then we can resume completely.
 | ||
|  |       var e = 0 | ||
|  |       ;(function unblockEntry () { | ||
|  |         var entry = entryBuffer[e++] | ||
|  |         // console.error(" ==== unblock entry", entry && entry.path)
 | ||
|  |         if (!entry) return resume() | ||
|  |         entry.on('end', unblockEntry) | ||
|  |         if (dest) dest.add(entry) | ||
|  |         else stream.emit('entry', entry) | ||
|  |       })() | ||
|  | 
 | ||
|  |       function resume () { | ||
|  |         stream.removeListener('entry', saveEntry) | ||
|  |         stream.removeListener('data', save) | ||
|  |         stream.removeListener('end', save) | ||
|  | 
 | ||
|  |         stream.pipe = orig | ||
|  |         if (dest) stream.pipe(dest) | ||
|  | 
 | ||
|  |         buf.forEach(function (b) { | ||
|  |           if (b) stream.emit('data', b) | ||
|  |           else stream.emit('end') | ||
|  |         }) | ||
|  | 
 | ||
|  |         stream.resume() | ||
|  |       } | ||
|  | 
 | ||
|  |       return dest | ||
|  |     } | ||
|  |   })(stream.pipe) | ||
|  | } |