@@ -12,7 +12,7 @@ if Code.ensure_loaded?(Plug) do
12
12
13
13
## SSE Streaming Architecture
14
14
15
- This Plug handles SSE streaming by keeping the request process alive
15
+ This Plug handles SSE streaming by keeping the request process alive
16
16
and managing the streaming loop for server-to-client communication.
17
17
18
18
## Usage in Phoenix Router
@@ -81,8 +81,9 @@ if Code.ensure_loaded?(Plug) do
81
81
transport = registry . transport ( server , :streamable_http )
82
82
session_header = Keyword . get ( opts , :session_header , @ default_session_header )
83
83
timeout = Keyword . get ( opts , :timeout , @ default_timeout )
84
+ call_timeout = Keyword . get ( opts , :call_timeout , @ default_timeout )
84
85
85
- % { transport: transport , session_header: session_header , timeout: timeout }
86
+ % { transport: transport , session_header: session_header , timeout: timeout , call_timeout: call_timeout }
86
87
end
87
88
88
89
@ impl Plug
@@ -97,11 +98,11 @@ if Code.ensure_loaded?(Plug) do
97
98
98
99
# GET request handler - establishes SSE connection
99
100
100
- defp handle_get ( conn , % { transport: transport , session_header: session_header } ) do
101
+ defp handle_get ( conn , % { transport: transport , session_header: session_header , call_timeout: call_timeout } ) do
101
102
if wants_sse? ( conn ) do
102
103
session_id = get_or_create_session_id ( conn , session_header )
103
104
104
- case StreamableHTTP . register_sse_handler ( transport , session_id ) do
105
+ case StreamableHTTP . register_sse_handler ( transport , session_id , call_timeout: call_timeout ) do
105
106
:ok ->
106
107
start_sse_streaming ( conn , transport , session_id , session_header )
107
108
@@ -129,7 +130,7 @@ if Code.ensure_loaded?(Plug) do
129
130
session_id: session_id
130
131
} )
131
132
132
- process_message ( message , conn , transport , session_id , context , session_header )
133
+ process_message ( message , conn , transport , session_id , context , session_header , opts . call_timeout )
133
134
else
134
135
{ :error , :invalid_accept_header } ->
135
136
send_error (
@@ -156,20 +157,22 @@ if Code.ensure_loaded?(Plug) do
156
157
end
157
158
end
158
159
159
- defp process_message ( message , conn , transport , session_id , context , session_header ) when is_map ( message ) do
160
+ defp process_message ( message , conn , transport , session_id , context , session_header , call_timeout )
161
+ when is_map ( message ) do
160
162
if Message . is_request ( message ) do
161
163
handle_request_with_possible_sse (
162
164
conn ,
163
165
transport ,
164
166
session_id ,
165
167
message ,
166
168
context ,
167
- session_header
169
+ session_header ,
170
+ call_timeout
168
171
)
169
172
else
170
173
# Notification
171
174
transport
172
- |> StreamableHTTP . handle_message ( session_id , message , context )
175
+ |> StreamableHTTP . handle_message ( session_id , message , context , call_timeout: call_timeout )
173
176
|> format_notification_response ( conn )
174
177
end
175
178
end
@@ -212,15 +215,16 @@ if Code.ensure_loaded?(Plug) do
212
215
213
216
# Handle requests that might need SSE streaming
214
217
215
- defp handle_request_with_possible_sse ( conn , transport , session_id , body , context , session_header ) do
218
+ defp handle_request_with_possible_sse ( conn , transport , session_id , body , context , session_header , call_timeout ) do
216
219
if wants_sse? ( conn ) do
217
220
handle_sse_request (
218
221
conn ,
219
222
transport ,
220
223
session_id ,
221
224
body ,
222
225
context ,
223
- session_header
226
+ session_header ,
227
+ call_timeout
224
228
)
225
229
else
226
230
handle_json_request (
@@ -229,17 +233,19 @@ if Code.ensure_loaded?(Plug) do
229
233
session_id ,
230
234
body ,
231
235
context ,
232
- session_header
236
+ session_header ,
237
+ call_timeout
233
238
)
234
239
end
235
240
end
236
241
237
- defp handle_sse_request ( conn , transport , session_id , body , context , session_header ) do
242
+ defp handle_sse_request ( conn , transport , session_id , body , context , session_header , call_timeout ) do
238
243
case StreamableHTTP . handle_message_for_sse (
239
244
transport ,
240
245
session_id ,
241
246
body ,
242
- context
247
+ context ,
248
+ call_timeout: call_timeout
243
249
) do
244
250
{ :sse , response } ->
245
251
route_sse_response (
@@ -249,7 +255,8 @@ if Code.ensure_loaded?(Plug) do
249
255
response ,
250
256
body ,
251
257
context ,
252
- session_header
258
+ session_header ,
259
+ call_timeout
253
260
)
254
261
255
262
{ :ok , response } ->
@@ -263,8 +270,8 @@ if Code.ensure_loaded?(Plug) do
263
270
end
264
271
end
265
272
266
- defp handle_json_request ( conn , transport , session_id , body , context , session_header ) do
267
- case StreamableHTTP . handle_message ( transport , session_id , body , context ) do
273
+ defp handle_json_request ( conn , transport , session_id , body , context , session_header , call_timeout ) do
274
+ case StreamableHTTP . handle_message ( transport , session_id , body , context , call_timeout: call_timeout ) do
268
275
{ :ok , response } ->
269
276
conn
270
277
|> put_resp_content_type ( "application/json" )
@@ -276,8 +283,8 @@ if Code.ensure_loaded?(Plug) do
276
283
end
277
284
end
278
285
279
- defp route_sse_response ( conn , transport , session_id , response , body , context , session_header ) do
280
- if handler_pid = StreamableHTTP . get_sse_handler ( transport , session_id ) do
286
+ defp route_sse_response ( conn , transport , session_id , response , body , context , session_header , call_timeout ) do
287
+ if handler_pid = StreamableHTTP . get_sse_handler ( transport , session_id , call_timeout: call_timeout ) do
281
288
send ( handler_pid , { :sse_message , response } )
282
289
283
290
conn
@@ -290,7 +297,8 @@ if Code.ensure_loaded?(Plug) do
290
297
session_id ,
291
298
body ,
292
299
context ,
293
- session_header
300
+ session_header ,
301
+ call_timeout
294
302
)
295
303
end
296
304
end
@@ -309,10 +317,10 @@ if Code.ensure_loaded?(Plug) do
309
317
)
310
318
end
311
319
312
- defp establish_sse_for_request ( conn , transport , session_id , body , context , session_header ) do
313
- case StreamableHTTP . register_sse_handler ( transport , session_id ) do
320
+ defp establish_sse_for_request ( conn , transport , session_id , body , context , session_header , call_timeout ) do
321
+ case StreamableHTTP . register_sse_handler ( transport , session_id , call_timeout: call_timeout ) do
314
322
:ok ->
315
- start_background_request ( transport , session_id , body , context )
323
+ start_background_request ( transport , session_id , body , context , call_timeout )
316
324
start_sse_streaming ( conn , transport , session_id , session_header )
317
325
318
326
{ :error , reason } ->
@@ -326,11 +334,11 @@ if Code.ensure_loaded?(Plug) do
326
334
end
327
335
end
328
336
329
- defp start_background_request ( transport , session_id , body , context ) do
337
+ defp start_background_request ( transport , session_id , body , context , call_timeout ) do
330
338
self_pid = self ( )
331
339
332
340
Task . start ( fn ->
333
- case StreamableHTTP . handle_message ( transport , session_id , body , context ) do
341
+ case StreamableHTTP . handle_message ( transport , session_id , body , context , call_timeout: call_timeout ) do
334
342
{ :ok , response } when is_binary ( response ) ->
335
343
send ( self_pid , { :sse_message , response } )
336
344
0 commit comments