lib/adhearsion/events.rb in adhearsion-2.6.4 vs lib/adhearsion/events.rb in adhearsion-3.0.0.beta1

- old
+ new

@@ -1,96 +1,77 @@ # encoding: utf-8 require 'has_guarded_handlers' -require 'girl_friday' +require 'singleton' +require 'celluloid' module Adhearsion - class Events + module Events - include HasGuardedHandlers + class Handler + include HasGuardedHandlers + include Singleton - Message = Struct.new :type, :object + def call_handler(handler, guards, event) + super + throw :pass + end - class << self + alias :register_callback :register_handler + def method_missing(method_name, *args, &block) - instance.send method_name, *args, &block + register_handler method_name, *args, &block end def respond_to_missing?(method_name, include_private = false) - instance.respond_to? method_name, include_private + true end + end - def instance - @@instance || refresh! - end + class Worker + include Celluloid - def refresh! - @@instance = new + def work(type, object) + Handler.instance.trigger_handler type, object + rescue => e + raise if type == :exception + async.work :exception, e end end - refresh! + class << self + def method_missing(method_name, *args, &block) + Handler.instance.send method_name, *args, &block + end - def queue - queue? ? @queue : reinitialize_queue! - end + def respond_to_missing?(method_name, include_private = false) + Handler.instance.respond_to? method_name, include_private + end - def trigger(type, object = nil) - queue.push_async Message.new(type, object) - end + def trigger(type, object = nil) + queue.async.work type, object + end - def trigger_immediately(type, object = nil) - queue.push_immediately Message.new(type, object) - end + def trigger_immediately(type, object = nil) + queue.work type, object + end - def queue? - instance_variable_defined? :@queue - end + def draw(&block) + Handler.instance.instance_exec(&block) + end - def reinitialize_queue! - GirlFriday.shutdown! if queue? - # TODO: Extract number of threads to use from Adhearsion.config - @queue = GirlFriday::WorkQueue.new 'main_queue', :error_handler => ErrorHandler do |message| - work message + def queue + @queue || refresh! end - end - def work(message) - handle_message message - rescue => e - raise if message.type == :exception - trigger :exception, e - end + def init + @queue = Worker.pool(size: Adhearsion.config.core.event_threads) + end - def handle_message(message) - trigger_handler message.type, message.object - end - - def draw(&block) - instance_exec(&block) - end - - def method_missing(method_name, *args, &block) - register_handler method_name, *args, &block - end - - def respond_to_missing?(method_name, include_private = false) - instance_variable_defined?(:@handlers) && @handlers.has_key?(method_name) - end - - alias :register_callback :register_handler - - private - - def call_handler(handler, guards, event) - super - throw :pass - end - - class ErrorHandler - def handle(exception) - logger.error "Exception encountered in exception handler!" - logger.error exception + def refresh! + @queue = nil + Handler.instance.clear_handlers + init end end end end