55// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
66// accordance with one or both of these licenses.
77
8+ use std:: future:: Future ;
9+ use std:: pin:: Pin ;
810use std:: sync:: Arc ;
911
1012use bdk_chain:: Merge ;
11- use bdk_wallet:: { ChangeSet , WalletPersister } ;
13+ use bdk_wallet:: { AsyncWalletPersister , ChangeSet } ;
1214
1315use crate :: io:: utils:: {
1416 read_bdk_wallet_change_set, write_bdk_wallet_change_descriptor, write_bdk_wallet_descriptor,
1517 write_bdk_wallet_indexer, write_bdk_wallet_local_chain, write_bdk_wallet_network,
1618 write_bdk_wallet_tx_graph,
1719} ;
1820use crate :: logger:: { log_error, LdkLogger , Logger } ;
19- use crate :: runtime:: Runtime ;
2021use crate :: types:: DynStore ;
2122
2223pub ( crate ) struct KVStoreWalletPersister {
2324 latest_change_set : Option < ChangeSet > ,
2425 kv_store : Arc < DynStore > ,
25- runtime : Arc < Runtime > ,
2626 logger : Arc < Logger > ,
2727}
2828
2929impl KVStoreWalletPersister {
30- pub ( crate ) fn new ( kv_store : Arc < DynStore > , runtime : Arc < Runtime > , logger : Arc < Logger > ) -> Self {
31- Self { latest_change_set : None , kv_store, runtime , logger }
30+ pub ( crate ) fn new ( kv_store : Arc < DynStore > , logger : Arc < Logger > ) -> Self {
31+ Self { latest_change_set : None , kv_store, logger }
3232 }
33- }
34-
35- impl WalletPersister for KVStoreWalletPersister {
36- type Error = std:: io:: Error ;
3733
38- fn initialize ( persister : & mut Self ) -> Result < ChangeSet , Self :: Error > {
34+ async fn initialize_inner ( & mut self ) -> Result < ChangeSet , std :: io :: Error > {
3935 // Return immediately if we have already been initialized.
40- if let Some ( latest_change_set) = persister . latest_change_set . as_ref ( ) {
36+ if let Some ( latest_change_set) = self . latest_change_set . as_ref ( ) {
4137 return Ok ( latest_change_set. clone ( ) ) ;
4238 }
4339
44- let change_set_opt = persister
45- . runtime
46- . block_on ( read_bdk_wallet_change_set ( & * persister. kv_store , & * persister. logger ) ) ?;
40+ let change_set_opt = read_bdk_wallet_change_set ( & * self . kv_store , & * self . logger ) . await ?;
4741
4842 let change_set = match change_set_opt {
4943 Some ( persisted_change_set) => persisted_change_set,
@@ -54,18 +48,21 @@ impl WalletPersister for KVStoreWalletPersister {
5448 ChangeSet :: default ( )
5549 } ,
5650 } ;
57- persister . latest_change_set = Some ( change_set. clone ( ) ) ;
51+ self . latest_change_set = Some ( change_set. clone ( ) ) ;
5852 Ok ( change_set)
5953 }
6054
61- fn persist ( persister : & mut Self , change_set : & ChangeSet ) -> Result < ( ) , Self :: Error > {
55+ async fn persist_inner ( & mut self , change_set : & ChangeSet ) -> Result < ( ) , std :: io :: Error > {
6256 if change_set. is_empty ( ) {
6357 return Ok ( ( ) ) ;
6458 }
6559
60+ let kv_store = Arc :: clone ( & self . kv_store ) ;
61+ let logger = Arc :: clone ( & self . logger ) ;
62+
6663 // We're allowed to fail here if we're not initialized, BDK docs state: "This method can fail if the
6764 // persister is not initialized."
68- let latest_change_set = persister . latest_change_set . as_mut ( ) . ok_or_else ( || {
65+ let latest_change_set = self . latest_change_set . as_mut ( ) . ok_or_else ( || {
6966 std:: io:: Error :: new (
7067 std:: io:: ErrorKind :: Other ,
7168 "Wallet must be initialized before calling persist" ,
@@ -80,7 +77,7 @@ impl WalletPersister for KVStoreWalletPersister {
8077 {
8178 debug_assert ! ( false , "Wallet descriptor must never change" ) ;
8279 log_error ! (
83- persister . logger,
80+ logger,
8481 "Wallet change set doesn't match persisted descriptor. This should never happen."
8582 ) ;
8683 return Err ( std:: io:: Error :: new (
@@ -89,11 +86,7 @@ impl WalletPersister for KVStoreWalletPersister {
8986 ) ) ;
9087 } else {
9188 latest_change_set. descriptor = Some ( descriptor. clone ( ) ) ;
92- persister. runtime . block_on ( write_bdk_wallet_descriptor (
93- & descriptor,
94- & * persister. kv_store ,
95- & * persister. logger ,
96- ) ) ?;
89+ write_bdk_wallet_descriptor ( & descriptor, & * kv_store, Arc :: clone ( & logger) ) . await ?;
9790 }
9891 }
9992
@@ -103,7 +96,7 @@ impl WalletPersister for KVStoreWalletPersister {
10396 {
10497 debug_assert ! ( false , "Wallet change_descriptor must never change" ) ;
10598 log_error ! (
106- persister . logger,
99+ logger,
107100 "Wallet change set doesn't match persisted change_descriptor. This should never happen."
108101 ) ;
109102 return Err ( std:: io:: Error :: new (
@@ -112,19 +105,20 @@ impl WalletPersister for KVStoreWalletPersister {
112105 ) ) ;
113106 } else {
114107 latest_change_set. change_descriptor = Some ( change_descriptor. clone ( ) ) ;
115- persister . runtime . block_on ( write_bdk_wallet_change_descriptor (
108+ write_bdk_wallet_change_descriptor (
116109 & change_descriptor,
117- & * persister. kv_store ,
118- & * persister. logger ,
119- ) ) ?;
110+ & * kv_store,
111+ Arc :: clone ( & logger) ,
112+ )
113+ . await ?;
120114 }
121115 }
122116
123117 if let Some ( network) = change_set. network {
124118 if latest_change_set. network . is_some ( ) && latest_change_set. network != Some ( network) {
125119 debug_assert ! ( false , "Wallet network must never change" ) ;
126120 log_error ! (
127- persister . logger,
121+ logger,
128122 "Wallet change set doesn't match persisted network. This should never happen."
129123 ) ;
130124 return Err ( std:: io:: Error :: new (
@@ -133,11 +127,7 @@ impl WalletPersister for KVStoreWalletPersister {
133127 ) ) ;
134128 } else {
135129 latest_change_set. network = Some ( network) ;
136- persister. runtime . block_on ( write_bdk_wallet_network (
137- & network,
138- & * persister. kv_store ,
139- & * persister. logger ,
140- ) ) ?;
130+ write_bdk_wallet_network ( & network, & * kv_store, Arc :: clone ( & logger) ) . await ?;
141131 }
142132 }
143133
@@ -157,31 +147,48 @@ impl WalletPersister for KVStoreWalletPersister {
157147 // particular order.
158148 if !change_set. indexer . is_empty ( ) {
159149 latest_change_set. indexer . merge ( change_set. indexer . clone ( ) ) ;
160- persister. runtime . block_on ( write_bdk_wallet_indexer (
161- & latest_change_set. indexer ,
162- & * persister. kv_store ,
163- Arc :: clone ( & persister. logger ) ,
164- ) ) ?;
150+ write_bdk_wallet_indexer ( & latest_change_set. indexer , & * kv_store, Arc :: clone ( & logger) )
151+ . await ?;
165152 }
166153
167154 if !change_set. tx_graph . is_empty ( ) {
168155 latest_change_set. tx_graph . merge ( change_set. tx_graph . clone ( ) ) ;
169- persister. runtime . block_on ( write_bdk_wallet_tx_graph (
170- & latest_change_set. tx_graph ,
171- & * persister. kv_store ,
172- Arc :: clone ( & persister. logger ) ,
173- ) ) ?;
156+ write_bdk_wallet_tx_graph ( & latest_change_set. tx_graph , & * kv_store, Arc :: clone ( & logger) )
157+ . await ?;
174158 }
175159
176160 if !change_set. local_chain . is_empty ( ) {
177161 latest_change_set. local_chain . merge ( change_set. local_chain . clone ( ) ) ;
178- persister . runtime . block_on ( write_bdk_wallet_local_chain (
162+ write_bdk_wallet_local_chain (
179163 & latest_change_set. local_chain ,
180- & * persister. kv_store ,
181- Arc :: clone ( & persister. logger ) ,
182- ) ) ?;
164+ & * kv_store,
165+ Arc :: clone ( & logger) ,
166+ )
167+ . await ?;
183168 }
184169
185170 Ok ( ( ) )
186171 }
187172}
173+
174+ impl AsyncWalletPersister for KVStoreWalletPersister {
175+ type Error = std:: io:: Error ;
176+
177+ fn initialize < ' a > (
178+ persister : & ' a mut Self ,
179+ ) -> Pin < Box < dyn Future < Output = Result < ChangeSet , Self :: Error > > + Send + ' a > >
180+ where
181+ Self : ' a ,
182+ {
183+ Box :: pin ( persister. initialize_inner ( ) )
184+ }
185+
186+ fn persist < ' a > (
187+ persister : & ' a mut Self , change_set : & ' a ChangeSet ,
188+ ) -> Pin < Box < dyn Future < Output = Result < ( ) , Self :: Error > > + Send + ' a > >
189+ where
190+ Self : ' a ,
191+ {
192+ Box :: pin ( persister. persist_inner ( change_set) )
193+ }
194+ }
0 commit comments