@@ -256,17 +256,29 @@ async fn reply<N: PublishClient + FlushClient, T: serde::Serialize>(
256256 nats : & N ,
257257 reply_to : & str ,
258258 value : & T ,
259+ req_id : Option < & str > ,
259260) -> Result < ( ) , DispatchError > {
260- trogon_nats:: publish (
261- nats,
262- reply_to,
263- value,
264- trogon_nats:: PublishOptions :: builder ( )
265- . flush_policy ( trogon_nats:: FlushPolicy :: standard ( ) )
266- . build ( ) ,
267- )
268- . await
269- . map_err ( DispatchError :: Reply )
261+ let mut headers = trogon_nats:: headers_with_trace_context ( ) ;
262+ if let Some ( id) = req_id {
263+ headers. insert ( trogon_nats:: REQ_ID_HEADER , id) ;
264+ }
265+
266+ let payload = serde_json:: to_vec ( value)
267+ . map_err ( |e| DispatchError :: Reply ( trogon_nats:: NatsError :: Serialize ( e) ) ) ?;
268+
269+ nats. publish_with_headers ( reply_to. to_string ( ) , headers, payload. into ( ) )
270+ . await
271+ . map_err ( |e| {
272+ DispatchError :: Reply ( trogon_nats:: NatsError :: PublishOperation (
273+ trogon_nats:: PublishOperationError ( e. to_string ( ) ) ,
274+ ) )
275+ } ) ?;
276+
277+ nats. flush ( ) . await . map_err ( |e| {
278+ DispatchError :: Reply ( trogon_nats:: NatsError :: PublishOperation (
279+ trogon_nats:: PublishOperationError ( e. to_string ( ) ) ,
280+ ) )
281+ } )
270282}
271283
272284async fn handle_request < N , Resp , ReqT , F > (
@@ -281,6 +293,7 @@ where
281293 Resp : serde:: Serialize ,
282294{
283295 let reply_to = msg. reply . as_deref ( ) . ok_or ( DispatchError :: NoReplySubject ) ?;
296+ let req_id = trogon_nats:: extract_req_id ( msg. headers . as_ref ( ) ) ;
284297
285298 let request: ReqT = match serde_json:: from_slice ( & msg. payload ) {
286299 Ok ( req) => req,
@@ -289,14 +302,14 @@ where
289302 agent_client_protocol:: ErrorCode :: InvalidParams . into ( ) ,
290303 format ! ( "Failed to deserialize request: {}" , e) ,
291304 ) ;
292- let _ = reply ( nats, reply_to, & error) . await ;
305+ let _ = reply ( nats, reply_to, & error, req_id ) . await ;
293306 return Err ( DispatchError :: DeserializeRequest ( e) ) ;
294307 }
295308 } ;
296309
297310 match handler ( request) . await {
298- Ok ( resp) => reply ( nats, reply_to, & resp) . await ,
299- Err ( err) => reply ( nats, reply_to, & err) . await ,
311+ Ok ( resp) => reply ( nats, reply_to, & resp, req_id ) . await ,
312+ Err ( err) => reply ( nats, reply_to, & err, req_id ) . await ,
300313 }
301314}
302315
0 commit comments