Handles requests and responses for a Broker
"""
alias Wampex.Role
+ alias Wampex.Roles.Publisher.Publish
+ alias Wampex.Roles.Subscriber.{Subscribe, Unsubscribe}
@behaviour Role
@publish 16
defmodule Event do
@moduledoc false
@enforce_keys [:subscription_id, :publication_id]
- defstruct [:subscription_id, :publication_id, arg_list: [], arg_kw: %{}, options: %{}]
+ defstruct [:subscription_id, :publication_id, arg_list: [], arg_kw: %{}, details: %{}]
@type t :: %__MODULE__{
subscription_id: integer(),
publication_id: integer(),
arg_list: list(any()),
arg_kw: map(),
- options: map()
+ details: map()
}
end
publication_id: pi,
arg_list: al,
arg_kw: akw,
- options: opts
+ details: opts
}) do
[@event, si, pi, opts, al, akw]
end
@impl true
def handle([@subscribe, request_id, opts, topic]) do
{[{:next_event, :internal, :subscribe}], request_id,
- {:update, :subscribe, {:subscribe, request_id, opts, topic}}}
+ {:update, :subscribe, %Subscribe{request_id: request_id, options: opts, topic: topic}}}
end
@impl true
def handle([@unsubscribe, request_id, id]) do
{[{:next_event, :internal, :unsubscribe}], request_id,
- {:update, :unsubscribe, {:unsubscribe, request_id, id}}}
+ {:update, :unsubscribe, %Unsubscribe{request_id: request_id, subscription_id: id}}}
end
@impl true
@impl true
def handle([@publish, id, opts, topic, arg_l, arg_kw]) do
{[{:next_event, :internal, :publish}], id,
- {:update, :publish, {:publish, id, opts, topic, arg_l, arg_kw}}}
+ {:update, :publish,
+ %Publish{request_id: id, options: opts, topic: topic, arg_list: arg_l, arg_kw: arg_kw}}}
end
end
"""
alias Wampex.Role
+ alias Wampex.Roles.Dealer.{Invocation, Result}
@behaviour Role
@register 64
defmodule Register do
@moduledoc false
@enforce_keys [:procedure]
- defstruct [:procedure, options: %{}]
+ defstruct [:request_id, :registration_id, :procedure, options: %{}]
@type t :: %__MODULE__{
+ registration_id: integer() | nil,
+ request_id: integer() | nil,
procedure: binary(),
options: map()
}
defmodule Unregister do
@moduledoc false
@enforce_keys [:registration_id]
- defstruct [:registration_id]
+ defstruct [:request_id, :registration_id]
@type t :: %__MODULE__{
+ request_id: integer() | nil,
registration_id: integer()
}
end
[@yield, ri, opts, al, akw]
end
+ @impl true
+ def handle(<<@unregistered, request_id>>) do
+ {[{:next_event, :internal, :established}], request_id, {:ok, request_id}}
+ end
+
@impl true
def handle([@unregistered, request_id]) do
{[{:next_event, :internal, :established}], request_id, {:ok, request_id}}
@impl true
def handle([@invocation, id, reg_id, dets, arg_l, arg_kw]) do
{[{:next_event, :internal, :invocation}], id,
- {:update, :invocation, {:invocation, id, reg_id, dets, arg_l, arg_kw}}}
+ {:update, :invocation,
+ %Invocation{
+ request_id: id,
+ registration_id: reg_id,
+ details: dets,
+ arg_list: arg_l,
+ arg_kw: arg_kw
+ }}}
end
@impl true
"""
alias Wampex.Role
+ alias Wampex.Roles.Dealer.Result
alias Wampex.Roles.Peer.Error
@behaviour Role
@moduledoc false
@enforce_keys [:procedure]
- defstruct [:procedure, arg_list: [], arg_kw: %{}, options: %{}]
+ defstruct [:request_id, :procedure, arg_list: [], arg_kw: %{}, options: %{}]
@type t :: %__MODULE__{
+ request_id: integer() | nil,
procedure: binary(),
arg_list: list(any()),
arg_kw: map(),
@impl true
def handle([@result, id, dets, arg_l, arg_kw]) do
- {[{:next_event, :internal, :established}], id, {:ok, dets, arg_l, arg_kw}}
+ {[{:next_event, :internal, :established}], id,
+ %Result{request_id: id, details: dets, arg_list: arg_l, arg_kw: arg_kw}}
end
end
Handles requests and responses for a Dealer
"""
alias Wampex.Role
+ alias Wampex.Roles.Callee.{Unregister, Yield, Register}
+ alias Wampex.Roles.Caller.{Call, Cancel}
@behaviour Role
@call 48
defmodule Result do
@moduledoc false
@enforce_keys [:request_id]
- defstruct [:request_id, arg_list: [], arg_kw: %{}, options: %{}]
+ defstruct [:request_id, arg_list: [], arg_kw: %{}, details: %{}]
@type t :: %__MODULE__{
request_id: integer(),
arg_list: list(any()),
arg_kw: map(),
- options: map()
+ details: map()
}
end
defmodule Invocation do
@moduledoc false
@enforce_keys [:request_id, :registration_id]
- defstruct [:request_id, :registration_id, arg_list: [], arg_kw: %{}, options: %{}]
+ defstruct [:request_id, :registration_id, arg_list: [], arg_kw: %{}, details: %{}]
@type t :: %__MODULE__{
request_id: integer(),
registration_id: integer(),
arg_list: list(any()),
arg_kw: map(),
- options: map()
+ details: map()
}
end
def invocation(%Invocation{
request_id: ri,
registration_id: reg_id,
- options: opts,
+ details: opts,
arg_list: al,
arg_kw: akw
}) do
request_id: ri,
arg_list: al,
arg_kw: akw,
- options: opts
+ details: dets
}) do
- [@result, ri, opts, al, akw]
+ [@result, ri, dets, al, akw]
end
@impl true
def handle([@unregister, request_id, registration_id]) do
{[{:next_event, :internal, :unregister}], request_id,
- {:update, :unregister, {:unregister, request_id, registration_id}}}
+ {:update, :unregister, %Unregister{request_id: request_id, registration_id: registration_id}}}
end
@impl true
def handle([@register, request_id, opts, procedure]) do
{[{:next_event, :internal, :register}], request_id,
- {:update, :register, {:register, request_id, opts, procedure}}}
+ {:update, :register, %Register{request_id: request_id, options: opts, procedure: procedure}}}
end
@impl true
- def handle([@call, id, dets, proc]) do
- handle([@call, id, dets, proc, [], %{}])
+ def handle([@call, id, opts, proc]) do
+ handle([@call, id, opts, proc, [], %{}])
end
@impl true
- def handle([@call, id, dets, proc, arg_l]) do
- handle([@call, id, dets, proc, arg_l, %{}])
+ def handle([@call, id, opts, proc, arg_l]) do
+ handle([@call, id, opts, proc, arg_l, %{}])
end
@impl true
- def handle([@call, id, dets, proc, arg_l, arg_kw]) do
+ def handle([@call, id, opts, proc, arg_l, arg_kw]) do
{[{:next_event, :internal, :call}], id,
- {:update, :call, {:call, id, dets, proc, arg_l, arg_kw}}}
+ {:update, :call,
+ %Call{request_id: id, options: opts, procedure: proc, arg_list: arg_l, arg_kw: arg_kw}}}
end
@impl true
- def handle([@yield, id, dets]) do
- handle([@yield, id, dets, [], %{}])
+ def handle([@yield, id, opts]) do
+ handle([@yield, id, opts, [], %{}])
end
@impl true
- def handle([@yield, id, dets, arg_l]) do
- handle([@yield, id, dets, arg_l, %{}])
+ def handle([@yield, id, opts, arg_l]) do
+ handle([@yield, id, opts, arg_l, %{}])
end
@impl true
- def handle([@yield, id, dets, arg_l, arg_kw]) do
- {[{:next_event, :internal, :yield}], id, {:update, :yield, {:yield, id, dets, arg_l, arg_kw}}}
+ def handle([@yield, id, opts, arg_l, arg_kw]) do
+ {[{:next_event, :internal, :yield}], id,
+ {:update, :yield, %Yield{request_id: id, options: opts, arg_list: arg_l, arg_kw: arg_kw}}}
end
end
defmodule Challenge do
@moduledoc false
@enforce_keys [:auth_method]
- defstruct [:auth_method, options: %{}]
+ defstruct [:auth_method, extra: %{}]
@type t :: %__MODULE__{
auth_method: String.t(),
- options: %{}
+ extra: %{}
}
end
end
@spec challenge(Challenge.t()) :: Wampex.message()
- def challenge(%Challenge{auth_method: am, options: opts}) do
- [@challenge, am, opts]
+ def challenge(%Challenge{auth_method: am, extra: ext}) do
+ [@challenge, am, ext]
end
@spec goodbye(Goodbye.t()) :: Wampex.message()
end
@impl true
- def handle([@hello, realm, dets]) do
- {[{:next_event, :internal, :hello}], nil, {:update, :hello, {:hello, realm, dets}}}
+ def handle([@hello, realm, opts]) do
+ {[{:next_event, :internal, :hello}], nil,
+ {:update, :hello,
+ %Hello{
+ realm: realm,
+ options: opts,
+ roles: get_in(opts, ["roles"]),
+ agent: get_in(opts, ["agent"])
+ }}}
end
@impl true
- def handle([@authenticate, sig, dets]) do
+ def handle([@authenticate, sig, extra]) do
{[{:next_event, :internal, :authenticate}], nil,
- {:update, :authenticate, {:authenticate, sig, dets}}}
+ {:update, :authenticate, %Authenticate{signature: sig, extra: extra}}}
end
@impl true
@impl true
def handle([@challenge, auth_method, extra]) do
- {[{:next_event, :internal, :challenge}], nil, {:update, :challenge, {auth_method, extra}}}
+ {[{:next_event, :internal, :challenge}], nil,
+ {:update, :challenge, %Challenge{auth_method: auth_method, extra: extra}}}
end
@impl true
defmodule Publish do
@moduledoc false
@enforce_keys [:topic]
- defstruct [:topic, arg_list: [], arg_kw: %{}, options: %{}]
+ defstruct [:request_id, :topic, arg_list: [], arg_kw: %{}, options: %{}]
@type t :: %__MODULE__{
+ request_id: integer() | nil,
topic: binary(),
arg_list: list(any()),
arg_kw: map(),
"""
alias Wampex.Role
+ alias Wampex.Roles.Broker.Event
@behaviour Role
@subscribe 32
defmodule Subscribe do
@moduledoc false
@enforce_keys [:topic]
- defstruct [:topic, options: %{}]
+ defstruct [:request_id, :topic, options: %{}]
@type t :: %__MODULE__{
+ request_id: integer() | nil,
topic: binary(),
options: map()
}
defmodule Unsubscribe do
@moduledoc false
@enforce_keys [:subscription_id]
- defstruct [:subscription_id]
+ defstruct [:request_id, :subscription_id]
@type t :: %__MODULE__{
+ request_id: integer() | nil,
subscription_id: integer()
}
end
@impl true
def handle([@event, sub_id, pub_id, dets, arg_l, arg_kw]) do
{[{:next_event, :internal, :event}], nil,
- {:update, :event, {:event, sub_id, pub_id, dets, arg_l, arg_kw}}}
+ {:update, :event,
+ %Event{
+ subscription_id: sub_id,
+ publication_id: pub_id,
+ details: dets,
+ arg_list: arg_l,
+ arg_kw: arg_kw
+ }}}
end
end
@moduledoc """
Types for wampex
"""
+ alias Wampex.Roles
+ alias Roles.{Broker, Callee, Caller, Dealer, Peer, Publisher, Subscriber}
+ alias Broker.{Event, Subscribed, Unsubscribed, Published}
+ alias Callee.{Register, Unregister, Yield}
+ alias Caller.{Call, Cancel}
+ alias Dealer.{Registered, Unregistered, Result, Invocation}
+ alias Peer.{Hello, Welcome, Challenge, Goodbye, Authenticate, Abort, Error}
+
@type message_part :: integer() | binary() | map() | list()
@type message :: nonempty_list(message_part())
@type arg_list :: [] | nonempty_list(any())
@type arg_keyword :: map()
- @type hello :: {:hello, realm :: String.t(), details :: map()}
-
- @type authenticate :: {:authenticate, signature :: binary(), details :: map()}
-
- @type call ::
- {:call, request_id :: integer(), details :: map(), procedure :: String.t(),
- arg_list :: arg_list(), arg_keywords :: arg_keyword()}
-
- @type yield ::
- {:yield, request_id :: integer(), details :: map(), arg_list :: arg_list(),
- arg_keywords :: arg_keyword()}
-
- @type publish ::
- {:publish, request_id :: integer(), details :: map(), topic :: String.t(),
- arg_list :: arg_list(), arg_keywords :: arg_keyword()}
-
- @type register ::
- {:register, request_id :: integer(), details :: map(), procedure :: String.t()}
-
- @type unregister :: {:unregister, request_id :: integer(), registration_id :: integer()}
-
- @type unsubscribe ::
- {:unsubscribe, request_id :: integer(), id :: integer()}
-
- @type subscribe ::
- {:subscribe, request_id :: integer(), details :: map(), topic :: String.t()}
- @type invocation ::
- {:invocation, request_id :: integer(), registration_id :: integer(), details :: map(),
- arg_list :: arg_list(), arg_keywords :: arg_keyword()}
- @type event ::
- {:event, subscription_id :: integer(), publication_id :: integer(), details :: map(),
- arg_list :: arg_list(), arg_keyword :: arg_keyword()}
@type error ::
{:error, reason :: binary()}
- | {:error, type :: integer(), error :: binary(), details :: map(),
- arg_list :: arg_list(), arg_keyword :: arg_keyword()}
+ | Error.t()
@type messages ::
- publish()
- | hello()
- | authenticate()
- | unsubscribe()
- | subscribe()
- | invocation()
- | register()
- | unregister()
- | call()
- | yield()
- | error()
- | event()
+ Publish.t()
+ | Hello.t()
+ | Authenticate.t()
+ | Unsubscribe.t()
+ | Subscribe.t()
+ | Invocation.t()
+ | Register.t()
+ | Unregister.t()
+ | Call.t()
+ | Yield.t()
+ | Error.t()
+ | Event.t()
@type handle_response ::
{:ok, integer()}
- | {:ok, details :: map(), arg_list :: arg_list(), arg_keyword :: arg_keyword()}
+ | {:ok, details :: map(), arg_list :: arg_list(), arg_kw :: arg_keyword()}
| {:update, atom(), messages()}
end