@@ -81,7 +81,7 @@ pub enum SortOrder {
81
81
/// We use the latest GiftWrap and PrivateDirectMessage already with this if I
82
82
/// understand the nostr-sdk docs and sources correctly.
83
83
/// @see https://nips.nostr.com/59 and https://nips.nostr.com/17
84
- #[ derive( Clone , Debug ) ]
84
+ #[ derive( Clone ) ]
85
85
pub struct NostrClient {
86
86
pub keys : BcrKeys ,
87
87
pub client : Client ,
@@ -340,6 +340,7 @@ impl NotificationJsonTransportApi for NostrClient {
340
340
& self ,
341
341
id : & str ,
342
342
blockchain : BlockchainType ,
343
+ block_time : u64 ,
343
344
keys : BcrKeys ,
344
345
event : EventEnvelope ,
345
346
previous_event : Option < Event > ,
@@ -348,7 +349,8 @@ impl NotificationJsonTransportApi for NostrClient {
348
349
let event = create_public_chain_event (
349
350
id,
350
351
event,
351
- blockchain. to_owned ( ) ,
352
+ block_time,
353
+ blockchain,
352
354
keys,
353
355
previous_event,
354
356
root_event,
@@ -506,7 +508,7 @@ impl NostrConsumer {
506
508
)
507
509
. await
508
510
{
509
- let success = match event. kind {
511
+ let ( success, time ) = match event. kind {
510
512
Kind :: EncryptedDirectMessage | Kind :: GiftWrap => {
511
513
trace ! ( "Received encrypted direct message: {event:?}" ) ;
512
514
match handle_direct_message (
@@ -519,9 +521,9 @@ impl NostrConsumer {
519
521
{
520
522
Err ( e) => {
521
523
error ! ( "Failed to handle direct message: {e}" ) ;
522
- false
524
+ ( false , 0u64 )
523
525
}
524
- Ok ( _) => true ,
526
+ Ok ( _) => ( true , event . created_at . as_u64 ( ) ) ,
525
527
}
526
528
}
527
529
Kind :: TextNote => {
@@ -538,32 +540,32 @@ impl NostrConsumer {
538
540
error ! (
539
541
"Failed to handle public chain event: {e}"
540
542
) ;
541
- false
543
+ ( false , 0u64 )
544
+ }
545
+ Ok ( v) => {
546
+ if v {
547
+ ( v, event. created_at . as_u64 ( ) )
548
+ } else {
549
+ ( false , 0u64 )
550
+ }
542
551
}
543
- Ok ( _) => true ,
544
552
}
545
553
}
546
554
Kind :: RelayList => {
547
555
// we have not subscribed to relaylist events yet
548
556
info ! ( "Received relay list: {event:?}" ) ;
549
- true
557
+ ( true , 0u64 )
550
558
}
551
559
Kind :: Metadata => {
552
560
// we have not subscribed to metadata events yet
553
561
info ! ( "Received metadata: {event:?}" ) ;
554
- true
562
+ ( true , 0u64 )
555
563
}
556
- _ => true ,
564
+ _ => ( true , 0u64 ) ,
557
565
} ;
558
566
// store the new event offset
559
- add_offset (
560
- & offset_store,
561
- event. id ,
562
- event. created_at ,
563
- success,
564
- & client_id,
565
- )
566
- . await ;
567
+ add_offset ( & offset_store, event. id , time, success, & client_id)
568
+ . await ;
567
569
}
568
570
}
569
571
Ok ( false )
@@ -606,13 +608,13 @@ async fn handle_direct_message<T: NostrSigner>(
606
608
client_id : & str ,
607
609
event_handlers : & Arc < Vec < Box < dyn NotificationHandlerApi > > > ,
608
610
) -> Result < ( ) > {
609
- if let Some ( ( envelope, sender, _, _) ) = unwrap_direct_message ( event, signer) . await {
611
+ if let Some ( ( envelope, sender, _, _) ) = unwrap_direct_message ( event. clone ( ) , signer) . await {
610
612
let sender_npub = sender. to_bech32 ( ) ;
611
613
let sender_node_id = sender. to_hex ( ) ;
612
614
trace ! (
613
615
"Processing event: {envelope:?} from {sender_npub:?} (hex: {sender_node_id}) on client {client_id}"
614
616
) ;
615
- handle_event ( envelope, client_id, event_handlers) . await ?;
617
+ handle_event ( envelope, client_id, event_handlers, event ) . await ?;
616
618
}
617
619
Ok ( ( ) )
618
620
}
@@ -622,18 +624,20 @@ async fn handle_public_event(
622
624
node_id : & str ,
623
625
chain_key_store : & Arc < dyn ChainKeyServiceApi > ,
624
626
handlers : & Arc < Vec < Box < dyn NotificationHandlerApi > > > ,
625
- ) -> Result < ( ) > {
626
- if let Some ( encrypted_data) = unwrap_public_chain_event ( event) ? {
627
+ ) -> Result < bool > {
628
+ if let Some ( encrypted_data) = unwrap_public_chain_event ( event. clone ( ) ) ? {
627
629
if let Ok ( Some ( chain_keys) ) = chain_key_store
628
630
. get_chain_keys ( & encrypted_data. id , encrypted_data. chain_type )
629
631
. await
630
632
{
631
633
let decrypted = decrypt_public_chain_event ( & encrypted_data. payload , & chain_keys) ?;
632
634
trace ! ( "Handling public chain event: {decrypted:?}" ) ;
633
- handle_event ( decrypted, node_id, handlers) . await ?
635
+ handle_event ( decrypted. clone ( ) , node_id, handlers, event . clone ( ) ) . await ?;
634
636
}
637
+ Ok ( true )
638
+ } else {
639
+ Ok ( false )
635
640
}
636
- Ok ( ( ) )
637
641
}
638
642
639
643
async fn valid_sender (
@@ -670,13 +674,13 @@ async fn get_offset(db: &Arc<dyn NostrEventOffsetStoreApi>, node_id: &str) -> Ti
670
674
async fn add_offset (
671
675
db : & Arc < dyn NostrEventOffsetStoreApi > ,
672
676
event_id : EventId ,
673
- time : Timestamp ,
677
+ time : u64 ,
674
678
success : bool ,
675
679
node_id : & str ,
676
680
) {
677
681
db. add_event ( NostrEventOffset {
678
682
event_id : event_id. to_hex ( ) ,
679
- time : time . as_u64 ( ) ,
683
+ time,
680
684
success,
681
685
node_id : node_id. to_string ( ) ,
682
686
} )
@@ -690,12 +694,16 @@ async fn handle_event(
690
694
event : EventEnvelope ,
691
695
node_id : & str ,
692
696
handlers : & Arc < Vec < Box < dyn NotificationHandlerApi > > > ,
697
+ original_event : Box < nostr:: Event > ,
693
698
) -> Result < ( ) > {
694
699
let event_type = & event. event_type ;
695
700
let mut times = 0 ;
696
701
for handler in handlers. iter ( ) {
697
702
if handler. handles_event ( event_type) {
698
- match handler. handle_event ( event. to_owned ( ) , node_id) . await {
703
+ match handler
704
+ . handle_event ( event. to_owned ( ) , node_id, original_event. clone ( ) )
705
+ . await
706
+ {
699
707
Ok ( _) => times += 1 ,
700
708
Err ( e) => error ! ( "Nostr event handler failed: {e}" ) ,
701
709
}
@@ -736,7 +744,7 @@ mod tests {
736
744
pub NotificationHandler { }
737
745
#[ async_trait:: async_trait]
738
746
impl NotificationHandlerApi for NotificationHandler {
739
- async fn handle_event( & self , event: EventEnvelope , identity: & str ) -> bcr_ebill_transport:: Result <( ) >;
747
+ async fn handle_event( & self , event: EventEnvelope , identity: & str , original_event : Box <nostr :: Event > ) -> bcr_ebill_transport:: Result <( ) >;
740
748
fn handles_event( & self , event_type: & EventType ) -> bool ;
741
749
}
742
750
}
@@ -796,7 +804,7 @@ mod tests {
796
804
let expected_event: Event < TestEventPayload > = event. clone ( ) ;
797
805
handler
798
806
. expect_handle_event ( )
799
- . withf ( move |e, i| {
807
+ . withf ( move |e, i, _ | {
800
808
let expected = expected_event. clone ( ) ;
801
809
let received: Event < TestEventPayload > =
802
810
e. clone ( ) . try_into ( ) . expect ( "could not convert event" ) ;
@@ -805,7 +813,7 @@ mod tests {
805
813
let valid_identity = i == keys2. get_public_key ( ) ;
806
814
valid_type && valid_payload && valid_identity
807
815
} )
808
- . returning ( |_, _| Ok ( ( ) ) ) ;
816
+ . returning ( |_, _, _ | Ok ( ( ) ) ) ;
809
817
810
818
let mut offset_store = MockNostrEventOffsetStoreApiMock :: new ( ) ;
811
819
0 commit comments