parseOne.js 1.4 KB

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