11use async_trait:: async_trait;
22use strata_primitives:: prelude:: * ;
3- use strata_service:: { CommandHandle , ServiceMonitor } ;
3+ use strata_service:: { CommandHandle , ServiceError , ServiceMonitor } ;
44use strata_state:: BlockSubmitter ;
5- use tracing:: warn;
65
7- use crate :: AsmWorkerStatus ;
6+ use crate :: { AsmWorkerStatus , WorkerError , message :: AsmWorkerMessage } ;
87
98/// Handle for interacting with the ASM worker service.
109#[ derive( Debug ) ]
1110pub struct AsmWorkerHandle {
12- command_handle : CommandHandle < L1BlockCommitment > ,
11+ command_handle : CommandHandle < AsmWorkerMessage > ,
1312 monitor : ServiceMonitor < AsmWorkerStatus > ,
1413}
1514
1615impl AsmWorkerHandle {
1716 /// Create a new ASM worker handle from a service command handle.
1817 pub fn new (
19- command_handle : CommandHandle < L1BlockCommitment > ,
18+ command_handle : CommandHandle < AsmWorkerMessage > ,
2019 monitor : ServiceMonitor < AsmWorkerStatus > ,
2120 ) -> Self {
2221 Self {
@@ -31,25 +30,45 @@ impl AsmWorkerHandle {
3130 pub fn monitor ( & self ) -> & ServiceMonitor < AsmWorkerStatus > {
3231 & self . monitor
3332 }
33+
34+ /// Returns the number of pending inputs that have not been processed yet.
35+ pub fn pending ( & self ) -> usize {
36+ self . command_handle . pending ( )
37+ }
3438}
3539
3640#[ async_trait]
3741impl BlockSubmitter for AsmWorkerHandle {
38- /// Sends a new l1 block to the ASM service.
42+ /// Sends an L1 block to the ASM service and waits for processing to complete .
3943 fn submit_block ( & self , block : L1BlockCommitment ) -> anyhow:: Result < ( ) > {
40- if self . command_handle . send_blocking ( block) . is_err ( ) {
41- warn ! ( %block, "ASM handle closed when submitting" ) ;
42- }
43-
44- Ok ( ( ) )
44+ self . command_handle
45+ . send_and_wait_blocking ( |completion| AsmWorkerMessage :: SubmitBlock ( block, completion) )
46+ . map_err ( convert_service_error) ?
47+ . map_err ( Into :: into)
4548 }
4649
47- /// Sends a new l1 block to the ASM service.
50+ /// Sends an L1 block to the ASM service and waits for processing to complete .
4851 async fn submit_block_async ( & self , block : L1BlockCommitment ) -> anyhow:: Result < ( ) > {
49- if self . command_handle . send ( block) . await . is_err ( ) {
50- warn ! ( %block, "ASM handle closed when submitting" ) ;
51- }
52+ self . command_handle
53+ . send_and_wait ( |completion| AsmWorkerMessage :: SubmitBlock ( block, completion) )
54+ . await
55+ . map_err ( convert_service_error) ?
56+ . map_err ( Into :: into)
57+ }
58+ }
5259
53- Ok ( ( ) )
60+ /// Convert service framework errors to worker errors.
61+ fn convert_service_error ( err : ServiceError ) -> WorkerError {
62+ match err {
63+ ServiceError :: WorkerExited | ServiceError :: WorkerExitedWithoutResponse => {
64+ WorkerError :: WorkerExited
65+ }
66+ ServiceError :: WaitCancelled => {
67+ WorkerError :: Unexpected ( "operation was cancelled" . to_string ( ) )
68+ }
69+ ServiceError :: BlockingThreadPanic ( msg) => {
70+ WorkerError :: Unexpected ( format ! ( "blocking thread panicked: {msg}" ) )
71+ }
72+ ServiceError :: UnknownInputErr => WorkerError :: Unexpected ( "unknown input error" . to_string ( ) ) ,
5473 }
5574}
0 commit comments