KekKekington
I’m working with Channels and Endpoint to send messages between the channels and their topics. I recently had to add a new ‘inter-channel’ communication path to remove some data. Basically, an admin will send a message to its own admin channel to cancel the order from employee x, the handle_in will then do a broadcast to employee:x with the message “finish_order”, which already has its handle_in function since the employee can also finish the order itself.
Problem is that I can’t seem to be able to send the message to the employee channel:topic. I’ve even tried hardcoding the employee topic but it just never hits the channel. What feels even more strange is that I’ve been using Endpoint.broadcast! throughout the program and it’s been working perfectly. Employee can send broadcasts to Clients, Clients can send to Employee. Only Admin isn’t able to broadcast and I just ran out of things to try.
# Admin
def handle_in("remove_order_from_driver", %{"client_id" => client_id, "order_id" => order_id, "employee_id" => employee_id}, socket) do
Logger.info("Admin is removing an order from #{driver_id}")
Endpoint.broadcast!("employee:#{employee_id}" ,"finished_order", %{client_id: client_id, order_id: order_id})
{:noreply, socket}
end
# Employee
def handle_in("finished_order", %{"client_id" => client_id, "order_id" => order_id_client},socket) do
# Logic to end the order, which is already being used by the employee frontend.
{:noreply, socket}
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First Post!- Show Best Posts
- Show All Posts (oldest first)
- Show All Posts (newest first)
outlog
think you are mixing/mismatching string/atom keys in your maps.. (“client_id” => value VS client_id: value etc)
so
Endpoint.broadcast!("employee:#{employee_id}" ,"finished_order", %{client_id: client_id, order_id: order_id})will never be matched to
def handle_in("finished_order", %{"client_id" => client_id, "order_id" => order_id_client},socket) doso use one or the other..
Last Post!
KekKekington
I was trying to avoid having to release an update to the JS client but it seems like it’ll be much worse in the end. Based on all that @outlog mentioned, I’m broadcasting the message to the employee topic:subtopic, receiving that on the frontend and having it send its own “finish order” message. I’ve yet to try this but from everything I’ve gathered, it should work and I’ll avoid a mess in my Elixir code.