@@ -211,6 +211,7 @@ impl<C: StreamableHttpClient> StreamableHttpClientWorker<C> {
211
211
+ Send
212
212
+ ' static ,
213
213
sse_worker_tx : tokio:: sync:: mpsc:: Sender < ServerJsonRpcMessage > ,
214
+ close_on_response : bool ,
214
215
ct : CancellationToken ,
215
216
) -> Result < ( ) , StreamableHttpError < C :: Error > > {
216
217
let mut sse_stream = std:: pin:: pin!( sse_stream) ;
@@ -227,12 +228,16 @@ impl<C: StreamableHttpClient> StreamableHttpClientWorker<C> {
227
228
let Some ( message) = message. transpose ( ) ? else {
228
229
break ;
229
230
} ;
230
-
231
+ let is_response = matches ! ( message , ServerJsonRpcMessage :: Response ( _ ) ) ;
231
232
let yield_result = sse_worker_tx. send ( message) . await ;
232
233
if yield_result. is_err ( ) {
233
234
tracing:: trace!( "streamable http transport worker dropped, exiting" ) ;
234
235
break ;
235
236
}
237
+ if close_on_response && is_response {
238
+ tracing:: debug!( "got response, closing sse stream" ) ;
239
+ break ;
240
+ }
236
241
}
237
242
Ok ( ( ) )
238
243
}
@@ -363,6 +368,7 @@ impl<C: StreamableHttpClient> Worker for StreamableHttpClientWorker<C> {
363
368
streams. spawn ( Self :: execute_sse_stream (
364
369
sse_stream,
365
370
sse_worker_tx. clone ( ) ,
371
+ false ,
366
372
transport_task_ct. child_token ( ) ,
367
373
) ) ;
368
374
tracing:: debug!( "got common stream" ) ;
@@ -439,6 +445,7 @@ impl<C: StreamableHttpClient> Worker for StreamableHttpClientWorker<C> {
439
445
streams. spawn ( Self :: execute_sse_stream (
440
446
sse_stream,
441
447
sse_worker_tx. clone ( ) ,
448
+ true ,
442
449
transport_task_ct. child_token ( ) ,
443
450
) ) ;
444
451
} else {
@@ -449,6 +456,7 @@ impl<C: StreamableHttpClient> Worker for StreamableHttpClientWorker<C> {
449
456
streams. spawn ( Self :: execute_sse_stream (
450
457
sse_stream,
451
458
sse_worker_tx. clone ( ) ,
459
+ true ,
452
460
transport_task_ct. child_token ( ) ,
453
461
) ) ;
454
462
}
0 commit comments