All files event-emitter-to-async-iterator.ts

87.18% Statements 34/39
60% Branches 6/10
83.33% Functions 10/12
86.11% Lines 31/36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 721x     1x   5x 5x 5x 5x   5x 3x 3x           5x 5x 5x     5x         5x 1x 1x 1x 1x 1x 1x       5x 6x 6x       5x 1x 1x       5x   5x   5x     1x   1x                        
import { $$asyncIterator } from 'iterall';
import { EventEmitter } from 'events';
 
export function eventEmitterAsyncIterator<T>(eventEmitter: EventEmitter,
                                             eventsNames: string | string[]): AsyncIterator<T> {
  const pullQueue = [];
  const pushQueue = [];
  const eventsArray = typeof eventsNames === 'string' ? [eventsNames] : eventsNames;
  let listening = true;
 
  const pushValue = event => {
    Eif (pullQueue.length !== 0) {
      pullQueue.shift()({ value: event, done: false });
    } else {
      pushQueue.push(event);
    }
  };
 
  const pullValue = () => {
    return new Promise(resolve => {
      Iif (pushQueue.length !== 0) {
        resolve({ value: pushQueue.shift(), done: false });
      } else {
        pullQueue.push(resolve);
      }
    });
  };
 
  const emptyQueue = () => {
    Eif (listening) {
      listening = false;
      removeEventListeners();
      pullQueue.forEach(resolve => resolve({ value: undefined, done: true }));
      pullQueue.length = 0;
      pushQueue.length = 0;
    }
  };
 
  const addEventListeners = () => {
    for (const eventName of eventsArray) {
      eventEmitter.addListener(eventName, pushValue);
    }
  };
 
  const removeEventListeners = () => {
    for (const eventName of eventsArray) {
      eventEmitter.removeListener(eventName, pushValue);
    }
  };
 
  addEventListeners();
 
  return {
    next() {
      return listening ? pullValue() : this.return();
    },
    return() {
      emptyQueue();
 
      return Promise.resolve({ value: undefined, done: true });
    },
    throw(error) {
      emptyQueue();
 
      return Promise.reject(error);
    },
    [$$asyncIterator]() {
      return this;
    },
  };
}