parseOne.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. var Stream = require('stream');
  2. var Parse = require('./parse');
  3. var duplexer2 = require('duplexer2');
  4. var BufferStream = require('./BufferStream');
  5. // Backwards compatibility for node versions < 8
  6. if (!Stream.Writable || !Stream.Writable.prototype.destroy)
  7. Stream = require('readable-stream');
  8. function parseOne(match,opts) {
  9. var inStream = Stream.PassThrough({objectMode:true});
  10. var outStream = Stream.PassThrough();
  11. var transform = Stream.Transform({objectMode:true});
  12. var re = match instanceof RegExp ? match : (match && new RegExp(match));
  13. var found;
  14. transform._transform = function(entry,e,cb) {
  15. if (found || (re && !re.exec(entry.path))) {
  16. entry.autodrain();
  17. return cb();
  18. } else {
  19. found = true;
  20. out.emit('entry',entry);
  21. entry.on('error',function(e) {
  22. outStream.emit('error',e);
  23. });
  24. entry.pipe(outStream)
  25. .on('error',function(err) {
  26. cb(err);
  27. })
  28. .on('finish',function(d) {
  29. cb(null,d);
  30. });
  31. }
  32. };
  33. inStream.pipe(Parse(opts))
  34. .on('error',function(err) {
  35. outStream.emit('error',err);
  36. })
  37. .pipe(transform)
  38. .on('error',Object) // Silence error as its already addressed in transform
  39. .on('finish',function() {
  40. if (!found)
  41. outStream.emit('error',new Error('PATTERN_NOT_FOUND'));
  42. else
  43. outStream.end();
  44. });
  45. var out = duplexer2(inStream,outStream);
  46. out.buffer = function() {
  47. return BufferStream(outStream);
  48. };
  49. return out;
  50. }
  51. module.exports = parseOne;