класс ActionCable::Connection::Base
Подключение Action Cable 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
private
def find_verified_user
User.find_by_identity(cookies.encrypted[:identity_id]) ||
reject_unauthorized_connection
end
end
end
Во-первых, мы объявляем, что это подключение можно идентифицировать по текущему пользователю. Это позволяет нам впоследствии найти все подключения, установленные для этого текущего пользователя (и потенциально отключить их). Вы можете объявить любое количество индексов идентификации. Объявление идентификации означает, что для этого ключа автоматически устанавливается attr_accessor.
Во-вторых, мы полагаемся на то, что подключение WebSocket устанавливается с кукисами домена, отправляемыми вместе. Это упрощает использование подписанных кукисов, которые были установлены при входе в систему через веб-интерфейс, для авторизации WebSocket-соединения.
Наконец, мы добавляем тег в подключённый логгер с именем текущего пользователя, чтобы легко различать их сообщения в логе.
Достаточно просто, не так ли?
Атрибуты
Публичные методы класса
# File actioncable/lib/action_cable/connection/base.rb, line 67 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) @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 147 def beat transmit type: ActionCable::INTERNAL[:message_types][:ping], message: Time.now.to_i end
# File actioncable/lib/action_cable/connection/base.rb, line 120
def close(reason: nil, reconnect: true)
transmit(
type: ActionCable::INTERNAL[:message_types][:disconnect],
reason: reason,
reconnect: reconnect
)
websocket.close
end Закрыть WebSocket-соединение.
# File actioncable/lib/action_cable/connection/base.rb, line 109
def handle_channel_command(payload)
run_callbacks :command do
subscriptions.execute_command payload
end
end # File actioncable/lib/action_cable/connection/base.rb, line 131 def send_async(method, *arguments) worker_pool.async_invoke(self, method, *arguments) end
Вызвать метод подключения асинхронно через пул потоковых рабочих процессов.
# File actioncable/lib/action_cable/connection/base.rb, line 138
def statistics
{
identifier: connection_identifier,
started_at: @started_at,
subscriptions: subscriptions.identifiers,
request_id: @env["action_dispatch.request_id"]
}
end Возвращает базовый хеш статистики для подключения с ключами identifier, started_at, subscriptions, и request_id. Это может быть возвращено в результате проверки работоспособности подключения.
Приватные методы экземпляра
# File actioncable/lib/action_cable/connection/base.rb, line 187 def cookies # :doc: request.cookie_jar end
Кукисы запроса, инициировавшего подключение WebSocket. Полезны для проведения проверок авторизации.
# File actioncable/lib/action_cable/connection/base.rb, line 178
def request # :doc:
@request ||= begin
environment = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application
ActionDispatch::Request.new(environment || env)
end
end Здесь доступен запрос, инициировавший WebSocket-соединение. Это предоставляет доступ к среде, кукисам и т.д.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.