lib/acceptor.ex

defmodule ExWs.Acceptor do
	use Task, restart: :transient
	require Logger

	def start_link(opts) do
		Task.start_link(__MODULE__, :run, opts)
	end

	def run(opts) do
		accept_loop(opts[:socket], opts[:handler])
	end

	defp accept_loop(listen_socket, handler) do
		case :gen_tcp.accept(listen_socket) do
			{:ok, client_socket} ->
				opts = {client_socket, ExWs.Reader.new()}
				case GenServer.start(handler, opts) do
					{:ok, pid} ->
						:gen_tcp.controlling_process(client_socket, pid)
						GenServer.cast(pid, :ready)
					err -> Logger.error("handler start: #{inspect(err)}")
				end
			{:error, err} -> Logger.error("accept: #{inspect(err)}")
		end
		accept_loop(listen_socket, handler)
	end
end