martinheidegger/has-listener

View on GitHub
index.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
'use strict'

function createCounter (targetEvents, count, handler) {
  handler(count > 0)
  return {
    up (event) {
      if (!targetEvents.has(event)) return
      count += 1
      if (count === 1) {
        handler(true)
      }
    },
    down (event) {
      if (!targetEvents.has(event)) return
      count -= 1
      if (count === 0) {
        handler(false)
      }
    }
  }
}

function countListeners (target, targetEvents) {
  let count = 0
  for (const targetEvent of targetEvents) {
    count += target.listenerCount(targetEvent)
  }
  return count
}

exports.hasListener = function hasListener (target, targetEvents, handler) {
  if (!(targetEvents instanceof Set)) {
    if (!Array.isArray(targetEvents)) {
      targetEvents = [targetEvents]
    }
    targetEvents = new Set(targetEvents)
  }
  let counter = createCounter(targetEvents, countListeners(target, targetEvents), handler)
  target.on('newListener', counter.up)
  target.on('removeListener', counter.down)

  return function stopLookingForListener () {
    target.removeListener('newListener', counter.up)
    target.removeListener('removeListener', counter.down)
  }
}