sink.js 973 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. 'use strict';
  2. var Writable = require('readable-stream/writable');
  3. function listenerCount(stream, evt) {
  4. return stream.listeners(evt).length;
  5. }
  6. function hasListeners(stream) {
  7. return !!(listenerCount(stream, 'readable') || listenerCount(stream, 'data'));
  8. }
  9. function sink(stream) {
  10. var sinkAdded = false;
  11. var sinkStream = new Writable({
  12. objectMode: true,
  13. write: function(file, enc, cb) {
  14. cb();
  15. },
  16. });
  17. function addSink() {
  18. if (sinkAdded) {
  19. return;
  20. }
  21. if (hasListeners(stream)) {
  22. return;
  23. }
  24. sinkAdded = true;
  25. stream.pipe(sinkStream);
  26. }
  27. function removeSink(evt) {
  28. if (evt !== 'readable' && evt !== 'data') {
  29. return;
  30. }
  31. if (hasListeners(stream)) {
  32. sinkAdded = false;
  33. stream.unpipe(sinkStream);
  34. }
  35. }
  36. stream.on('newListener', removeSink);
  37. stream.on('removeListener', removeSink);
  38. stream.on('removeListener', addSink);
  39. return addSink;
  40. }
  41. module.exports = sink;