lib/absinthe_websocket/supervisor.ex

defmodule AbsintheWebSocket.Supervisor do
  use Supervisor

  def start_link(args) do
    base_name = Keyword.get(args, :base_name)
    supervisor_name = Module.concat(base_name, Supervisor)

    Supervisor.start_link(__MODULE__, args, name: supervisor_name)
  end

  # name: OrgmanicQLApi.Websocket.Supervisor
  # name: OrgmanicQLApi.Websocket.QueryServer
  # name: OrgmanicQLApi.Websocket.SubscriptionServer

  def init(args) do
    base_name = Keyword.get(args, :base_name)
    query_server_name = Module.concat(base_name, QueryServer)
    subscription_server_name = Module.concat(base_name, SubscriptionServer)
    socket_name = Module.concat(base_name, Socket)

    url = Keyword.get(args, :url)
    token = Keyword.get(args, :token)
    subscriber = Keyword.get(args, :subscriber)
    async = Keyword.get(args, :async, true)

    websocket_worker_args =
      [subscription_server: subscription_server_name, url: url, token: token] ++
        Keyword.take(args, [:resubscribe_on_disconnect, :disconnect_sleep])

    children = [
      worker(AbsintheWebSocket.QueryServer, [[socket: socket_name],[name: query_server_name]]),
      worker(AbsintheWebSocket.SubscriptionServer, [[socket: socket_name, subscriber: subscriber], [name: subscription_server_name]]),
      worker(AbsintheWebSocket.WebSocket, [websocket_worker_args, [async: async, name: socket_name]]),
    ]

    # restart everything on failures
    # It'd be nice if the QueryServer & SubscriptionServer could recover...
    Supervisor.init(children, strategy: :one_for_all)
  end
end