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