0

我正在使用带有 Phoenix Channels 的 websocket 传输,但我正在尝试为没有Phoenix.Socket客户端的消费者提供一个干净的 API,以便仅使用 websockets。

为简单起见,我想在用户打开会话时自动订阅各种频道。

目前我有类似的东西:

defmodule MyWeb.UserSocket do
  require Logger
  use Phoenix.Socket
  alias Exchange.{Account, ApiKey}

  channel "room:time", MyWeb.TimeChannel
  channel "alpha:*", MyWeb.AlphaChannel
  channel "beta:*", MyWeb.BetaChannel

  def connect(%{"api-key" => _} = params, socket, connect_info) do
    with %{"api-key" => api_key, "api-expires" => api_expires, "api-signature" => api_signature} <-
           params,
         {:ok, %ApiKey{} = key} <- ApiKey.fetch(api_key),
         {:ok, %Account{} = account} <-ApiKey.authorize(...)) do
      Logger.info("Authorized account #{account.account_id} via API key on websocket")

      #JOIN CHANNELS HERE

      {:ok, assign(socket, :account, account)}
    else
      {:error, e} ->
        Logger.error("Websocket auth error #{inspect(e)}")
        {:ok, socket}
    end
  end

end

我需要在“加入频道”中输入什么内容才能订阅?

4

2 回答 2

0

这个问题的答案是不要在界面上使用Phoenix Channels,而是编写一个单独的Transport实现订阅Phoenix。

我通过定义一个新模块创建了一个新的套接字传输:

@behaviour Phoenix.Socket.Transport

并提供了一个袜子endpoint.ex

socket "/realtime", MyWeb.MyCustomSocket, websocket: true

此模式遵循GenServer类型布局。我订阅了我想要的 Phoenix 频道init,然后将这些事件重新发送到套接字。

这创建了一个单向 websocket,不需要任何Socket连接和侦听知识。

于 2020-11-23T15:45:50.567 回答
0

这可能太简单了,但你试过了吗

Phoenix.PubSub.subscribe(MyApp.PubSub, "topic")

?

文档 - https://hexdocs.pm/phoenix_pubsub/Phoenix.PubSub.html

于 2020-10-13T01:27:31.210 回答