overleaf/services/web/public/coffee/utils/EventEmitter.coffee

42 lines
1.3 KiB
CoffeeScript

define [], () ->
# Simple event emitter implementation, but has a slightly unusual API for
# removing specific listeners. If a specific listener needs to be removed
# (instead of all listeners), then it needs to use a "namespace":
# Create a listener on the foo event with bar namespace: .on 'foo.bar'
# Trigger all events for the foo event (including namespaces): .trigger 'foo'
# Remove all listeners for the foo event (including namespaces): .off 'foo'
# Remove a listener for the foo event with the bar namespace: .off 'foo.bar'
class EventEmitter
on: (event, callback) ->
@events ||= {}
[event, namespace] = event.split(".")
@events[event] ||= []
@events[event].push {
callback: callback
namespace: namespace
}
off: (event) ->
@events ||= {}
if event?
[event, namespace] = event.split(".")
if !namespace?
# Clear all listeners for event
delete @events[event]
else
# Clear only namespaced listeners
remaining_events = []
for callback in @events[event] or []
if callback.namespace != namespace
remaining_events.push callback
@events[event] = remaining_events
else
# Remove all listeners
@events = {}
trigger: (event, args...) ->
@events ||= {}
for callback in @events[event] or []
callback.callback(args...)
emit: (args...) -> @trigger(args...)