class Rubevent::EventLoop

Attributes

config[RW]
metrics[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/rubevent/event_loop.rb, line 11
def initialize(opts = {})
  @active = false
  @events = []
  @listeners = {}
  @metrics = Metrics.new

  configure opts

  @loop = Thread.new do
    loop do
      if @events.empty? || @halted
        Thread.stop
      else
        run
      end
    end
  end
end

Public Instance Methods

listen(event_type) click to toggle source
# File lib/rubevent/event_loop.rb, line 37
def listen event_type
  check_max_listeners
  listener = Proc.new # wrap the passed block in a proc
  listeners_for(event_type).push listener
  @metrics.registered event_type
end
publish(event, details = {}) click to toggle source
# File lib/rubevent/event_loop.rb, line 30
def publish(event, details = {})
  check_max_queue_size
  @events.push [event, details] # array simulates pair
  @metrics.received event
  start unless @halted
end
run() click to toggle source
# File lib/rubevent/event_loop.rb, line 54
def run
  return if @events.empty? || @halted
  event_type, details = @events.shift
  @metrics.mark_processed event_type
  listeners_for(event_type).each { |listener| listener.call details }
end
start() click to toggle source
# File lib/rubevent/event_loop.rb, line 44
def start
  @halted = false
  @loop.wakeup
  self
end
stop() click to toggle source
# File lib/rubevent/event_loop.rb, line 50
def stop
  @halted = true
end

Private Instance Methods

check_max_listeners() click to toggle source
# File lib/rubevent/event_loop.rb, line 74
def check_max_listeners
  max_listeners = @config[:max_listeners]
  error = max_listeners && @listeners.values.flatten.size >= max_listeners
  raise EventLoopError if error
end
check_max_queue_size() click to toggle source
# File lib/rubevent/event_loop.rb, line 68
def check_max_queue_size
  max_queue_size = @config[:max_queue_size]
  error = max_queue_size && @events.size >= max_queue_size
  raise EventLoopError if error
end
configure(opts) click to toggle source
# File lib/rubevent/event_loop.rb, line 80
def configure opts
  @config = {
    :max_queue_size => opts["max-queue-size".intern],
    :max_listeners => opts["max-listeners".intern]
  }
end
listeners_for(event_type) click to toggle source
# File lib/rubevent/event_loop.rb, line 62
def listeners_for event_type
  # ensure that the listeners for an event type is an array data structure
  @listeners[event_type] = [] unless @listeners[event_type].is_a? Array
  @listeners[event_type]
end