Current section
Files
Jump to
Current section
Files
lib/ads_server_protocol.ex
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