Class: ActionCable::Server::Socket
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
| Inherits: | Object |
| Defined in: | actioncable/lib/action_cable/server/socket.rb, actioncable/lib/action_cable/server/socket/client_socket.rb, actioncable/lib/action_cable/server/socket/message_buffer.rb, actioncable/lib/action_cable/server/socket/stream.rb, actioncable/lib/action_cable/server/socket/web_socket.rb |
Overview
This class encapsulates all the low-level logic of working with the underlying WebSocket conenctions
and delegate all the business-logic to the user-level connection object (e.g., ApplicationCable::Connection).
This connection object is also responsible for handling encoding and decoding of messages, so the user-level
connection object shouldn't know about such details.
Class Method Summary
Instance Attribute Summary
- #config readonly
- #connection readonly
- #env readonly
- #event_loop readonly
- #logger readonly
- #protocol readonly
- #pubsub readonly
- #server readonly
- #message_buffer readonly private
- #websocket readonly private
- #worker_pool readonly private
Instance Method Summary
-
#close
Close the
WebSocketconnection. -
#perform_work(receiver, method, *args)
Invoke a method on the connection asynchronously through the pool of thread workers.
-
#request
The request that initiated the
WebSocketconnection is available here. - #send_async(method, *arguments)
-
#transmit(cable_message)
Send a non-serialized message over the
WebSocketconnection. - #decode(websocket_message) private
- #encode(cable_message) private
- #finished_request_message private
- #handle_close private
- #handle_open private
- #instance_variables_to_inspect private
- #invalid_request_message private
- #respond_to_invalid_request private
- #respond_to_successful_request private
- #started_request_message private
- #successful_request_message private
- #dispatch_websocket_message(websocket_message) Internal use only
- #on_close(reason, code) Internal use only
- #on_error(message) Internal use only
- #on_message(message) Internal use only
- #on_open Internal use only
-
#process
Internal use only
Called by the server when a new
WebSocketconnection is established. -
#receive(websocket_message)
Internal use only
Decodes WebSocket messages and dispatches them to subscribed channels.
Constructor Details
.new(server, env, coder: ActiveSupport::JSON) ⇒ Socket
# File 'actioncable/lib/action_cable/server/socket.rb', line 18
def initialize(server, env, coder: ActiveSupport::JSON) @server, @env, @coder = server, env, coder @worker_pool = server.worker_pool @logger = server.new_tagged_logger { request } @websocket = WebSocket.new(env, self, event_loop) @message_buffer = MessageBuffer.new(self) @protocol = nil @connection = config.connection_class.call.new(server, self) end
Instance Attribute Details
#config (readonly)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 16
delegate :event_loop, :pubsub, :config, to: :server
#connection (readonly)
[ GitHub ]#env (readonly)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 13
attr_reader :server, :env, :protocol, :logger, :connection
#event_loop (readonly)
[ GitHub ]#logger (readonly)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 13
attr_reader :server, :env, :protocol, :logger, :connection
#message_buffer (readonly, private)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 114
attr_reader :
#protocol (readonly)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 13
attr_reader :server, :env, :protocol, :logger, :connection
#pubsub (readonly)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 16
delegate :event_loop, :pubsub, :config, to: :server
#server (readonly)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 13
attr_reader :server, :env, :protocol, :logger, :connection
#websocket (readonly, private)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 113
attr_reader :websocket
#worker_pool (readonly, private)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 14
private attr_reader :worker_pool
Instance Method Details
#close
Close the Socket::WebSocket connection.
#decode(websocket_message) (private)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 120
def decode() @coder.decode end
#dispatch_websocket_message(websocket_message)
# File 'actioncable/lib/action_cable/server/socket.rb', line 79
def () # :nodoc: if websocket.alive? @connection.handle_incoming decode() else logger.error "Ignoring message processed after the WebSocket was closed: #{.inspect})" end rescue Exception => e logger.error "Could not handle incoming message: #{.inspect} [#{e.class} - #{e.}]: #{e.backtrace.first(5).join(" | ")}" end
#encode(cable_message) (private)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 116
def encode() @coder.encode end
#finished_request_message (private)
[ GitHub ]#handle_close (private)
[ GitHub ]#handle_open (private)
[ GitHub ]#instance_variables_to_inspect (private)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 109
def instance_variables_to_inspect [].freeze end
#invalid_request_message (private)
[ GitHub ]#on_close(reason, code)
# File 'actioncable/lib/action_cable/server/socket.rb', line 102
def on_close(reason, code) # :nodoc: send_async :handle_close end
#on_error(message)
# File 'actioncable/lib/action_cable/server/socket.rb', line 97
def on_error() # :nodoc: # log errors to make diagnosing socket errors easier logger.error "WebSocket error occurred: #{}" end
#on_message(message)
# File 'actioncable/lib/action_cable/server/socket.rb', line 93
def () # :nodoc: .append end
#on_open
# File 'actioncable/lib/action_cable/server/socket.rb', line 89
def on_open # :nodoc: send_async :handle_open end
#perform_work(receiver, method, *args)
Invoke a method on the connection asynchronously through the pool of thread workers.
# File 'actioncable/lib/action_cable/server/socket.rb', line 57
def perform_work(receiver, method, *args) worker_pool.async_invoke(receiver, method, *args, connection: self) end
#process
Called by the server when a new Socket::WebSocket connection is established.
# File 'actioncable/lib/action_cable/server/socket.rb', line 32
def process # :nodoc: logger.info if websocket.possible? && server.allow_request_origin?(env) respond_to_successful_request else respond_to_invalid_request end end
#receive(websocket_message)
Decodes WebSocket messages and dispatches them to subscribed channels.
Socket::WebSocket message transfer encoding is always JSON.
# File 'actioncable/lib/action_cable/server/socket.rb', line 75
def receive() # :nodoc: send_async :, end
#request
The request that initiated the Socket::WebSocket connection is available here. This gives access to the environment, cookies, etc.
# File 'actioncable/lib/action_cable/server/socket.rb', line 66
def request @request ||= begin environment = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application ActionDispatch::Request.new(environment || env) end end
#respond_to_invalid_request (private)
[ GitHub ]#respond_to_successful_request (private)
[ GitHub ]#send_async(method, *arguments)
[ GitHub ]# File 'actioncable/lib/action_cable/server/socket.rb', line 61
def send_async(method, *arguments) worker_pool.async_invoke(self, method, *arguments) end
#started_request_message (private)
[ GitHub ]#successful_request_message (private)
[ GitHub ]#transmit(cable_message)
Send a non-serialized message over the Socket::WebSocket connection.