defmodule Ads.Server.Protocol do alias Ads.Server @behaviour :ranch_protocol @timeout 5000 def start_link(ref, socket, transport, opts) do pid = spawn_link(__MODULE__, :init, [ref, socket, transport, opts]) {:ok, pid} end def init(ref, socket, transport, opts) do :ok = :ranch.accept_ack(ref) loop(socket, transport, opts) end defp loop(socket, transport, opts) do case transport.recv(socket, 0, @timeout) do {:ok, data} -> try do {res, d, {n,p, index_grp}} = Ads.Server.Ads.parseWrite(data) transport.send(socket, res) size = byte_size(d) {^size, type} = opts |> Map.get(n) |> Map.get(p) |> Map.get(index_grp) data = case Ads.Structure.bin_to_struct(type, d) do {data, ""} -> data data -> data end Server.publish(n,p,index_grp,data) rescue RuntimeError -> "Error" end loop(socket, transport, opts) _ -> :ok = transport.close(socket) end end end