@@ -305,21 +305,18 @@ impl<T: SignerEventTrait> EventReceiver<T> for SignerEventReceiver<T> {
305
305
& request. method( ) ,
306
306
) ) ) ;
307
307
}
308
+ debug ! ( "Processing {} event" , request. url( ) ) ;
308
309
if request. url ( ) == "/stackerdb_chunks" {
309
- process_stackerdb_event ( event_receiver. local_addr , request)
310
- . map_err ( |e| {
311
- error ! ( "Error processing stackerdb_chunks message" ; "err" => ?e) ;
312
- e
313
- } )
310
+ process_event :: < T , StackerDBChunksEvent > ( request)
314
311
} else if request. url ( ) == "/proposal_response" {
315
- process_proposal_response ( request)
312
+ process_event :: < T , BlockValidateResponse > ( request)
316
313
} else if request. url ( ) == "/new_burn_block" {
317
- process_new_burn_block_event ( request)
314
+ process_event :: < T , BurnBlockEvent > ( request)
318
315
} else if request. url ( ) == "/shutdown" {
319
316
event_receiver. stop_signal . store ( true , Ordering :: SeqCst ) ;
320
- return Err ( EventError :: Terminated ) ;
317
+ Err ( EventError :: Terminated )
321
318
} else if request. url ( ) == "/new_block" {
322
- process_new_block ( request)
319
+ process_event :: < T , BlockEvent > ( request)
323
320
} else {
324
321
let url = request. url ( ) . to_string ( ) ;
325
322
debug ! (
@@ -391,12 +388,13 @@ fn ack_dispatcher(request: HttpRequest) {
391
388
392
389
// TODO: add tests from mutation testing results #4835
393
390
#[ cfg_attr( test, mutants:: skip) ]
394
- /// Process a stackerdb event from the node
395
- fn process_stackerdb_event < T : SignerEventTrait > (
396
- local_addr : Option < SocketAddr > ,
397
- mut request : HttpRequest ,
398
- ) -> Result < SignerEvent < T > , EventError > {
391
+ fn process_event < T , E > ( mut request : HttpRequest ) -> Result < SignerEvent < T > , EventError >
392
+ where
393
+ T : SignerEventTrait ,
394
+ E : serde :: de :: DeserializeOwned + TryInto < SignerEvent < T > , Error = EventError > ,
395
+ {
399
396
let mut body = String :: new ( ) ;
397
+
400
398
if let Err ( e) = request. as_reader ( ) . read_to_string ( & mut body) {
401
399
error ! ( "Failed to read body: {:?}" , & e) ;
402
400
ack_dispatcher ( request) ;
@@ -405,27 +403,12 @@ fn process_stackerdb_event<T: SignerEventTrait>(
405
403
& e
406
404
) ) ) ;
407
405
}
408
-
409
- debug ! ( "Got stackerdb_chunks event" ; "chunks_event_body" => %body ) ;
410
- let event : StackerDBChunksEvent = serde_json:: from_slice ( body. as_bytes ( ) )
406
+ // Regardless of whether we successfully deserialize, we should ack the dispatcher so they don't keep resending it
407
+ ack_dispatcher ( request ) ;
408
+ let json_event : E = serde_json:: from_slice ( body. as_bytes ( ) )
411
409
. map_err ( |e| EventError :: Deserialize ( format ! ( "Could not decode body to JSON: {:?}" , & e) ) ) ?;
412
410
413
- let event_contract_id = event. contract_id . clone ( ) ;
414
-
415
- let signer_event = match SignerEvent :: try_from ( event) {
416
- Err ( e) => {
417
- info ! (
418
- "[{:?}] next_event got event from an unexpected contract id {}, return OK so other side doesn't keep sending this" ,
419
- local_addr,
420
- event_contract_id
421
- ) ;
422
- ack_dispatcher ( request) ;
423
- return Err ( e) ;
424
- }
425
- Ok ( x) => x,
426
- } ;
427
-
428
- ack_dispatcher ( request) ;
411
+ let signer_event: SignerEvent < T > = json_event. try_into ( ) ?;
429
412
430
413
Ok ( signer_event)
431
414
}
@@ -472,108 +455,69 @@ impl<T: SignerEventTrait> TryFrom<StackerDBChunksEvent> for SignerEvent<T> {
472
455
}
473
456
}
474
457
475
- /// Process a proposal response from the node
476
- fn process_proposal_response < T : SignerEventTrait > (
477
- mut request : HttpRequest ,
478
- ) -> Result < SignerEvent < T > , EventError > {
479
- debug ! ( "Got proposal_response event" ) ;
480
- let mut body = String :: new ( ) ;
481
- if let Err ( e) = request. as_reader ( ) . read_to_string ( & mut body) {
482
- error ! ( "Failed to read body: {:?}" , & e) ;
458
+ impl < T : SignerEventTrait > TryFrom < BlockValidateResponse > for SignerEvent < T > {
459
+ type Error = EventError ;
483
460
484
- ack_dispatcher ( request) ;
485
- return Err ( EventError :: MalformedRequest ( format ! (
486
- "Failed to read body: {:?}" ,
487
- & e
488
- ) ) ) ;
461
+ fn try_from ( block_validate_response : BlockValidateResponse ) -> Result < Self , Self :: Error > {
462
+ Ok ( SignerEvent :: BlockValidationResponse (
463
+ block_validate_response,
464
+ ) )
489
465
}
466
+ }
490
467
491
- let event: BlockValidateResponse = serde_json:: from_slice ( body. as_bytes ( ) )
492
- . map_err ( |e| EventError :: Deserialize ( format ! ( "Could not decode body to JSON: {:?}" , & e) ) ) ?;
493
-
494
- ack_dispatcher ( request) ;
495
- Ok ( SignerEvent :: BlockValidationResponse ( event) )
468
+ #[ derive( Debug , Deserialize ) ]
469
+ struct BurnBlockEvent {
470
+ burn_block_hash : String ,
471
+ burn_block_height : u64 ,
472
+ reward_recipients : Vec < serde_json:: Value > ,
473
+ reward_slot_holders : Vec < String > ,
474
+ burn_amount : u64 ,
496
475
}
497
476
498
- /// Process a new burn block event from the node
499
- fn process_new_burn_block_event < T : SignerEventTrait > (
500
- mut request : HttpRequest ,
501
- ) -> Result < SignerEvent < T > , EventError > {
502
- debug ! ( "Got burn_block event" ) ;
503
- let mut body = String :: new ( ) ;
504
- if let Err ( e) = request. as_reader ( ) . read_to_string ( & mut body) {
505
- error ! ( "Failed to read body: {:?}" , & e) ;
477
+ impl < T : SignerEventTrait > TryFrom < BurnBlockEvent > for SignerEvent < T > {
478
+ type Error = EventError ;
506
479
507
- ack_dispatcher ( request) ;
508
- return Err ( EventError :: MalformedRequest ( format ! (
509
- "Failed to read body: {:?}" ,
510
- & e
511
- ) ) ) ;
512
- }
513
- #[ derive( Debug , Deserialize ) ]
514
- struct TempBurnBlockEvent {
515
- burn_block_hash : String ,
516
- burn_block_height : u64 ,
517
- reward_recipients : Vec < serde_json:: Value > ,
518
- reward_slot_holders : Vec < String > ,
519
- burn_amount : u64 ,
480
+ fn try_from ( burn_block_event : BurnBlockEvent ) -> Result < Self , Self :: Error > {
481
+ let burn_header_hash = burn_block_event
482
+ . burn_block_hash
483
+ . get ( 2 ..)
484
+ . ok_or_else ( || EventError :: Deserialize ( "Hex string should be 0x prefixed" . into ( ) ) )
485
+ . and_then ( |hex| {
486
+ BurnchainHeaderHash :: from_hex ( hex)
487
+ . map_err ( |e| EventError :: Deserialize ( format ! ( "Invalid hex string: {e}" ) ) )
488
+ } ) ?;
489
+
490
+ Ok ( SignerEvent :: NewBurnBlock {
491
+ burn_height : burn_block_event. burn_block_height ,
492
+ received_time : SystemTime :: now ( ) ,
493
+ burn_header_hash,
494
+ } )
520
495
}
521
- let temp: TempBurnBlockEvent = serde_json:: from_slice ( body. as_bytes ( ) )
522
- . map_err ( |e| EventError :: Deserialize ( format ! ( "Could not decode body to JSON: {:?}" , & e) ) ) ?;
523
- let burn_header_hash = temp
524
- . burn_block_hash
525
- . get ( 2 ..)
526
- . ok_or_else ( || EventError :: Deserialize ( "Hex string should be 0x prefixed" . into ( ) ) )
527
- . and_then ( |hex| {
528
- BurnchainHeaderHash :: from_hex ( hex)
529
- . map_err ( |e| EventError :: Deserialize ( format ! ( "Invalid hex string: {e}" ) ) )
530
- } ) ?;
531
- let event = SignerEvent :: NewBurnBlock {
532
- burn_height : temp. burn_block_height ,
533
- received_time : SystemTime :: now ( ) ,
534
- burn_header_hash,
535
- } ;
536
- ack_dispatcher ( request) ;
537
- Ok ( event)
538
496
}
539
497
540
- /// Process a new burn block event from the node
541
- fn process_new_block < T : SignerEventTrait > (
542
- mut request : HttpRequest ,
543
- ) -> Result < SignerEvent < T > , EventError > {
544
- debug ! ( "Got new_block event" ) ;
545
- let mut body = String :: new ( ) ;
546
- if let Err ( e) = request. as_reader ( ) . read_to_string ( & mut body) {
547
- error ! ( "Failed to read body: {:?}" , & e) ;
498
+ #[ derive( Debug , Deserialize ) ]
499
+ struct BlockEvent {
500
+ block_hash : String ,
501
+ block_height : u64 ,
502
+ }
548
503
549
- ack_dispatcher ( request) ;
550
- return Err ( EventError :: MalformedRequest ( format ! (
551
- "Failed to read body: {:?}" ,
552
- & e
553
- ) ) ) ;
554
- }
555
- #[ derive( Debug , Deserialize ) ]
556
- struct TempBlockEvent {
557
- block_hash : String ,
558
- block_height : u64 ,
559
- }
504
+ impl < T : SignerEventTrait > TryFrom < BlockEvent > for SignerEvent < T > {
505
+ type Error = EventError ;
560
506
561
- let temp: TempBlockEvent = serde_json:: from_slice ( body. as_bytes ( ) )
562
- . map_err ( |e| EventError :: Deserialize ( format ! ( "Could not decode body to JSON: {:?}" , & e) ) ) ?;
563
- let block_hash: Sha512Trunc256Sum = temp
564
- . block_hash
565
- . get ( 2 ..)
566
- . ok_or_else ( || EventError :: Deserialize ( "Hex string should be 0x prefixed" . into ( ) ) )
567
- . and_then ( |hex| {
568
- Sha512Trunc256Sum :: from_hex ( hex)
569
- . map_err ( |e| EventError :: Deserialize ( format ! ( "Invalid hex string: {e}" ) ) )
570
- } ) ?;
571
- let event = SignerEvent :: NewBlock {
572
- block_hash,
573
- block_height : temp. block_height ,
574
- } ;
575
- ack_dispatcher ( request) ;
576
- Ok ( event)
507
+ fn try_from ( block_event : BlockEvent ) -> Result < Self , Self :: Error > {
508
+ let block_hash: Sha512Trunc256Sum = block_event
509
+ . block_hash
510
+ . get ( 2 ..)
511
+ . ok_or_else ( || EventError :: Deserialize ( "Hex string should be 0x prefixed" . into ( ) ) )
512
+ . and_then ( |hex| {
513
+ Sha512Trunc256Sum :: from_hex ( hex)
514
+ . map_err ( |e| EventError :: Deserialize ( format ! ( "Invalid hex string: {e}" ) ) )
515
+ } ) ?;
516
+ Ok ( SignerEvent :: NewBlock {
517
+ block_hash,
518
+ block_height : block_event. block_height ,
519
+ } )
520
+ }
577
521
}
578
522
579
523
pub fn get_signers_db_signer_set_message_id ( name : & str ) -> Option < ( u32 , u32 ) > {
0 commit comments