I have a Phoenix LiveView App inside an umbrella project which is basically a HelloWorld project. In This Phoenix App is special though, in that it is a Desktop App: https://github.com/elixir-desktop/desktop
My Phoenix app does not use Ecto nor any DB, so I had to add the usual PubSub
line to the supervision tree in application.ex
.
Everything works as expected, except when I close the application. Upon closing it I get an error:
12:19:22.507 [error] GenServer #PID<0.553.0> terminating
** (ArgumentError) unknown registry: WebInterface.PubSub
(elixir 1.13.1) lib/registry.ex:1334: Registry.info!/1
(elixir 1.13.1) lib/registry.ex:985: Registry.register/3
(phoenix_pubsub 2.0.0) lib/phoenix/pubsub.ex:117: Phoenix.PubSub.subscribe/3
(phoenix 1.6.5) lib/phoenix/channel/server.ex:419: Phoenix.Channel.Server.init_join/3
(phoenix 1.6.5) lib/phoenix/channel/server.ex:378: Phoenix.Channel.Server.channel_join/4
(phoenix 1.6.5) lib/phoenix/channel/server.ex:298: Phoenix.Channel.Server.handle_info/2
(stdlib 3.16.1) gen_server.erl:695: :gen_server.try_dispatch/4
(stdlib 3.16.1) gen_server.erl:771: :gen_server.handle_msg/6
Last message: {Phoenix.Channel, %{}, {#PID<0.541.0>, #Reference<0.3172133806.691273734.151736>}, %Phoenix.Socket{assigns: %{}, channel: Phoenix.LiveReloader.Channel, channel_pid: nil, endpoint: WebInterface.Endpoint, handler: Phoenix.LiveReloader.Socket, id: nil, join_ref: "4", joined: false, private: %{}, pubsub_server: WebInterface.PubSub, ref: nil, serializer: Phoenix.Socket.V2.JSONSerializer, topic: "phoenix:live_reload", transport: :websocket, transport_pid: #PID<0.541.0>}}
State: #Reference<0.3172133806.691273734.151738>
Here is my application.ex
file:
defmodule WebInterface.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
alias Desktop
@impl true
def start(_type, _args) do
children = [
WebInterface.Telemetry,
WebInterface.Endpoint,
{Phoenix.PubSub, name: WebInterface.PubSub},
{Desktop.Window,
[
app: :web_interface,
id: WebInterface,
title: "Web Interface",
size: {600, 500},
menubar: WebInterface.MenuBar,
url: &WebInterface.Endpoint.url/0
]}
]
opts = [strategy: :one_for_one, name: WebInterface.Supervisor]
Supervisor.start_link(children, opts)
end
@impl true
def config_change(changed, _new, removed) do
WebInterface.Endpoint.config_change(changed, removed)
:ok
end
end
Here is a gif of what is happening:
What am I doing wrong?
Turns out the issue was in my children
array. Since application order DOES MATTER, my PubSub child should be before Endpoint:
children = [
WebInterface.Telemetry,
{Phoenix.PubSub, name: WebInterface.PubSub},
WebInterface.Endpoint,
{Desktop.Window,
[
app: :web_interface,
id: WebInterface,
title: "Web Interface",
size: {600, 500},
menubar: WebInterface.MenuBar,
url: &WebInterface.Endpoint.url/0
]}
]