Est-il possible de souscrire le socket à certains canaux Phoenix sur le backend et non au client? Disons que j'ai des groupes auxquels appartient l'utilisateur, et je veux que l'utilisateur s'y connecte une fois que la connexion WS est établie. Envoyer des identifiants de groupes à l'utilisateur et joindre des canaux semble être un tour inutile, surtout que je voudrais gérer les messages dans ces groupes dans un rappel, donc j'utiliserais onMessage
sur Socket et ferais correspondre par le masque. Comment ferais-je cela?Abonnez-vous à Phoenix Channel sur le backend (pas channel.join())
1
A
Répondre
0
Je ne sais pas si cela est une bonne solution, probablement il utilise des API internes qui ne sont pas privés si:
defmodule Front.UserChannel do
use Front.Web, :channel
def join("user:" <> user_id, _payload, socket) do
if Integer.to_string(socket.assigns[:user_id]) == user_id do
send(self(), :after_join)
{:ok, socket}
else
{:error, %{reason: "unauthorized"}}
end
end
def handle_info(:after_join, socket) do
Groups.associated_with(socket.assigns[:user_id])
|> Enum.each(fn group_id ->
%Phoenix.Socket{socket | topic: "group:#{group_id}", channel: Front.GroupChannel}
|> Phoenix.Channel.Server.join(%{})
end)
{:noreply, socket}
end
end