класс ActionCable::Connection::Base
Для каждого WebSocket, принятого сервером Action Cable, будет создан объект Connection. Этот экземпляр становится родителем всех подписок на каналы, созданных после этого. Входящие сообщения затем маршрутизируются к этим подпискам на каналы на основе идентификатора, отправленного потребителем Action Cable. Сам объект Connection не обрабатывает никакую специфическую логику приложения, за исключением аутентификации и авторизации.
Вот пример:
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
self.current_user = find_verified_user
logger.add_tags current_user.name
end
def disconnect
# Any cleanup work needed when the cable connection is cut.
end
protected
def find_verified_user
if current_user = User.find_by_identity cookies.signed[:identity_id]
current_user
else
reject_unauthorized_connection
end
end
end
end Во-первых, мы объявляем, что эту соединение можно идентифицировать по текущему пользователю. Это позволяет нам впоследствии найти все соединения, установленные для этого текущего пользователя (и потенциально отключить их). Вы можете объявлять столько индексов идентификации, сколько нужно. Объявление идентификации означает, что для этого ключа автоматически устанавливается attr_accessor.
Во-вторых, мы полагаемся на то, что соединение WebSocket устанавливается с кукисами домена, которые отправляются вместе. Это упрощает использование подписанных кукисов, установленных при входе в систему через веб-интерфейс, для авторизации подключения WebSocket.
Наконец, мы добавляем тег в логгер, специфичный для соединения, с именем текущего пользователя, чтобы легко различать их сообщения в логе.
Довольно просто, да?
Атрибуты
Открытые методы класса
# File actioncable/lib/action_cable/connection/base.rb, line 54 def initialize(server, env, coder: ActiveSupport::JSON) @server, @env, @coder = server, env, coder @worker_pool = server.worker_pool @logger = new_tagged_logger @websocket = ActionCable::Connection::WebSocket.new(env, self, event_loop, server.config.client_socket_class) @subscriptions = ActionCable::Connection::Subscriptions.new(self) @message_buffer = ActionCable::Connection::MessageBuffer.new(self) @_internal_subscriptions = nil @started_at = Time.now end
Открытые методы экземпляра
# File actioncable/lib/action_cable/connection/base.rb, line 119 def beat transmit type: ActionCable::INTERNAL[:message_types][:ping], message: Time.now.to_i end
# File actioncable/lib/action_cable/connection/base.rb, line 99 def close websocket.close end
Закрыть соединение WebSocket.
# File actioncable/lib/action_cable/connection/base.rb, line 104 def send_async(method, *arguments) worker_pool.async_invoke(self, method, *arguments) end
Вызвать метод соединения асинхронно через пул потоковых рабочих процессов.
# File actioncable/lib/action_cable/connection/base.rb, line 110
def statistics
{
identifier: connection_identifier,
started_at: @started_at,
subscriptions: subscriptions.identifiers,
request_id: @env['action_dispatch.request_id']
}
end Возвращает базовый хеш статистики для соединения с ключами `identifier`, `started_at` и `subscriptions`. Это может быть возвращено проверкой работоспособности соединения.
Защищенные методы экземпляра
# File actioncable/lib/action_cable/connection/base.rb, line 149 def cookies request.cookie_jar end
Куки запроса, который инициировал соединение WebSocket. Полезно для выполнения проверок авторизации.
# File actioncable/lib/action_cable/connection/base.rb, line 141
def request
@request ||= begin
environment = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application
ActionDispatch::Request.new(environment || env)
end
end Здесь доступен запрос, который инициировал соединение WebSocket. Это предоставляет доступ к среде, кукисам и т.д.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.