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