Spec-Zone.ru › Ruby on Rails 6.0

класс ActionCable::Connection::Base

Родитель:
Объект
Включенные модули:
ActionCable::Connection::Identification, ActionCable::Connection::InternalChannel, ActionCable::Connection::Authorization

Для каждого подключенного 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-соединения.

Наконец, мы добавляем тег в специфический для соединения логгер с именем текущего пользователя, чтобы легко отличить их сообщения в логе.

Довольно просто, не правда ли?

Атрибуты

env[R]
logger[R]
protocol[R]
server[R]
subscriptions[R]
worker_pool[R]

Общедоступные методы класса

new(server, env, coder: ActiveSupport::JSON) Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 53
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

Общедоступные методы экземпляра

beat() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 123
def beat
  transmit type: ActionCable::INTERNAL[:message_types][:ping], message: Time.now.to_i
end
close(reason: nil, reconnect: true) Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 98
def close(reason: nil, reconnect: true)
  transmit(
    type: ActionCable::INTERNAL[:message_types][:disconnect],
    reason: reason,
    reconnect: reconnect
  )
  websocket.close
end

Закрыть WebSocket-соединение.

send_async(method, *arguments) Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 108
def send_async(method, *arguments)
  worker_pool.async_invoke(self, method, *arguments)
end

Вызвать метод подключения асинхронно через пул потоковых рабочих процессов.

statistics() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 114
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. Это может быть возвращено контролем состояния соединения.

Приватные методы экземпляра

cookies() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 157
def cookies # :doc:
  request.cookie_jar
end

Кукисы запроса, который инициировал WebSocket-соединение. Полезны для проверки авторизации.

request() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 149
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–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API