Skip to content

Commit c47a54b

Browse files
feat: propagating opts from client.base (#223)
## Problem Currently, method `GenServer.call` used on transports have a default timeout of 5s. Despite allowing to pass http options such as the timeout to be used in the request, the GenServer will throw a timeout after 5s. ## Solution Use a timeout param on `GenServer.call` from opts ## Rationale opts will allow us to propagate any other config in the future
1 parent 549b7a3 commit c47a54b

File tree

18 files changed

+74
-82
lines changed

18 files changed

+74
-82
lines changed

lib/hermes/client/base.ex

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,7 @@ defmodule Hermes.Client.Base do
793793
@impl true
794794
def handle_call({:operation, %Operation{} = operation}, from, state) do
795795
method = operation.method
796+
opts = [headers: operation.headers, timeout: operation.timeout]
796797

797798
params_with_token =
798799
State.add_progress_token_to_params(operation.params, operation.progress_opts)
@@ -801,7 +802,7 @@ defmodule Hermes.Client.Base do
801802
{request_id, updated_state} =
802803
State.add_request_from_operation(state, operation, from),
803804
{:ok, request_data} <- encode_request(method, params_with_token, request_id),
804-
:ok <- send_to_transport(state.transport, request_data, operation.headers) do
805+
:ok <- send_to_transport(state.transport, request_data, opts) do
805806
Telemetry.execute(
806807
Telemetry.event_client_request(),
807808
%{system_time: System.system_time()},
@@ -1421,24 +1422,12 @@ defmodule Hermes.Client.Base do
14211422
send_notification(state, "notifications/cancelled", params)
14221423
end
14231424

1424-
defp send_to_transport(transport, data, headers) when not is_nil(headers) do
1425-
opts = [headers: headers]
1426-
1425+
defp send_to_transport(transport, data, opts \\ []) do
14271426
with {:error, reason} <- transport.layer.send_message(transport.name, data, opts) do
14281427
{:error, Error.transport(:send_failure, %{original_reason: reason})}
14291428
end
14301429
end
14311430

1432-
defp send_to_transport(transport, data, _headers) do
1433-
send_to_transport(transport, data)
1434-
end
1435-
1436-
defp send_to_transport(transport, data) do
1437-
with {:error, reason} <- transport.layer.send_message(transport.name, data) do
1438-
{:error, Error.transport(:send_failure, %{original_reason: reason})}
1439-
end
1440-
end
1441-
14421431
defp send_notification(state, method, params \\ %{}) do
14431432
with {:ok, notification_data} <- encode_notification(method, params) do
14441433
send_to_transport(state.transport, notification_data)
@@ -1532,7 +1521,7 @@ defmodule Hermes.Client.Base do
15321521

15331522
defp send_sampling_response(id, response, state) do
15341523
transport = state.transport
1535-
:ok = transport.layer.send_message(transport.name, response)
1524+
:ok = transport.layer.send_message(transport.name, response, [])
15361525

15371526
Telemetry.execute(
15381527
Telemetry.event_client_response(),
@@ -1544,7 +1533,7 @@ defmodule Hermes.Client.Base do
15441533
defp send_sampling_error(id, message, code, reason, %{transport: transport} = state) do
15451534
error = %Error{code: -1, message: message, data: %{"reason" => reason}}
15461535
{:ok, response} = Error.to_json_rpc(error, id)
1547-
:ok = transport.layer.send_message(transport.name, response)
1536+
:ok = transport.layer.send_message(transport.name, response, [])
15481537

15491538
Logging.client_event(
15501539
"sampling_error",

lib/hermes/server/transport/sse.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ defmodule Hermes.Server.Transport.SSE do
131131
* `{:error, reason}` otherwise
132132
"""
133133
@impl Transport
134-
@spec send_message(GenServer.server(), binary()) :: :ok | {:error, term()}
135-
def send_message(transport, message) when is_binary(message) do
134+
@spec send_message(GenServer.server(), binary(), keyword()) :: :ok | {:error, term()}
135+
def send_message(transport, message, _opts \\ []) when is_binary(message) do
136136
GenServer.call(transport, {:send_message, message})
137137
end
138138

lib/hermes/server/transport/stdio.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ defmodule Hermes.Server.Transport.STDIO do
7777
* `{:error, reason}` otherwise
7878
"""
7979
@impl Transport
80-
@spec send_message(GenServer.server(), binary()) :: :ok | {:error, term()}
81-
def send_message(transport, message) when is_binary(message) do
80+
@spec send_message(GenServer.server(), binary(), keyword()) :: :ok | {:error, term()}
81+
def send_message(transport, message, _opts \\ []) when is_binary(message) do
8282
GenServer.cast(transport, {:send, message})
8383
end
8484

@@ -262,7 +262,7 @@ defmodule Hermes.Server.Transport.STDIO do
262262
else
263263
case GenServer.call(server, {:request, message, "stdio", context}, timeout) do
264264
{:ok, response} when is_binary(response) ->
265-
send_message(self(), response)
265+
send_message(self(), response, [])
266266

267267
{:error, reason} ->
268268
Logging.transport_event("server_error", %{reason: reason}, level: :error)

lib/hermes/server/transport/streamable_http.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ defmodule Hermes.Server.Transport.StreamableHTTP do
105105
* `{:error, reason}` otherwise
106106
"""
107107
@impl Transport
108-
@spec send_message(GenServer.server(), binary()) :: :ok | {:error, term()}
109-
def send_message(transport, message) when is_binary(message) do
108+
@spec send_message(GenServer.server(), binary(), keyword()) :: :ok | {:error, term()}
109+
def send_message(transport, message, _opts \\ []) when is_binary(message) do
110110
GenServer.call(transport, {:send_message, message})
111111
end
112112

lib/hermes/transport/behaviour.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ defmodule Hermes.Transport.Behaviour do
1111
@type reason :: term() | Error.t()
1212

1313
@callback start_link(keyword()) :: GenServer.on_start()
14-
@callback send_message(t(), message()) :: :ok | {:error, reason()}
14+
@callback send_message(t(), message(), keyword()) :: :ok | {:error, reason()}
1515
@callback shutdown(t()) :: :ok | {:error, reason()}
1616

1717
@doc """

lib/hermes/transport/sse.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ defmodule Hermes.Transport.SSE do
101101
end
102102

103103
@impl Transport
104-
def send_message(pid, message) when is_binary(message) do
104+
def send_message(pid, message, _opts \\ []) when is_binary(message) do
105105
GenServer.call(pid, {:send, message})
106106
end
107107

lib/hermes/transport/stdio.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ defmodule Hermes.Transport.STDIO do
7373
end
7474

7575
@impl Transport
76-
def send_message(pid \\ __MODULE__, message) when is_binary(message) do
76+
def send_message(pid \\ __MODULE__, message, _opts \\ []) when is_binary(message) do
7777
GenServer.call(pid, {:send, message})
7878
end
7979

lib/hermes/transport/streamable_http.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ defmodule Hermes.Transport.StreamableHTTP do
5252
alias Hermes.Telemetry
5353
alias Hermes.Transport.Behaviour, as: Transport
5454

55+
@default_timeout 15_000
56+
5557
@type t :: GenServer.server()
5658
@type params_t :: Enumerable.t(option)
5759

@@ -97,7 +99,8 @@ defmodule Hermes.Transport.StreamableHTTP do
9799

98100
@impl Transport
99101
def send_message(pid \\ __MODULE__, message, opts \\ []) when is_binary(message) do
100-
GenServer.call(pid, {:send, message, opts})
102+
timeout = Keyword.get(opts, :timeout, @default_timeout)
103+
GenServer.call(pid, {:send, message, opts}, timeout)
101104
end
102105

103106
@impl Transport

lib/hermes/transport/websocket.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ if Code.ensure_loaded?(:gun) do
8181
end
8282

8383
@impl Transport
84-
def send_message(pid, message) when is_binary(message) do
84+
def send_message(pid, message, _opts \\ []) when is_binary(message) do
8585
GenServer.call(pid, {:send, message})
8686
end
8787

0 commit comments

Comments
 (0)