mirror of
https://github.com/faye/websocket-driver-ruby.git
synced 2025-11-01 13:59:38 +00:00
69 lines
1.4 KiB
Ruby
69 lines
1.4 KiB
Ruby
module WebSocket
|
|
class Driver
|
|
|
|
module EventEmitter
|
|
def initialize
|
|
@emit_exception = nil
|
|
@listeners = Hash.new { |h,k| h[k] = [] }
|
|
end
|
|
|
|
def add_listener(event, callable = nil, &block)
|
|
listener = callable || block
|
|
@listeners[event.to_s] << listener
|
|
listener
|
|
end
|
|
|
|
def on(event, callable = nil, &block)
|
|
if callable
|
|
add_listener(event, callable)
|
|
else
|
|
add_listener(event, &block)
|
|
end
|
|
end
|
|
|
|
def remove_listener(event, callable = nil, &block)
|
|
listener = callable || block
|
|
@listeners[event.to_s].delete(listener)
|
|
listener
|
|
end
|
|
|
|
def remove_all_listeners(event = nil)
|
|
if event
|
|
@listeners.delete(event.to_s)
|
|
else
|
|
@listeners.clear
|
|
end
|
|
end
|
|
|
|
def emit(event, *args)
|
|
@listeners[event.to_s].dup.each do |listener|
|
|
listener.call(*args)
|
|
end
|
|
|
|
rescue => error
|
|
@emit_exception ||= error
|
|
end
|
|
|
|
def listener_count(event)
|
|
return 0 unless @listeners.has_key?(event.to_s)
|
|
@listeners[event.to_s].size
|
|
end
|
|
|
|
def listeners(event)
|
|
@listeners[event.to_s]
|
|
end
|
|
|
|
private
|
|
|
|
def reraise_emit_exception
|
|
if @emit_exception
|
|
error = @emit_exception
|
|
@emit_exception = nil
|
|
raise error
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|