lib/server.ex

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