Почему бы вам не задать канал вместо этого, просто создать синхронную задачу, объединить задачу в группу, в которую вы ожидаете получить результат, затем отправить сообщение на канал и затем вернуть результат обратно в контроллер как результат выполнения задачи.
Допустим, это действие контроллера
defmodule SomeController do
#...
def some_action(conn, params) do
task = Task.async(fn ->
MyApp.Endpoint.subscribe("topic:123:presence_list")
MyApp.Endpoint.broadcast("topic:123", :presence_list, %{})
receive do
{:presence_list, list} ->
{:ok, list}
after
5000 ->
{:error, timeout}
end
end)
{:ok, list} = Task.await(task)
# do something with a list
end
end
Тогда в канале просто обработать трансляцию и вернуть Presence.list(socket)
Это должно быть более чистым способом, вместо того, чтобы влиться во внутренние органы присутствия, которые могут измениться в будущем.
Второй вариант - создать собственный трекер и подключить его к приложению, а затем попросить трекер предоставить вам список существующих пользователей для определенного канала. Вы можете найти некоторые детали, как реализовать поведение трекера здесь