Packages
sippet
0.4.4
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
An Elixir Session Initiation Protocol (SIP) stack.
Current section
Files
Jump to
Current section
Files
lib/sippet/transports/udp/sender.ex
defmodule Sippet.Transports.UDP.Sender do
@moduledoc """
A worker process responsible for transforming the SIP message in iodata and
dispatching through the UDP socket.
This process is managed by `poolboy` and it is started by
`Sippet.Transports.UDP.Plug.start_link/0`.
"""
alias Sippet.Message, as: Message
alias Sippet.Transports.UDP.Plug, as: Plug
alias Sippet.Transports.UDP.Pool, as: Pool
alias Sippet.Transactions, as: Transactions
require Logger
@doc """
Starts the worker process.
"""
def start_link(_), do: GenServer.start_link(__MODULE__, nil)
@doc false
def init(_) do
socket = Plug.get_socket()
Logger.debug(fn -> "#{inspect self()} udp sender ready" end)
{:ok, socket}
end
@doc false
def handle_cast({:send_message, message, host, port, key}, socket) do
result =
case Socket.Address.for(host, :inet) do
{:ok, [address|_]} ->
iodata = Message.to_iodata(message)
case Socket.Datagram.send(socket, iodata, {address, port}) do
:ok -> :ok
other -> other
end
other ->
other
end
case result do
:ok ->
:ok
{:error, reason} ->
Logger.warn(fn -> "#{inspect self()} udp sender error for " <>
"#{host}:#{port}: #{inspect reason}" end)
if key != nil do
Transactions.receive_error(key, reason)
end
end
Pool.check_in(self())
{:noreply, socket}
end
@doc false
def terminate(reason, _socket) do
Logger.warn(fn -> "#{inspect self()} stopped udp sender, " <>
"reason #{inspect reason}" end)
end
end