*18 Jul 2019* I recently picked up [Elixir](https://elixir-lang.org) and [Phoenix](https://phoenixframework.org/) as development tools and i'm loving them. The [Erlang](https://www.erlang.org) virtual machine (BEAM) where code runs is an amazingly simple, yet powerful, system that allows for some really hard things like inter-process communication to become simple. Phoenix's [PubSub](https://hexdocs.pm/phoenix_pubsub/Phoenix.PubSub.html) makes this process even simpler. The only problem is that the documentation at times is not that simple to follow, and i have to admit i lost more time than i wanted getting it to work properly. ## The problem My application consists of two Erlang applications: Phoenix, and a [Broadway](https://hexdocs.pm/broadway/Broadway.html) app for doing some pipeline processing. Ideally i would love for the Broadway worker to be able to notify the user in realtime in the browser of what it is doing. After much fiddling around i managed to make it work using LiveView. ## The Solution In my Broadway worker (or in your case in any other application running on the Erlang VM) you can send events to PubSub like this: ```ruby Phoenix.PubSub.broadcast!( HappyPhoenixApp.PubSub, "notifications", "Doing some work" ) ``` Where ***HappyPhoenixApp.PubSub*** is the name of the PubSub you declare when configuring the Phoenix endpoint in ***config.exs*** and **notifications** is the name of the topic you are sending the message to. The best way to subscribe to this topic in LiveView is in your view's **mount** function, that gets run when the view is initialized, like so: ```ruby def mount(_session, socket) do # Subscribe to notifications coming from the Broadway app Phoenix.PubSub.subscribe(HappyPhoenixApp.PubSub, "notifications") {:ok, assign(socket, messages: ["Ready!"] )} end ``` Then you just need to implement the **handle_info** function to receive events from the other app: ```ruby @doc """ Handles events coming from Broadway """ def handle_info(message, socket) do {:noreply, assign(socket, messages: socket.assigns.messages ++ [message] )} end ``` You might notice i am assigning the message i get to a LiveView variable messages (which i initialized previously in mount with an initial value). This will make LiveView re-render the HTML it is currently managing, making sure the client sees the updates in realtime via websockets. Happy mixing! [[tags/broadway|broadway]] [[tags/elixir|elixir]] [[tags/phoenix|phoenix]] [[tags/programming|programming]] [[tags/software_development|software_development]]