@type message :: nonempty_list(message_part())
@type arg_list :: [] | nonempty_list(any())
@type arg_keyword :: map()
+ @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(), arg_list :: arg_list(),
+ arg_keyword :: arg_keyword()}
@type handle_response ::
{:ok, integer()}
- | {:invocation, request_id :: integer(), registration_id :: integer(), details :: map(),
- arg_list :: arg_list(), arg_keywords :: arg_keyword()}
+ | invocation()
| {:ok, arg_list :: arg_list(), arg_keyword :: arg_keyword()}
- | {:error, reason :: binary()}
- | {:error, type :: integer(), error :: binary(), arg_list :: arg_list(),
- arg_keyword :: arg_keyword()}
- | {:event, subscription_id :: integer(), publication_id :: integer(), details :: map(),
- arg_list :: arg_list(), arg_keyword :: arg_keyword()}
+ | error()
+ | event()
@spec start_link(name: atom(), session_data: Sess.t()) ::
{:ok, pid()}
:realm,
:name,
:roles,
- :request_id,
- :transport,
- :protocol,
- :serializer,
+ request_id: 0,
+ protocol: "wamp.2.msgpack",
+ transport: WebSocket,
+ serializer: MessagePack,
requests: []
]
- @type t :: %__MODULE__{}
-
- @spec new(
- url :: binary(),
- realm :: Realm.t(),
- roles :: [module()],
- transport :: module(),
- protocol :: binary(),
- serializer :: module()
- ) :: t()
- def new(
- url,
- %Realm{} = realm,
- roles,
- transport \\ WebSocket,
- protocol \\ "wamp.2.msgpack",
- serializer \\ MessagePack
- ) do
- %__MODULE__{
- url: url,
- realm: realm,
- roles: roles,
- transport: transport,
- protocol: protocol,
- serializer: serializer,
- request_id: 0
- }
- end
+ @type t :: %__MODULE__{
+ id: integer() | nil,
+ url: binary(),
+ transport_pid: pid() | module() | nil,
+ message: Wampex.message() | nil,
+ event: Wampex.event() | nil,
+ invocation: Wampex.invocation() | nil,
+ goodbye: binary() | nil,
+ realm: Realm.t(),
+ name: module() | nil,
+ roles: [module()],
+ request_id: integer(),
+ protocol: binary(),
+ transport: module(),
+ serializer: module(),
+ requests: []
+ }
@spec cast_send_request(name :: atom() | pid(), request :: Wampex.message()) :: :ok
def cast_send_request(name, request) do
__MODULE__.call(name, {:send_request, request}, timeout)
end
- defp do_send(r_id, tt, t, request) do
- request_id = get_request_id(r_id)
-
- request =
- case request do
- [@yield | _] -> request
- _ -> List.insert_at(request, 1, request_id)
- end
-
- tt.send_request(t, request)
- request_id
- end
-
- defp get_request_id(current_id) when current_id == @max_id do
- 1
- end
-
- defp get_request_id(current_id) do
- current_id + 1
- end
-
@impl true
def handle_call(
{:send_request, request},
end)
end
+ defp do_send(r_id, tt, t, message) do
+ {request_id, message} = maybe_inject_request_id(r_id, message)
+ tt.send_request(t, message)
+ request_id
+ end
+
+ defp maybe_inject_request_id(r_id, [@yield | _] = message), do: {r_id, message}
+
+ defp maybe_inject_request_id(r_id, message) do
+ request_id = get_request_id(r_id)
+ {request_id, List.insert_at(message, 1, request_id)}
+ end
+
+ defp get_request_id(current_id) when current_id == @max_id do
+ 1
+ end
+
+ defp get_request_id(current_id) do
+ current_id + 1
+ end
+
defp remove_request(id, requests) do
Enum.filter(requests, fn
{^id, _} -> false