I have a channel, which does some things in back-end when you connect to it. I need to send response back, once the back-end job is completed. Here is my channel:
def join("boot", _, socket) do
Launcher.start()
{:ok, socket}
end
def handle_in("boot:fetch", params, socket) do
payload = %{total_reports: 5}
{:reply, {:ok, payload}, socket}
end
And Launcher
module is:
defmodule App.Launcher do
alias App.Endpoint
def start() do
Endpoint.broadcast! "boot", "test:my", %{total_reports: 541}
end
end
I expected to first receive %{total_reports: 541}
on test:my
and then %{total_reports: 5}
on boot:fetch
in the front-end. But I only receive data from boot:fetch
and not test:my
.
Endpoint.broadcast
from Launcher
module is not broadcasting anything. Is it expected behaviour? Why can't I broadcast from the modules aliased by channel?
Additionally, I have tested putting the exact same line in channel, and it works. For some reason I cannot do it only with others modules. This example works:
def handle_in("boot:fetch", params, socket) do
payload = %{total_reports: 5}
Endpoint.broadcast! "boot", "test:my", %{total_reports: 541}
{:reply, {:ok, payload}, socket}
end
My mistake was calling
Endpoint.broadcast
when joining the channel, but as the connection has not yet been established it couldn't broadcast. Moved in into handle in and everything works.