lib/rack/websocket/application.rb
module Rack
module WebSocket
class Application
DEFAULT_OPTIONS = {}
class << self
attr_accessor :websocket_handler
end
# Standard WebSocket calls
def on_open(env); end
def on_message(env, msg); end
def on_close(env); end
def on_error(env, error); end
# Initializer
def initialize(options = {})
@options = DEFAULT_OPTIONS.merge(options)
end
# Detect handler and duplicate it's instance
def call(env)
detect_handler(env)
dup._call(env)
end
# Forward call to duplicated handler
def _call(env)
websocket_handler.call(env)
end
# Forward all missing methods to handler
def method_missing(sym, *args, &block)
if websocket_handler && websocket_handler.respond_to?(sym)
websocket_handler.send sym, *args, &block
else
super
end
end
private
# Detect handler
def detect_handler(env)
self.class.websocket_handler ||= Handler.detect(env)
end
# Create and cache handler for current server
def websocket_handler
@websocket_handler ||= self.class.websocket_handler.new(self, @options || {})
end
end
end
end