Spec-Zone.ru › Ruby on Rails 5.0

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

Родитель:
Object
Включенные модули:
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

    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.

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

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

Атрибуты

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

Открытые методы класса

new(server, env, coder: ActiveSupport::JSON) Показать исходный код
# 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

Открытые методы экземпляра

beat() Показать исходный код
# 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
close() Показать исходный код
# File actioncable/lib/action_cable/connection/base.rb, line 99
def close
  websocket.close
end

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

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

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

statistics() Показать исходный код
# 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`. Это может быть возвращено проверкой работоспособности соединения.

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

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

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

request() Показать исходный код
# 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.

Spec-Zone.ru

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