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.
		
		
		
		
		
			
		
			
				
					59 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					59 lines
				
				1.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								var Stream = require('stream');
							 | 
						||
| 
								 | 
							
								var Parse = require('./parse');
							 | 
						||
| 
								 | 
							
								var duplexer2 = require('duplexer2');
							 | 
						||
| 
								 | 
							
								var BufferStream = require('./BufferStream');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Backwards compatibility for node versions < 8
							 | 
						||
| 
								 | 
							
								if (!Stream.Writable || !Stream.Writable.prototype.destroy)
							 | 
						||
| 
								 | 
							
								  Stream = require('readable-stream');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function parseOne(match,opts) {
							 | 
						||
| 
								 | 
							
								  var inStream = Stream.PassThrough({objectMode:true});
							 | 
						||
| 
								 | 
							
								  var outStream = Stream.PassThrough();
							 | 
						||
| 
								 | 
							
								  var transform = Stream.Transform({objectMode:true});
							 | 
						||
| 
								 | 
							
								  var re = match instanceof RegExp ? match : (match && new RegExp(match));
							 | 
						||
| 
								 | 
							
								  var found;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  transform._transform = function(entry,e,cb) {
							 | 
						||
| 
								 | 
							
								    if (found || (re && !re.exec(entry.path))) {
							 | 
						||
| 
								 | 
							
								      entry.autodrain();
							 | 
						||
| 
								 | 
							
								      return cb();
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      found = true;
							 | 
						||
| 
								 | 
							
								      out.emit('entry',entry);
							 | 
						||
| 
								 | 
							
								      entry.on('error',function(e) {
							 | 
						||
| 
								 | 
							
								        outStream.emit('error',e);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      entry.pipe(outStream)
							 | 
						||
| 
								 | 
							
								        .on('error',function(err) {
							 | 
						||
| 
								 | 
							
								          cb(err);
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								        .on('finish',function(d) {
							 | 
						||
| 
								 | 
							
								          cb(null,d);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  inStream.pipe(Parse(opts))
							 | 
						||
| 
								 | 
							
								    .on('error',function(err) {
							 | 
						||
| 
								 | 
							
								      outStream.emit('error',err);
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								    .pipe(transform)
							 | 
						||
| 
								 | 
							
								    .on('error',Object)  // Silence error as its already addressed in transform
							 | 
						||
| 
								 | 
							
								    .on('finish',function() {
							 | 
						||
| 
								 | 
							
								      if (!found)
							 | 
						||
| 
								 | 
							
								        outStream.emit('error',new Error('PATTERN_NOT_FOUND'));
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        outStream.end();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var out = duplexer2(inStream,outStream);
							 | 
						||
| 
								 | 
							
								  out.buffer = function() {
							 | 
						||
| 
								 | 
							
								    return BufferStream(outStream);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return out;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = parseOne;
							 |