class LiteCable::Connection::Base

A Connection object represents a client “connected” to the application. It contains all of the channel subscriptions. Incoming messages are then routed to these channel subscriptions based on an identifier sent by the consumer. The Connection itself does not deal with any specific application logic beyond authentication and authorization.

Here's a basic example:

module MyApplication
  class Connection < LiteCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    def disconnect
      # Any cleanup work needed when the cable connection is cut.
    end

    private
      def find_verified_user
        User.find_by_identity(cookies[:identity]) ||
          reject_unauthorized_connection
      end
  end
end

First, we declare that this connection can be identified by its current_user. This allows us to later be able to find all connections established for that current_user (and potentially disconnect them). You can declare as many identification indexes as you like. Declaring an identification means that an attr_accessor is automatically set for that key.

Second, we rely on the fact that the connection is established with the cookies from the domain being sent along. This makes it easy to use cookies that were set when logging in via a web interface to authorize the connection.

Attributes

coder[R]
socket[R]
streams[R]
subscriptions[R]

Public Class Methods

new(socket, coder: nil) click to toggle source
# File lib/lite_cable/connection/base.rb, line 46
def initialize(socket, coder: nil)
  @socket = socket
  @coder = coder || LiteCable.config.coder

  @subscriptions = Subscriptions.new(self)
  @streams = Streams.new(socket)
end

Public Instance Methods

close() click to toggle source
# File lib/lite_cable/connection/base.rb, line 85
def close
  socket.close
end
cookies() click to toggle source

Request cookies

# File lib/lite_cable/connection/base.rb, line 95
def cookies
  request.cookies
end
disconnected?() click to toggle source
# File lib/lite_cable/connection/base.rb, line 99
def disconnected?
  @_disconnected == true
end
handle_close() click to toggle source
# File lib/lite_cable/connection/base.rb, line 63
def handle_close
  disconnected!
  subscriptions.remove_all

  disconnect if respond_to?(:disconnect)
  log(:debug) { log_fmt("Closed") }
end
handle_command(websocket_message) click to toggle source
# File lib/lite_cable/connection/base.rb, line 71
def handle_command(websocket_message)
  command = decode(websocket_message)
  subscriptions.execute_command command
rescue Subscriptions::Error, Channel::Error, Channel::Registry::Error => e
  log(:error, log_fmt("Connection command failed: #{e}"))
  close
end
handle_open() click to toggle source
# File lib/lite_cable/connection/base.rb, line 54
def handle_open
  connect if respond_to?(:connect)
  send_welcome_message
  log(:debug) { log_fmt("Opened") }
rescue UnauthorizedError
  log(:debug) { log_fmt("Authorization failed") }
  close
end
request() click to toggle source

Rack::Request instance of underlying socket

# File lib/lite_cable/connection/base.rb, line 90
def request
  socket.request
end
transmit(cable_message) click to toggle source
# File lib/lite_cable/connection/base.rb, line 79
def transmit(cable_message)
  return if disconnected?

  socket.transmit encode(cable_message)
end

Private Instance Methods

decode(websocket_message) click to toggle source
# File lib/lite_cable/connection/base.rb, line 122
def decode(websocket_message)
  coder.decode websocket_message
end
disconnected!() click to toggle source
# File lib/lite_cable/connection/base.rb, line 107
def disconnected!
  @_disconnected = true
end
encode(cable_message) click to toggle source
# File lib/lite_cable/connection/base.rb, line 118
def encode(cable_message)
  coder.encode cable_message
end
log_fmt(msg) click to toggle source
# File lib/lite_cable/connection/base.rb, line 126
def log_fmt(msg)
  "[connection:#{identifier}] #{msg}"
end
send_welcome_message() click to toggle source
# File lib/lite_cable/connection/base.rb, line 111
def send_welcome_message
  # Send welcome message to the internal connection monitor channel.
  # This ensures the connection monitor state is reset after a successful
  # websocket connection.
  transmit type: LiteCable::INTERNAL[:message_types][:welcome]
end