Packages
sippet
1.0.13
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/client/key.ex
defmodule Sippet.Transactions.Client.Key do
@moduledoc """
Defines a key in which client transactions are uniquely identified.
"""
alias Sippet.Message, as: Message
alias Sippet.Message.RequestLine, as: RequestLine
alias Sippet.Message.StatusLine, as: StatusLine
@typedoc "The topmost Via header branch parameter"
@type branch :: binary
@type t :: %__MODULE__{
branch: binary,
method: Message.method
}
defstruct [
branch: nil,
method: nil
]
@doc """
Create a client transaction identifier.
"""
@spec new(branch, Message.method) :: t
def new(branch, method)
when is_binary(method) or is_atom(method) do
%__MODULE__{branch: branch, method: method}
end
@doc """
Create a client transaction identifier from an outgoing request or an
incoming response. If they are related, they will be equal.
"""
@spec new(Message.t) :: t
def new(%Message{start_line: %RequestLine{}} = outgoing_request) do
method = outgoing_request.start_line.method
# Take the topmost via branch
{_version, _protocol, _sent_by, %{"branch" => branch}} =
hd(outgoing_request.headers.via)
new(branch, method)
end
def new(%Message{start_line: %StatusLine{}} = incoming_response) do
{_sequence, method} = incoming_response.headers.cseq
# Take the topmost via branch
{_version, _protocol, _sent_by, %{"branch" => branch}} =
hd(incoming_response.headers.via)
new(branch, method)
end
## Helpers
defimpl String.Chars do
def to_string(%{branch: branch, method: method}),
do: "#{branch}:#{method}"
end
defimpl Inspect do
def inspect(%{branch: branch, method: method}, _),
do: "~K[#{branch}|#{inspect method}]"
end
end