defmodule ExWs.Server do use Supervisor if Mix.env in [:ab, :test] do def start_for_tests() do {:ok, _pid} = start_link(Application.get_all_env(:exws)) :timer.sleep(:infinity) end end def start_link(config) do Supervisor.start_link(__MODULE__, config) end def init(config) do port = Keyword.fetch!(config, :port) handler = Keyword.fetch!(config, :handler) opts = [:binary, packet: :raw, active: false, reuseaddr: true, backlog: 1024] {port, opts} = case port do {:local, _} = unix -> {0, Keyword.put(opts, :ifaddr, unix)} port -> {port, opts} end {:ok, socket} = :gen_tcp.listen(port, opts) opts = [[socket: socket, handler: handler]] children = [ Supervisor.child_spec({ExWs.Acceptor, opts}, id: :ws_acceptor_1), Supervisor.child_spec({ExWs.Acceptor, opts}, id: :ws_acceptor_2), Supervisor.child_spec({ExWs.Acceptor, opts}, id: :ws_acceptor_3), Supervisor.child_spec({ExWs.Acceptor, opts}, id: :ws_acceptor_4) ] Supervisor.init(children, strategy: :one_for_one) end end