2017-07-27 54 views
1

是否有可能將套接字訂閱到後端的某些Phoenix頻道而不是客戶端?假設我有一些用戶屬於的組,並且我希望用戶在建立WS連接後連接到它們。向用戶發送組ID並加入頻道似乎是不必要的往返,特別是我想在一個回調中處理該組中的消息,所以我會在Socket上使用onMessage,並使用掩碼進行匹配。我會怎麼做?在後臺訂閱鳳凰頻道(不是channel.join())

回答

0

不知道這是一個很好的解決方案,可能是它使用了雖然不是私有的一些內部API:

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