samba6

samba6

Trying to understand Phoenix.Channel.broadcast/3

So this is what I’m trying to achieve:
One part of my javascript client side code joins a topic "data:data" with a payload of data to sync to the backend.

def join("data:data", %{"query" => q} = params, socket) when is_binary(q) do
    send(self(), {:sync_data, params})
    {:ok, socket}
 end

def handle_info({:sync_data, params}, socket) do
    response = response(params)
    broadcast(socket, "data-synced", response)
    {:noreply, socket}
 end

This part of the client side code subscribes to the "data-synced" event and does something with the response. So far this part is working:

this.dataChannel = this.socket.channel("data:data", params);
this.dataChannel.on("data-synced", this.dataSyncedCb);

Now other parts of the code using the same socket (I’m using Phoenix.js) will join another topic "data:client:" <> id and also subscribe to the "data-synced" event and do different things with the response.

def join("data:client:" <> _id, _params, socket), do: {:ok, socket}
this.dataSyncChannel = args.socket.channel("data:client:289", {});
this.dataSyncChannel.on("data-synced", this.dataClientSyncedCb);

But these other parts of the code are not receiving the data-synced event.
Please note that these are all the same clients but they all have different responsibilities for the event response.

So I’m thinking may be Phoenix.Channel.broadcast/3 is not the way to go.

Most Liked

LostKobrakai

LostKobrakai

The socket holding the channel state works on a per topic level. So broadcast(socket, "data-synced", response) sends the event data-synced to subscribers of the data:data topic, but not so subscribers of the data:client:289 topic. Imagine a chatservice with many rooms. You wouldn’t want to send all chatmessages to all rooms there as well.

Socket here is not equivalent to “the single connection between server and client”, which is certainly a place where phoenix doesn’t do a good job at wording things. Socket in the context of a channel(-state) is rather “subscriber to a certain topic of the channel”.

Last Post!

samba6

samba6

Thanks @LostKobrakai. I have also tried:

def handle_info({:sync_data, params}, socket) do
    response = response(params)
    push(socket, "data-synced", response)

    #I know all the client IDs upfront.
    MyApp.Endpoint.broadcastfrom!(self(), "data:client:" <> id, "data-client-synced", response)
    {:noreply, socket}
end

def handle_in("data-client-synced", params, socket) do
    IO.inspect(params)
    {:noreply, socket}
 end

Yet handle_in("data-client-synced", params, socket) was never called.

Where Next?

Popular in Questions Top

ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New

Other popular topics Top

baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44139 214
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement