Моя путаница заключается в том, что, если соединение между сервером и клиентом предположительно поддерживается сокетом, пока оно не будет разорвано, не должен ли клиент иметь доступ к тому, что находится в этом соединении?
assigns
- это просто ключ в структуре:
defmodule Phoenix.Socket
...
...
defstruct assigns: %{},
channel: nil,
channel_pid: nil,
endpoint: nil,
handler: nil,
id: nil,
joined: false,
join_ref: nil,
private: %{},
pubsub_server: nil,
ref: nil,
serializer: nil,
topic: nil,
transport: nil,
transport_pid: nil
https://github.com/phoenixframework/phoenix/blob/v1.4.0/lib/phoenix/socket.ex#L181
Эта структура НЕ находится в соединении.Скорее структура представляет собой блокнот, который сервер использует для хранения соответствующей информации о конкретном соединении.В соответствии с документами Channels :
Чтобы начать общение, клиент подключается к узлу (серверу Phoenix), используя транспорт (например, веб-сокеты или длинный опрос), и присоединяется к одному из них.или более каналов, использующих это единственное сетевое соединение.Один серверный процесс канала создается для каждого клиента в каждой теме. Соответствующий обработчик сокетов инициализирует% Phoenix.Socket для канального сервера (возможно, после аутентификации клиента).Канальный сервер затем удерживает% Phoenix.Socket {} и может поддерживать любое состояние, которое ему необходимо в пределах его socket.assigns.
Как только соединение установлено, каждое входящее сообщение от клиента маршрутизируется на основе еготема, на правильный сервер канала.Если сервер канала запрашивает широковещательную рассылку, это сообщение отправляется в локальный PubSub, который отправляет его всем клиентам, подключенным к тому же серверу и подписанным на эту тему.
-
Похоже, что сервер должен явно передавать клиенту все присвоенные ему данные, если он хочет?
Да.
Вы можете проверить, каксервер может использовать назначения в этом ElixirCasts.io видео (начиная с 4:15).