@@ -86,16 +86,32 @@ impl<D: EventDispatcher<RelayerEvent> + HandlerRegistry<RelayerEvent>> InputProo
8686 info ! ( "Validated and assigned request id: {}" , request_id) ;
8787
8888 // Register once handlers for receiving the decryption response from the gateway
89- let ( handler, rx) : ( OnceHandler < RelayerEvent > , oneshot:: Receiver < RelayerEvent > ) =
90- OnceHandler :: new ( ) ;
91- let handler = Arc :: new ( handler) ;
89+ let ( gateway_response_handler, gateway_response_rx) : (
90+ OnceHandler < RelayerEvent > ,
91+ oneshot:: Receiver < RelayerEvent > ,
92+ ) = OnceHandler :: new ( ) ;
93+ let gateway_response_handler = Arc :: new ( gateway_response_handler) ;
9294
9395 self . orchestrator . register_once_handler (
9496 InputProofEventId :: RespRcvdFromGw . into ( ) ,
9597 request_id,
96- handler ,
98+ gateway_response_handler ,
9799 ) ;
98- info ! ( "Registered once handler" ) ;
100+ info ! ( "Registered once handler for handling input proof gateway response" ) ;
101+
102+ // Register once handlers for receiving the decryption response from the gateway
103+ let ( error_handler, error_rx) : (
104+ OnceHandler < RelayerEvent > ,
105+ oneshot:: Receiver < RelayerEvent > ,
106+ ) = OnceHandler :: new ( ) ;
107+ let error_handler = Arc :: new ( error_handler) ;
108+
109+ self . orchestrator . register_once_handler (
110+ InputProofEventId :: Failed . into ( ) ,
111+ request_id,
112+ error_handler,
113+ ) ;
114+ info ! ( "Registered once handler for handling input proof failure" ) ;
99115
100116 let request_data: InputProofRequest = match payload. try_into ( ) {
101117 Ok ( event_data) => event_data,
@@ -115,51 +131,77 @@ impl<D: EventDispatcher<RelayerEvent> + HandlerRegistry<RelayerEvent>> InputProo
115131 ) ;
116132 let _ = self . orchestrator . dispatch_event ( event) . await ;
117133 info ! ( "dispatched event to orchestrator to initiate processing" ) ;
118- let event = {
119- let _waiting_for_response_span =
120- span ! ( Level :: INFO , "waiting-for-response" , request_id = %request_id) ;
121- info ! ( "waiting for reponse event" ) ;
122-
123- // Wait for response on the rx of Onshot channel.
124- match rx. await {
125- Ok ( event) => {
126- info ! ( "received response event" ) ;
127- event
128- }
129- Err ( _) => {
130- info ! ( "received errror while waiting for response event" ) ;
131- let error_response = InputProofErrorResponseJson {
132- message : "Failed to receive response from the gateway." . to_string ( ) ,
133- } ;
134- return ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) )
135- . into_response ( ) ;
136- }
137- }
138- } ;
139134
140- info ! ( "Response event type {:?}" , event. data) ;
141- match event. data {
142- RelayerEventData :: InputProof ( InputProofEventData :: RespRcvdFromGw {
143- input_proof_response,
144- } ) => match InputProofResponseJson :: try_from ( input_proof_response) {
145- Ok ( response_json) => {
146- info ! ( "Sending success reponse to user" ) ;
147- ( StatusCode :: OK , Json ( response_json) ) . into_response ( )
135+ let _waiting_for_response_span =
136+ span ! ( Level :: INFO , "waiting-for-response" , request_id = %request_id) ;
137+ info ! ( "waiting for reponse event" ) ;
138+
139+ // Wait for response or error on the rx of Oneshot channels concurrently.
140+ use futures:: pin_mut;
141+ pin_mut ! ( gateway_response_rx) ;
142+ pin_mut ! ( error_rx) ;
143+
144+ tokio:: select! {
145+ res = & mut gateway_response_rx => {
146+ match res {
147+ Ok ( event) => {
148+ info!( "Response event type {:?}" , event. data) ;
149+ match event. data {
150+ RelayerEventData :: InputProof ( InputProofEventData :: RespRcvdFromGw {
151+ input_proof_response,
152+ } ) => {
153+ match InputProofResponseJson :: try_from( input_proof_response) {
154+ Ok ( response_json) => {
155+ info!( "Sending success response to user" ) ;
156+ ( StatusCode :: OK , Json ( response_json) ) . into_response( )
157+ }
158+ Err ( _) => {
159+ info!( "sending error reponse to user as response event cannot be decoded" ) ;
160+ let error_response = InputProofErrorResponseJson {
161+ message: "request could not be completed 2" . to_string( ) ,
162+ } ;
163+ ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) )
164+ . into_response( )
165+ }
166+ }
167+ }
168+ _ => {
169+ info!(
170+ "sending error reponse to user as response event is not expected type"
171+ ) ;
172+ let error_response = InputProofErrorResponseJson {
173+ message: "request could not be completed 3" . to_string( ) ,
174+ } ;
175+ ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) ) . into_response( )
176+ }
177+ }
178+ }
179+ Err ( _) => {
180+ info!( "received errror while waiting for response event" ) ;
181+ let error_response = InputProofErrorResponseJson {
182+ message: "Failed to receive response from the gateway." . to_string( ) ,
183+ } ;
184+ ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) ) . into_response( )
185+ }
148186 }
149- Err ( _) => {
150- info ! ( "sending error reponse to user as response event cannot be decoded" ) ;
151- let error_response = InputProofErrorResponseJson {
152- message : "request could not be completed 2" . to_string ( ) ,
153- } ;
154- ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) ) . into_response ( )
187+ }
188+ res = & mut error_rx => {
189+ match res {
190+ Ok ( _event) => {
191+ info!( "received error event on error_rx" ) ;
192+ let error_response = InputProofErrorResponseJson {
193+ message: "REQUEST FAILED RESPONSE" . to_string( ) ,
194+ } ;
195+ ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) ) . into_response( )
196+ }
197+ Err ( _) => {
198+ info!( "received error while waiting for error event on error_rx" ) ;
199+ let error_response = InputProofErrorResponseJson {
200+ message: "Failed to receive error response from the gateway." . to_string( ) ,
201+ } ;
202+ ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) ) . into_response( )
203+ }
155204 }
156- } ,
157- _ => {
158- info ! ( "sending error reponse to user as response event is not expected type" ) ;
159- let error_response = InputProofErrorResponseJson {
160- message : "request could not be completed 3" . to_string ( ) ,
161- } ;
162- ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( error_response) ) . into_response ( )
163205 }
164206 }
165207 }
0 commit comments