@@ -296,12 +296,8 @@ pub enum SessionError {
296296 SessionServiceTerminated ,
297297 #[ error( "Invalid event id" ) ]
298298 InvalidEventId ,
299- #[ error( "Transport closed" ) ]
300- TransportClosed ,
301299 #[ error( "IO error: {0}" ) ]
302300 Io ( #[ from] std:: io:: Error ) ,
303- #[ error( "Tokio join error {0}" ) ]
304- TokioJoinError ( #[ from] tokio:: task:: JoinError ) ,
305301}
306302
307303impl From < SessionError > for std:: io:: Error {
@@ -317,7 +313,7 @@ enum OutboundChannel {
317313 RequestWise { id : HttpRequestId , close : bool } ,
318314 Common ,
319315}
320-
316+ # [ derive ( Debug ) ]
321317pub struct StreamableHttpMessageReceiver {
322318 pub http_request_id : Option < HttpRequestId > ,
323319 pub inner : Receiver < ServerSseMessage > ,
@@ -534,8 +530,8 @@ impl LocalSessionWorker {
534530 }
535531 }
536532}
537-
538- enum SessionEvent {
533+ # [ derive ( Debug ) ]
534+ pub enum SessionEvent {
539535 ClientMessage {
540536 message : ClientJsonRpcMessage ,
541537 http_request_id : Option < HttpRequestId > ,
@@ -695,14 +691,31 @@ impl LocalSessionHandle {
695691
696692pub type SessionTransport = WorkerTransport < LocalSessionWorker > ;
697693
694+ #[ derive( Debug , Error ) ]
695+ pub enum LocalSessionWorkerError {
696+ #[ error( "transport terminated" ) ]
697+ TransportTerminated ,
698+ #[ error( "unexpected message: {0:?}" ) ]
699+ UnexpectedEvent ( SessionEvent ) ,
700+ #[ error( "fail to send initialize request {0}" ) ]
701+ FailToSendInitializeRequest ( SessionError ) ,
702+ #[ error( "fail to handle message: {0}" ) ]
703+ FailToHandleMessage ( SessionError ) ,
704+ #[ error( "keep alive timeout after {}ms" , _0. as_millis( ) ) ]
705+ KeepAliveTimeout ( Duration ) ,
706+ #[ error( "Transport closed" ) ]
707+ TransportClosed ,
708+ #[ error( "Tokio join error {0}" ) ]
709+ TokioJoinError ( #[ from] tokio:: task:: JoinError ) ,
710+ }
698711impl Worker for LocalSessionWorker {
699- type Error = SessionError ;
712+ type Error = LocalSessionWorkerError ;
700713 type Role = RoleServer ;
701714 fn err_closed ( ) -> Self :: Error {
702- SessionError :: TransportClosed
715+ LocalSessionWorkerError :: TransportClosed
703716 }
704717 fn err_join ( e : tokio:: task:: JoinError ) -> Self :: Error {
705- SessionError :: TokioJoinError ( e)
718+ LocalSessionWorkerError :: TokioJoinError ( e)
706719 }
707720 fn config ( & self ) -> crate :: transport:: worker:: WorkerConfig {
708721 crate :: transport:: worker:: WorkerConfig {
@@ -711,18 +724,24 @@ impl Worker for LocalSessionWorker {
711724 }
712725 }
713726 #[ instrument( name = "streamable_http_session" , skip_all, fields( id = self . id. as_ref( ) ) ) ]
714- async fn run ( mut self , mut context : WorkerContext < Self > ) -> Result < ( ) , WorkerQuitReason > {
727+ async fn run (
728+ mut self ,
729+ mut context : WorkerContext < Self > ,
730+ ) -> Result < ( ) , WorkerQuitReason < Self :: Error > > {
715731 enum InnerEvent {
716732 FromHttpService ( SessionEvent ) ,
717733 FromHandler ( WorkerSendRequest < LocalSessionWorker > ) ,
718734 }
719735 // waiting for initialize request
720736 let evt = self . event_rx . recv ( ) . await . ok_or_else ( || {
721- WorkerQuitReason :: fatal ( "transport terminated" , "get initialize request" )
737+ WorkerQuitReason :: fatal (
738+ LocalSessionWorkerError :: TransportTerminated ,
739+ "get initialize request" ,
740+ )
722741 } ) ?;
723742 let SessionEvent :: InitializeRequest { request, responder } = evt else {
724743 return Err ( WorkerQuitReason :: fatal (
725- "unexpected message" ,
744+ LocalSessionWorkerError :: UnexpectedEvent ( evt ) ,
726745 "get initialize request" ,
727746 ) ) ;
728747 } ;
@@ -732,7 +751,9 @@ impl Worker for LocalSessionWorker {
732751 . send ( Ok ( send_initialize_response. message ) )
733752 . map_err ( |_| {
734753 WorkerQuitReason :: fatal (
735- "failed to send initialize response to http service" ,
754+ LocalSessionWorkerError :: FailToSendInitializeRequest (
755+ SessionError :: SessionServiceTerminated ,
756+ ) ,
736757 "send initialize response" ,
737758 )
738759 } ) ?;
@@ -749,7 +770,7 @@ impl Worker for LocalSessionWorker {
749770 if let Some ( event) = event {
750771 InnerEvent :: FromHttpService ( event)
751772 } else {
752- return Err ( WorkerQuitReason :: fatal( "session dropped" , "waiting next session event" ) )
773+ return Err ( WorkerQuitReason :: fatal( LocalSessionWorkerError :: TransportTerminated , "waiting next session event" ) )
753774 }
754775 } ,
755776 from_handler = context. recv_from_handler( ) => {
@@ -759,7 +780,7 @@ impl Worker for LocalSessionWorker {
759780 return Err ( WorkerQuitReason :: Cancelled )
760781 }
761782 _ = keep_alive_timeout => {
762- return Err ( WorkerQuitReason :: fatal( "keep live timeout" , "poll next session event" ) )
783+ return Err ( WorkerQuitReason :: fatal( LocalSessionWorkerError :: KeepAliveTimeout ( keep_alive ) , "poll next session event" ) )
763784 }
764785 } ;
765786 match event {
@@ -779,7 +800,10 @@ impl Worker for LocalSessionWorker {
779800 // no need to unregister resource
780801 }
781802 } ;
782- let handle_result = self . handle_server_message ( message) . await ;
803+ let handle_result = self
804+ . handle_server_message ( message)
805+ . await
806+ . map_err ( LocalSessionWorkerError :: FailToHandleMessage ) ;
783807 let _ = responder. send ( handle_result) . inspect_err ( |error| {
784808 tracing:: warn!( ?error, "failed to send message to http service handler" ) ;
785809 } ) ;
0 commit comments