Я использую подтемы как однопользовательский канал, который другие могут использовать для отправки сообщений определенным людям.
Например: - Я пользователь 1, и я хочу отправить сообщение пользователю 2. - Я отправляю сообщение с полезной нагрузкой { to: 2, message: 'hi' }
, а handle_in
делает App.Endpoint.broadcast("user:2", "hi")
Вот фрагмент из моего user_channel.ex
:
def handle_in("chat", incoming_payload, socket) do
from_uid = socket.assigns.uid
uid = incoming_payload["to"]
message = incoming_payload["message"]
topic = "user:#{uid}"
payload = %{uid: from_uid, message: message}
# Send to the topic based of the incoming_payload's
# 'to' param.
App.Endpoint.broadcast(topic, "chat", payload)
{:reply, :ok, socket}
end
Для всех, кому интересно: код с открытым исходным кодом
https://github.com/NullVoxPopuli/mesh-relay-phoenix/tree/feature/presence-tracking