Packages
sippet
0.4.5
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/transactions/registry.ex
defmodule Sippet.Transactions.Registry do
@moduledoc """
The transactions registry, where client and server transaction keys are
associated to transaction processes.
"""
alias Sippet.Transactions, as: Transactions
@type client_key :: Transactions.Client.Key.t
@type server_key :: Transactions.Server.Key.t
@doc """
Starts the transactions registry.
The registry is partitioned according to the number of schedulers available.
"""
def start_link() do
args = [partitions: System.schedulers_online()]
Registry.start_link(:unique, __MODULE__, args)
end
@doc """
Takes a `{:via, Registry, {registry, key}}` tuple corresponding to this
registry for the given `key`.
"""
@spec via_tuple(client_key | server_key) ::
{:via, Registry, {__MODULE__, client_key | server_key}}
def via_tuple(key)
def via_tuple(%Transactions.Client.Key{} = client_key),
do: do_via_tuple(client_key)
def via_tuple(%Transactions.Server.Key{} = server_key),
do: do_via_tuple(server_key)
defp do_via_tuple(key), do: {:via, Registry, {__MODULE__, key}}
@doc """
Looks up if a registered process exists to handle the given key.
An empty list if there is no match.
"""
@spec lookup(client_key | server_key) :: pid | nil
def lookup(key)
def lookup(%Transactions.Client.Key{} = client_key),
do: do_lookup(client_key)
def lookup(%Transactions.Server.Key{} = server_key),
do: do_lookup(server_key)
defp do_lookup(key) do
case Registry.lookup(__MODULE__, key) do
[{pid, _}] -> pid
[] -> nil
end
end
@doc """
Registers the current process under the given client or server transaction
key in the transactions registry.
By doing so, incoming requests or responses will be redirected to the current
transaction process once they come. The registry is cleared once the
process closes.
"""
@spec register_alias(client_key | server_key) ::
{:ok, pid} | {:error, {:already_registered, pid}}
def register_alias(key)
def register_alias(%Transactions.Client.Key{} = client_key),
do: do_register_alias(client_key)
def register_alias(%Transactions.Server.Key{} = server_key),
do: do_register_alias(server_key)
defp do_register_alias(key),
do: Registry.register(__MODULE__, key, nil)
@doc """
Returns all client or server keys associated with the given process.
"""
@spec aliases(pid) :: [client_key | server_key]
def aliases(pid), do: Registry.keys(__MODULE__, pid)
end