Sha256: a3693506c923bd7df31633d50c3c851d10a3eacf625206f2e79da0d1062bba91

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

require "drunkmonkey/version"
require "celluloid"
require "rack"
require "celluloid/autostart"
require "forwardable"
require "json"
require "drunkmonkey/transport"

module DrunkMonkey  
  class Controller
    include Celluloid
    def initialize name = :default_controller
      @handlers = Hash.new
      Actor[name] = Actor.current
    end

    def on event, &block
      @handlers[event] ||= block
    end
    
    execute_block_on_receiver :on

    def fire event, transport, message = nil
      handler = @handlers[event]
      handler.call transport, message if handler
    end
  end
  
  class Builder < ::Rack::Builder
    extend Forwardable
    
    DEFAULT_OPTIONS = {
      path: "/drunkmonkey",
      controller_name: :default_controller
    }.freeze
    
    def_delegator :controller, :on
    
    def controller
      self.class.controller
    end
    
    def controller= instance
      self.class.controller=instance
    end
    
    class << self
      attr_accessor :controller
    end
    
    def initialize default_app = nil, **options , &block
      options = DEFAULT_OPTIONS.merge(options)
      self.controller ||= Controller.new(options[:controller_name])
      
      super(default_app, &block)
      
      map options[:path] do
        run -> env do
          Transport.connection_from env, options
        end
      end  
    end
  end
  
  def self.middleware
    Class.new do
      class << self
        attr_accessor :builder
      end

      def initialize app, **options, &block
        if self.class.builder
          self.class.builder.run app
        else
          self.class.builder = Builder.new app, **options, &block
        end
      end
      
      def call env
        self.class.builder.call env
      end
    end
  end
  
  Middleware = self.middleware
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
drunkmonkey-0.0.1 lib/drunkmonkey.rb