11use crate :: rpc_client:: { Error as MockError , RpcClient } ;
22use async_trait:: async_trait;
3+ use futures:: channel:: mpsc;
4+ use futures:: { SinkExt , Stream , StreamExt } ;
5+ use std:: pin:: Pin ;
36use std:: sync:: Arc ;
47use subspace_archiving:: archiver:: ArchivedSegment ;
58use subspace_rpc_primitives:: {
69 BlockSignature , BlockSigningInfo , FarmerMetadata , SlotInfo , SolutionResponse ,
710} ;
8- use tokio:: sync:: { mpsc , Mutex } ;
11+ use tokio:: sync:: Mutex ;
912
1013/// `MockRpc` wrapper.
1114#[ derive( Clone , Debug ) ]
@@ -71,23 +74,28 @@ impl MockRpcClient {
7174 }
7275
7376 pub ( crate ) async fn send_metadata ( & self , metadata : FarmerMetadata ) {
74- self . inner . metadata_sender . send ( metadata) . await . unwrap ( ) ;
77+ self . inner
78+ . metadata_sender
79+ . clone ( )
80+ . send ( metadata)
81+ . await
82+ . unwrap ( ) ;
7583 }
7684
7785 pub ( crate ) async fn send_slot_info ( & self , slot_info : SlotInfo ) {
7886 self . inner
7987 . slot_into_sender
8088 . lock ( )
8189 . await
82- . as_ref ( )
90+ . as_mut ( )
8391 . unwrap ( )
8492 . send ( slot_info)
8593 . await
8694 . unwrap ( ) ;
8795 }
8896
8997 pub ( crate ) async fn receive_solution ( & self ) -> Option < SolutionResponse > {
90- self . inner . solution_receiver . lock ( ) . await . recv ( ) . await
98+ self . inner . solution_receiver . lock ( ) . await . next ( ) . await
9199 }
92100
93101 pub ( crate ) async fn drop_slot_sender ( & self ) {
@@ -99,7 +107,7 @@ impl MockRpcClient {
99107 . archived_segments_sender
100108 . lock ( )
101109 . await
102- . as_ref ( )
110+ . as_mut ( )
103111 . unwrap ( )
104112 . send ( archived_segment)
105113 . await
@@ -112,7 +120,7 @@ impl MockRpcClient {
112120 acknowledge_archived_segment_receiver
113121 . lock ( )
114122 . await
115- . recv ( )
123+ . next ( )
116124 . await ;
117125 } ) ;
118126 }
@@ -130,19 +138,29 @@ impl MockRpcClient {
130138#[ async_trait]
131139impl RpcClient for MockRpcClient {
132140 async fn farmer_metadata ( & self ) -> Result < FarmerMetadata , MockError > {
133- Ok ( self . inner . metadata_receiver . lock ( ) . await . try_recv ( ) ?)
141+ Ok ( self
142+ . inner
143+ . metadata_receiver
144+ . lock ( )
145+ . await
146+ . try_next ( ) ?
147+ . unwrap ( ) )
134148 }
135149
136- async fn subscribe_slot_info ( & self ) -> Result < mpsc:: Receiver < SlotInfo > , MockError > {
137- let ( sender, receiver) = mpsc:: channel ( 10 ) ;
150+ async fn subscribe_slot_info (
151+ & self ,
152+ ) -> Result < Pin < Box < dyn Stream < Item = SlotInfo > + Send + ' static > > , MockError > {
153+ let ( mut sender, receiver) = mpsc:: channel ( 10 ) ;
138154 let slot_receiver = self . inner . slot_info_receiver . clone ( ) ;
139155 tokio:: spawn ( async move {
140- while let Some ( slot_info) = slot_receiver. lock ( ) . await . recv ( ) . await {
141- sender. send ( slot_info) . await . unwrap ( ) ;
156+ while let Some ( slot_info) = slot_receiver. lock ( ) . await . next ( ) . await {
157+ if sender. send ( slot_info) . await . is_err ( ) {
158+ break ;
159+ }
142160 }
143161 } ) ;
144162
145- Ok ( receiver)
163+ Ok ( Box :: pin ( receiver) )
146164 }
147165
148166 async fn submit_solution_response (
@@ -151,22 +169,27 @@ impl RpcClient for MockRpcClient {
151169 ) -> Result < ( ) , MockError > {
152170 self . inner
153171 . solution_sender
172+ . clone ( )
154173 . send ( solution_response)
155174 . await
156175 . unwrap ( ) ;
157176 Ok ( ( ) )
158177 }
159178
160- async fn subscribe_block_signing ( & self ) -> Result < mpsc:: Receiver < BlockSigningInfo > , MockError > {
161- let ( sender, receiver) = mpsc:: channel ( 10 ) ;
179+ async fn subscribe_block_signing (
180+ & self ,
181+ ) -> Result < Pin < Box < dyn Stream < Item = BlockSigningInfo > + Send + ' static > > , MockError > {
182+ let ( mut sender, receiver) = mpsc:: channel ( 10 ) ;
162183 let block_signing_receiver = self . inner . block_signing_info_receiver . clone ( ) ;
163184 tokio:: spawn ( async move {
164- while let Some ( block_signing_info) = block_signing_receiver. lock ( ) . await . recv ( ) . await {
165- sender. send ( block_signing_info) . await . unwrap ( ) ;
185+ while let Some ( block_signing_info) = block_signing_receiver. lock ( ) . await . next ( ) . await {
186+ if sender. send ( block_signing_info) . await . is_err ( ) {
187+ break ;
188+ }
166189 }
167190 } ) ;
168191
169- Ok ( receiver)
192+ Ok ( Box :: pin ( receiver) )
170193 }
171194
172195 async fn submit_block_signature (
@@ -175,6 +198,7 @@ impl RpcClient for MockRpcClient {
175198 ) -> Result < ( ) , MockError > {
176199 self . inner
177200 . block_signature_sender
201+ . clone ( )
178202 . send ( block_signature)
179203 . await
180204 . unwrap ( ) ;
@@ -183,22 +207,25 @@ impl RpcClient for MockRpcClient {
183207
184208 async fn subscribe_archived_segments (
185209 & self ,
186- ) -> Result < mpsc :: Receiver < ArchivedSegment > , MockError > {
187- let ( sender, receiver) = mpsc:: channel ( 10 ) ;
210+ ) -> Result < Pin < Box < dyn Stream < Item = ArchivedSegment > + Send + ' static > > , MockError > {
211+ let ( mut sender, receiver) = mpsc:: channel ( 10 ) ;
188212 let archived_segments_receiver = self . inner . archived_segments_receiver . clone ( ) ;
189213 tokio:: spawn ( async move {
190- while let Some ( archived_segment) = archived_segments_receiver. lock ( ) . await . recv ( ) . await
214+ while let Some ( archived_segment) = archived_segments_receiver. lock ( ) . await . next ( ) . await
191215 {
192- sender. send ( archived_segment) . await . unwrap ( ) ;
216+ if sender. send ( archived_segment) . await . is_err ( ) {
217+ break ;
218+ }
193219 }
194220 } ) ;
195221
196- Ok ( receiver)
222+ Ok ( Box :: pin ( receiver) )
197223 }
198224
199225 async fn acknowledge_archived_segment ( & self , segment_index : u64 ) -> Result < ( ) , MockError > {
200226 self . inner
201227 . acknowledge_archived_segment_sender
228+ . clone ( )
202229 . send ( segment_index)
203230 . await
204231 . unwrap ( ) ;
0 commit comments