@@ -133,7 +133,7 @@ where
133
133
last_id : AtomicUsize ,
134
134
waiting_map : Mutex < HashMap < usize , Sender < ChannelMessage > > > ,
135
135
136
- headers : Mutex < VecDeque < RawHeaderNotification > > ,
136
+ headers : Mutex < Option < VecDeque < RawHeaderNotification > > > ,
137
137
script_notifications : Mutex < HashMap < ScriptHash , VecDeque < ScriptStatus > > > ,
138
138
139
139
#[ cfg( feature = "debug-calls" ) ]
@@ -154,7 +154,7 @@ where
154
154
last_id : AtomicUsize :: new ( 0 ) ,
155
155
waiting_map : Mutex :: new ( HashMap :: new ( ) ) ,
156
156
157
- headers : Mutex :: new ( VecDeque :: new ( ) ) ,
157
+ headers : Mutex :: new ( None ) ,
158
158
script_notifications : Mutex :: new ( HashMap :: new ( ) ) ,
159
159
160
160
#[ cfg( feature = "debug-calls" ) ]
@@ -648,11 +648,17 @@ impl<S: Read + Write> RawClient<S> {
648
648
649
649
fn handle_notification ( & self , method : & str , result : serde_json:: Value ) -> Result < ( ) , Error > {
650
650
match method {
651
- "blockchain.headers.subscribe" => self . headers . lock ( ) ?. append (
652
- & mut serde_json:: from_value :: < Vec < RawHeaderNotification > > ( result) ?
653
- . into_iter ( )
654
- . collect ( ) ,
655
- ) ,
651
+ "blockchain.headers.subscribe" => {
652
+ let mut queue = self . headers . lock ( ) ?;
653
+ match queue. as_mut ( ) {
654
+ None => return Err ( Error :: NotSubscribedToHeaders ) ,
655
+ Some ( queue) => queue. append (
656
+ & mut serde_json:: from_value :: < Vec < RawHeaderNotification > > ( result) ?
657
+ . into_iter ( )
658
+ . collect ( ) ,
659
+ ) ,
660
+ }
661
+ }
656
662
"blockchain.scripthash.subscribe" => {
657
663
let unserialized: ScriptNotification = serde_json:: from_value ( result) ?;
658
664
let mut script_notifications = self . script_notifications . lock ( ) ?;
@@ -762,6 +768,11 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
762
768
}
763
769
764
770
fn block_headers_subscribe_raw ( & self ) -> Result < RawHeaderNotification , Error > {
771
+ let mut headers = self . headers . lock ( ) ?;
772
+ if headers. is_none ( ) {
773
+ * headers = Some ( VecDeque :: new ( ) ) ;
774
+ }
775
+
765
776
let req = Request :: new_id (
766
777
self . last_id . fetch_add ( 1 , Ordering :: SeqCst ) ,
767
778
"blockchain.headers.subscribe" ,
@@ -773,7 +784,11 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
773
784
}
774
785
775
786
fn block_headers_pop_raw ( & self ) -> Result < Option < RawHeaderNotification > , Error > {
776
- Ok ( self . headers . lock ( ) ?. pop_front ( ) )
787
+ let mut queue = self . headers . lock ( ) ?;
788
+ match queue. as_mut ( ) {
789
+ None => Err ( Error :: NotSubscribedToHeaders ) ,
790
+ Some ( queue) => Ok ( queue. pop_front ( ) ) ,
791
+ }
777
792
}
778
793
779
794
fn block_header_raw ( & self , height : usize ) -> Result < Vec < u8 > , Error > {
@@ -1333,6 +1348,16 @@ mod test {
1333
1348
assert ! ( resp. height >= 639000 ) ;
1334
1349
}
1335
1350
1351
+ #[ test]
1352
+ fn test_block_headers_subscribe_pop ( ) {
1353
+ let client = RawClient :: new ( get_test_server ( ) , None ) . unwrap ( ) ;
1354
+ let resp = client. block_headers_pop ( ) ;
1355
+ assert_eq ! ( format!( "{:?}" , resp) , "Err(NotSubscribedToHeaders)" ) ;
1356
+ client. block_headers_subscribe ( ) . unwrap ( ) ;
1357
+ let resp = client. block_headers_pop ( ) ;
1358
+ assert ! ( resp. is_ok( ) ) ;
1359
+ }
1360
+
1336
1361
#[ test]
1337
1362
fn test_script_subscribe ( ) {
1338
1363
use std:: str:: FromStr ;
0 commit comments