Class: Rockbox::EventEmitter

Inherits:
Object
  • Object
show all
Defined in:
lib/rockbox/events.rb

Overview

Lightweight typed event emitter. The set of valid events is documented below; emitting an unknown event still works (no enforcement) so plugins can publish their own.

Built-in events:

| Event | Payload | |——————–|————————————–| | :track_changed | Rockbox::Track | | :status_changed | Integer (Rockbox::PlaybackStatus) | | :playlist_changed | Rockbox::Playlist | | :ws_open | nil | | :ws_close | nil | | :ws_error | Exception/StandardError |

Instance Method Summary collapse

Constructor Details

#initializeEventEmitter

Returns a new instance of EventEmitter.



19
20
21
22
# File 'lib/rockbox/events.rb', line 19

def initialize
  @listeners = Hash.new { |h, k| h[k] = [] }
  @lock = Mutex.new
end

Instance Method Details

#emit(event, payload = nil) ⇒ Object



56
57
58
59
60
61
62
63
64
65
# File 'lib/rockbox/events.rb', line 56

def emit(event, payload = nil)
  listeners = @lock.synchronize { @listeners[event.to_sym].dup }
  listeners.each do |listener|
    if listener.arity.zero? || payload.nil?
      listener.call
    else
      listener.call(payload)
    end
  end
end

#off(event, listener = nil, &block) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rockbox/events.rb', line 44

def off(event, listener = nil, &block)
  target = block || listener
  @lock.synchronize do
    if target.nil?
      @listeners.delete(event.to_sym)
    else
      @listeners[event.to_sym].delete(target)
    end
  end
  self
end

#on(event, &block) ⇒ Object

Examples:

client.on(:track_changed) { |track| puts track.title }

Raises:

  • (ArgumentError)


26
27
28
29
30
# File 'lib/rockbox/events.rb', line 26

def on(event, &block)
  raise ArgumentError, "block required" unless block
  @lock.synchronize { @listeners[event.to_sym] << block }
  self
end

#once(event, &block) ⇒ Object

Examples:

client.once(:ws_open) { puts "connected!" }

Raises:

  • (ArgumentError)


34
35
36
37
38
39
40
41
42
# File 'lib/rockbox/events.rb', line 34

def once(event, &block)
  raise ArgumentError, "block required" unless block
  wrapper = nil
  wrapper = lambda do |*args|
    off(event, wrapper)
    block.call(*args)
  end
  on(event, &wrapper)
end

#remove_all_listeners(event = nil) ⇒ Object



67
68
69
70
71
72
73
74
75
76
# File 'lib/rockbox/events.rb', line 67

def remove_all_listeners(event = nil)
  @lock.synchronize do
    if event
      @listeners.delete(event.to_sym)
    else
      @listeners.clear
    end
  end
  self
end