websocket 在后端订阅Phoenix Channel(不是channel.join())

wpcxdonn  于 2022-11-24  发布在  Phoenix
关注(0)|答案(2)|浏览(119)

有没有可能在后端而不是客户端订阅一些Phoenix通道的套接字?假设我有一些用户所属的组,我希望用户在建立WS连接后连接到这些组。将组的ID发送给用户并加入通道似乎是一个不必要的往返过程,特别是我希望在一个回调中处理该组中的消息。所以我会在Socket上使用onMessage并按掩码进行匹配。

cotxawn7

cotxawn71#

不确定这是否是一个好的解决方案,可能它使用了一些非私有的内部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
pu3pd22g

pu3pd22g2#

也许这个能帮上忙

{ok, Socket} = gen_tcp:connect(host/addr, port,[binary/list, {packet, 2}])

相关问题