class WebsocketRails::ConnectionAdapters::Base

Attributes

data_store[R]
dispatcher[R]
env[R]
id[RW]

The ConnectionManager will set the connection ID when the connection is opened.

pong[RW]
queue[R]
request[R]

Public Class Methods

accepts?(env) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 21
def self.accepts?(env)
  false
end
inherited(adapter) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 25
def self.inherited(adapter)
  ConnectionAdapters.register adapter
end
new(request, dispatcher) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 35
def initialize(request, dispatcher)
  @env        = request.env.dup
  @request    = request
  @dispatcher = dispatcher
  @connected  = true
  @queue      = EventQueue.new
  @data_store = DataStore::Connection.new(self)
  @delegate   = WebsocketRails::DelegationController.new
  @delegate.instance_variable_set(:@_env, request.env)
  @delegate.instance_variable_set(:@_request, request)

  start_ping_timer
end

Public Instance Methods

connected?() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 108
def connected?
  true & @connected
end
controller_delegate() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 104
def controller_delegate
  @delegate
end
enqueue(event) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 72
def enqueue(event)
  @queue << event
end
flush() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 80
def flush
  message = []
  @queue.flush do |event|
    message << event.as_json
  end
  send message.to_json
end
inspect() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 112
def inspect
  "#<Connection::#{id}>"
end
on_close(data=nil) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 60
def on_close(data=nil)
  @ping_timer.try(:cancel)
  dispatch Event.new_on_close( self, data )
  close_connection
end
on_error(data=nil) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 66
def on_error(data=nil)
  event = Event.new_on_error( self, data )
  dispatch event
  on_close event.data
end
on_message(encoded_data) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 55
def on_message(encoded_data)
  event = Event.new_from_json( encoded_data, self )
  dispatch event
end
on_open(data=nil) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 49
def on_open(data=nil)
  event = Event.new_on_open( self, data )
  dispatch event
  trigger event
end
ping_interval() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 139
def ping_interval
  @ping_interval ||= WebsocketRails.config.default_ping_interval
end
ping_interval=(interval) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 143
def ping_interval=(interval)
  @ping_interval = interval.to_i
  @ping_timer.try(:cancel)
  start_ping_timer
end
rack_response() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 100
def rack_response
  [ -1, {}, [] ]
end
send(message) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 96
def send(message)
  raise NotImplementedError, "Override this method in the connection specific adapter class"
end
send_message(event_name, data = {}, options = {}) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 88
def send_message(event_name, data = {}, options = {})
  options.merge! :user_id => user_identifier, :connection => self
  options[:data] = data

  event = Event.new(event_name, options)
  event.trigger
end
to_s() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 116
def to_s
  inspect
end
trigger(event) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 76
def trigger(event)
  send "[#{event.serialize}]"
end
user() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 124
def user
  return unless user_connection?
  controller_delegate.current_user
end
user_connection?() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 120
def user_connection?
  not user_identifier.nil?
end
user_identifier() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 129
def user_identifier
  @user_identifier ||= begin
    identifier = WebsocketRails.config.user_identifier

    return unless current_user_responds_to?(identifier)

    controller_delegate.current_user.send(identifier)
   end
end

Private Instance Methods

close_connection() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 159
def close_connection
  @data_store.destroy!
  @ping_timer.try(:cancel)
  dispatcher.connection_manager.close_connection self
end
connection_manager() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 155
def connection_manager
  dispatcher.connection_manager
end
current_user_responds_to?(identifier) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 165
def current_user_responds_to?(identifier)
  controller_delegate                            &&
  controller_delegate.respond_to?(:current_user) &&
  controller_delegate.current_user               &&
  controller_delegate.current_user.respond_to?(identifier)
end
dispatch(event) click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 151
def dispatch(event)
  dispatcher.dispatch event
end
start_ping_timer() click to toggle source
# File lib/websocket_rails/connection_adapters.rb, line 175
def start_ping_timer
  @pong = true

  # Set negative interval to nil to deactivate periodic pings
  if ping_interval > 0
    @ping_timer = EM::PeriodicTimer.new(ping_interval) do
      if pong == true
        self.pong = false
        ping = Event.new_on_ping self
        trigger ping
      else
        @ping_timer.cancel
        on_error
      end
    end
  end
end