@@ -36,8 +36,10 @@ use tracing::instrument;
36
36
pub enum ServiceError {
37
37
#[ error( "Mcp error: {0}" ) ]
38
38
McpError ( McpError ) ,
39
- #[ error( "Transport error: {0}" ) ]
40
- Transport ( std:: io:: Error ) ,
39
+ #[ error( "Transport send error: {0}" ) ]
40
+ TransportSend ( Box < dyn std:: error:: Error + Send + Sync > ) ,
41
+ #[ error( "Transport closed" ) ]
42
+ TransportClosed ,
41
43
#[ error( "Unexpected response type" ) ]
42
44
UnexpectedResponse ,
43
45
#[ error( "task cancelled for reason {}" , reason. as_deref( ) . unwrap_or( "<unknown>" ) ) ]
@@ -98,8 +100,6 @@ pub trait Service<R: ServiceRole>: Send + Sync + 'static {
98
100
& self ,
99
101
notification : R :: PeerNot ,
100
102
) -> impl Future < Output = Result < ( ) , McpError > > + Send + ' _ ;
101
- fn get_peer ( & self ) -> Option < Peer < R > > ;
102
- fn set_peer ( & mut self , peer : Peer < R > ) ;
103
103
fn get_info ( & self ) -> R :: Info ;
104
104
}
105
105
@@ -148,14 +148,6 @@ impl<R: ServiceRole> Service<R> for Box<dyn DynService<R>> {
148
148
DynService :: handle_notification ( self . as_ref ( ) , notification)
149
149
}
150
150
151
- fn get_peer ( & self ) -> Option < Peer < R > > {
152
- DynService :: get_peer ( self . as_ref ( ) )
153
- }
154
-
155
- fn set_peer ( & mut self , peer : Peer < R > ) {
156
- DynService :: set_peer ( self . as_mut ( ) , peer)
157
- }
158
-
159
151
fn get_info ( & self ) -> R :: Info {
160
152
DynService :: get_info ( self . as_ref ( ) )
161
153
}
@@ -168,8 +160,6 @@ pub trait DynService<R: ServiceRole>: Send + Sync {
168
160
context : RequestContext < R > ,
169
161
) -> BoxFuture < Result < R :: Resp , McpError > > ;
170
162
fn handle_notification ( & self , notification : R :: PeerNot ) -> BoxFuture < Result < ( ) , McpError > > ;
171
- fn get_peer ( & self ) -> Option < Peer < R > > ;
172
- fn set_peer ( & mut self , peer : Peer < R > ) ;
173
163
fn get_info ( & self ) -> R :: Info ;
174
164
}
175
165
@@ -184,12 +174,6 @@ impl<R: ServiceRole, S: Service<R>> DynService<R> for S {
184
174
fn handle_notification ( & self , notification : R :: PeerNot ) -> BoxFuture < Result < ( ) , McpError > > {
185
175
Box :: pin ( self . handle_notification ( notification) )
186
176
}
187
- fn get_peer ( & self ) -> Option < Peer < R > > {
188
- self . get_peer ( )
189
- }
190
- fn set_peer ( & mut self , peer : Peer < R > ) {
191
- self . set_peer ( peer)
192
- }
193
177
fn get_info ( & self ) -> R :: Info {
194
178
self . get_info ( )
195
179
}
@@ -255,9 +239,7 @@ impl<R: ServiceRole> RequestHandle<R> {
255
239
pub async fn await_response ( self ) -> Result < R :: PeerResp , ServiceError > {
256
240
if let Some ( timeout) = self . options . timeout {
257
241
let timeout_result = tokio:: time:: timeout ( timeout, async move {
258
- self . rx
259
- . await
260
- . map_err ( |_e| ServiceError :: Transport ( std:: io:: Error :: other ( "disconnected" ) ) ) ?
242
+ self . rx . await . map_err ( |_e| ServiceError :: TransportClosed ) ?
261
243
} )
262
244
. await ;
263
245
match timeout_result {
@@ -278,9 +260,7 @@ impl<R: ServiceRole> RequestHandle<R> {
278
260
}
279
261
}
280
262
} else {
281
- self . rx
282
- . await
283
- . map_err ( |_e| ServiceError :: Transport ( std:: io:: Error :: other ( "disconnected" ) ) ) ?
263
+ self . rx . await . map_err ( |_e| ServiceError :: TransportClosed ) ?
284
264
}
285
265
}
286
266
@@ -373,12 +353,8 @@ impl<R: ServiceRole> Peer<R> {
373
353
responder,
374
354
} )
375
355
. await
376
- . map_err ( |_m| {
377
- ServiceError :: Transport ( std:: io:: Error :: other ( "disconnected: receiver dropped" ) )
378
- } ) ?;
379
- receiver. await . map_err ( |_e| {
380
- ServiceError :: Transport ( std:: io:: Error :: other ( "disconnected: responder dropped" ) )
381
- } ) ?
356
+ . map_err ( |_m| ServiceError :: TransportClosed ) ?;
357
+ receiver. await . map_err ( |_e| ServiceError :: TransportClosed ) ?
382
358
}
383
359
pub async fn send_request ( & self , request : R :: Req ) -> Result < R :: PeerResp , ServiceError > {
384
360
self . send_request_with_option ( request, PeerRequestOptions :: no_options ( ) )
@@ -416,7 +392,7 @@ impl<R: ServiceRole> Peer<R> {
416
392
responder,
417
393
} )
418
394
. await
419
- . map_err ( |_m| ServiceError :: Transport ( std :: io :: Error :: other ( "disconnected" ) ) ) ?;
395
+ . map_err ( |_m| ServiceError :: TransportClosed ) ?;
420
396
Ok ( RequestHandle {
421
397
id,
422
398
rx : receiver,
@@ -428,6 +404,10 @@ impl<R: ServiceRole> Peer<R> {
428
404
pub fn peer_info ( & self ) -> & R :: PeerInfo {
429
405
& self . info
430
406
}
407
+
408
+ pub fn is_transport_closed ( & self ) -> bool {
409
+ self . tx . is_closed ( )
410
+ }
431
411
}
432
412
433
413
#[ derive( Debug ) ]
@@ -518,7 +498,7 @@ where
518
498
519
499
#[ instrument( skip_all) ]
520
500
async fn serve_inner < R , S , T , E , A > (
521
- mut service : S ,
501
+ service : S ,
522
502
transport : T ,
523
503
peer : Peer < R > ,
524
504
mut peer_rx : tokio:: sync:: mpsc:: Receiver < PeerSinkMessage < R > > ,
@@ -540,7 +520,6 @@ where
540
520
tracing:: info!( ?peer_info, "Service initialized as server" ) ;
541
521
}
542
522
543
- service. set_peer ( peer. clone ( ) ) ;
544
523
let mut local_responder_pool =
545
524
HashMap :: < RequestId , Responder < Result < R :: PeerResp , ServiceError > > > :: new ( ) ;
546
525
let mut local_ct_pool = HashMap :: < RequestId , CancellationToken > :: new ( ) ;
@@ -631,8 +610,7 @@ where
631
610
Event :: SendTaskResult ( SendTaskResult :: Request { id, result } ) => {
632
611
if let Err ( e) = result {
633
612
if let Some ( responder) = local_responder_pool. remove ( & id) {
634
- let _ = responder
635
- . send ( Err ( ServiceError :: Transport ( std:: io:: Error :: other ( e) ) ) ) ;
613
+ let _ = responder. send ( Err ( ServiceError :: TransportSend ( Box :: new ( e) ) ) ) ;
636
614
}
637
615
}
638
616
}
@@ -642,7 +620,7 @@ where
642
620
cancellation_param,
643
621
} ) => {
644
622
let response = if let Err ( e) = result {
645
- Err ( ServiceError :: Transport ( std :: io :: Error :: other ( e) ) )
623
+ Err ( ServiceError :: TransportSend ( Box :: new ( e) ) )
646
624
} else {
647
625
Ok ( ( ) )
648
626
} ;
0 commit comments