A suite to track Project Diva score statistics and ratings / D4DJ event data.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
projectdivar/server/node_modules/propagate/index.js

86 lines
1.8 KiB

4 years ago
'use strict'
function propagate(events, source, dest) {
if (arguments.length < 3) {
dest = source
source = events
events = undefined
}
// events should be an array or object
const eventsIsObject = typeof events === 'object'
if (events && !eventsIsObject) events = [events]
if (eventsIsObject) {
return explicitPropagate(events, source, dest)
}
const shouldPropagate = eventName =>
events === undefined || events.includes(eventName)
const oldEmit = source.emit
// Returns true if the event had listeners, false otherwise.
// https://nodejs.org/api/events.html#events_emitter_emit_eventname_args
source.emit = (eventName, ...args) => {
const oldEmitHadListeners = oldEmit.call(source, eventName, ...args)
let destEmitHadListeners = false
if (shouldPropagate(eventName)) {
destEmitHadListeners = dest.emit(eventName, ...args)
}
return oldEmitHadListeners || destEmitHadListeners
}
function end() {
source.emit = oldEmit
}
return {
end,
}
}
module.exports = propagate
function explicitPropagate(events, source, dest) {
let eventsIn
let eventsOut
if (Array.isArray(events)) {
eventsIn = events
eventsOut = events
} else {
eventsIn = Object.keys(events)
eventsOut = eventsIn.map(function(key) {
return events[key]
})
}
const listeners = eventsOut.map(function(event) {
return function() {
const args = Array.prototype.slice.call(arguments)
args.unshift(event)
dest.emit.apply(dest, args)
}
})
listeners.forEach(register)
return {
end,
}
function register(listener, i) {
source.on(eventsIn[i], listener)
}
function unregister(listener, i) {
source.removeListener(eventsIn[i], listener)
}
function end() {
listeners.forEach(unregister)
}
}