elixirectochannelphoenix-channels

Phoenix - return Ecto query results to a specific client


I'm currently trying to devise a scheme where the following happens.

Client A is subscribed/connected to topic/channel T.

A sends a message in the form of a select query to T.

Only A receives the query results, no other subscribers.

Is this even possible using Channels? The main reason I chose Channels was for the excellent websocket support - however I'm open to other Phoenix solutions.


Solution

  • Yes, Channels should do the work you want. You can push the query results down to the user who sent the query using push:

    def handle_in("new_query", %{"query" => query}, socket) do
    
        # do the query and store the result into query_result
    
        #return back the result using push to the user
        push socket, "new_query", %{query_result: query_result}
        {:ok, socket}
    end
    

    If you want to return the query result to all users who are joined to the topic, you can simply use broadcast instead of push, see the docs here