2017-07-27 3 views
1

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())

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