Spec-Zone.ru › Ruby on Rails 5.1

класс 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.signed[:identity_id]) ||
          reject_unauthorized_connection
      end
  end
end

Во-первых, мы заявляем, что это подключение может быть идентифицировано по своему текущему пользователю. Это позволяет нам позже найти все подключения, установленные для этого текущего пользователя (и, возможно, отключить их). Вы можете объявить любое количество индексов идентификации. Объявление идентификации означает, что для этого ключа автоматически устанавливается attr_accessor.

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

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

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

Атрибуты

env[R]
logger[R]
message_buffer[R]
protocol[R]
server[R]
subscriptions[R]
websocket[R]

TODO Изменить это на private, как только мы откажемся от поддержки Ruby 2.2. Обходной путь для предупреждения Ruby 2.2 «private attribute?».

worker_pool[R]

Публичные методы класса

new(server, env, coder: ActiveSupport::JSON) Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 51
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 116
def beat
  transmit type: ActionCable::INTERNAL[:message_types][:ping], message: Time.now.to_i
end
close() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 96
def close
  websocket.close
end

Закрыть подключение WebSocket.

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

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

statistics() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 107
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 153
def cookies # :doc:
  request.cookie_jar
end

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

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

Spec-Zone.ru

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