Current section

Files

Jump to
sippet lib sippet transactions supervisor.ex
Raw

lib/sippet/transactions/supervisor.ex

defmodule Sippet.Transactions.Supervisor do
@moduledoc false
use Supervisor
import Sippet.Transactions.Registry
alias Sippet.Message, as: Message
alias Sippet.Message.RequestLine, as: RequestLine
alias Sippet.Transactions, as: Transactions
@type request :: Message.request
@doc false
def start_link() do
Supervisor.start_link(__MODULE__, [], name: __MODULE__)
end
@doc """
Starts a client transaction.
"""
@spec start_client(Transactions.Client.Key.t, request) ::
Supervisor.on_start_child
def start_client(%Transactions.Client.Key{} = key,
%Message{start_line: %RequestLine{}} = outgoing_request) do
module =
case key.method do
:invite -> Transactions.Client.Invite
_otherwise -> Transactions.Client.NonInvite
end
initial_data = Transactions.Client.State.new(outgoing_request, key)
Supervisor.start_child(__MODULE__, [module, initial_data,
[name: via_tuple(key)]])
end
@doc """
Starts a server transaction.
"""
@spec start_server(Transactions.Server.Key.t, request) ::
Supervisor.on_start_child
def start_server(%Transactions.Server.Key{} = key,
%Message{start_line: %RequestLine{}} = incoming_request) do
module =
case key.method do
:invite -> Transactions.Server.Invite
_otherwise -> Transactions.Server.NonInvite
end
initial_data = Transactions.Server.State.new(incoming_request, key)
Supervisor.start_child(__MODULE__, [module, initial_data,
[name: via_tuple(key)]])
end
@doc false
def init([]) do
children = [worker(GenStateMachine, [], restart: :transient)]
options = [strategy: :simple_one_for_one]
supervise(children, options)
end
end