@@ -167,22 +167,26 @@ impl PubSubClient {
167167 & self ,
168168 subscription_id : & str ,
169169 max_messages : u32 ,
170+ timeout : Option < Duration > ,
170171 ) -> Result < Vec < Result < MessageEnvelope < M > , Error > > , Error > {
171- self . pull_with_transform ( subscription_id, max_messages, |_, value| Ok ( value) )
172+ self . pull_with_transform ( subscription_id, max_messages, timeout , |_, value| Ok ( value) )
172173 . await
173174 }
174175
175176 pub async fn pull_with_transform < M , T > (
176177 & self ,
177178 subscription_id : & str ,
178179 max_messages : u32 ,
180+ timeout : Option < Duration > ,
179181 transform : T ,
180182 ) -> Result < Vec < Result < MessageEnvelope < M > , Error > > , Error >
181183 where
182184 M : DeserializeOwned ,
183185 T : Fn ( & ReceivedMessage , Value ) -> Result < Value , Error > ,
184186 {
185- let received_messages = self . pull_raw ( subscription_id, max_messages) . await ?;
187+ let received_messages = self
188+ . pull_raw ( subscription_id, max_messages, timeout)
189+ . await ?;
186190 let messages = deserialize ( received_messages, transform) ;
187191 Ok ( messages)
188192 }
@@ -191,13 +195,14 @@ impl PubSubClient {
191195 & self ,
192196 subscription_id : & str ,
193197 max_messages : u32 ,
198+ timeout : Option < Duration > ,
194199 ) -> Result < Vec < ReceivedMessage > , Error > {
195200 let url = format ! (
196201 "{}/v1/projects/{}/subscriptions/{}:pull" ,
197202 self . base_url, self . project_id, subscription_id
198203 ) ;
199204 let request = PullRequest { max_messages } ;
200- let response = self . send_request ( & url, & request) . await ?;
205+ let response = self . send_request ( & url, & request, timeout ) . await ?;
201206
202207 if !response. status ( ) . is_success ( ) {
203208 return Err ( Error :: unexpected_http_status_code_from_response ( response) . await ) ;
@@ -217,13 +222,14 @@ impl PubSubClient {
217222 & self ,
218223 subscription_id : & str ,
219224 ack_ids : Vec < & str > ,
225+ timeout : Option < Duration > ,
220226 ) -> Result < ( ) , Error > {
221227 let url = format ! (
222228 "{}/v1/projects/{}/subscriptions/{}:acknowledge" ,
223229 self . base_url, self . project_id, subscription_id
224230 ) ;
225231 let request = AcknowledgeRequest { ack_ids } ;
226- let response = self . send_request ( & url, & request) . await ?;
232+ let response = self . send_request ( & url, & request, timeout ) . await ?;
227233
228234 if !response. status ( ) . is_success ( ) {
229235 return Err ( Error :: unexpected_http_status_code_from_response ( response) . await ) ;
@@ -232,17 +238,26 @@ impl PubSubClient {
232238 Ok ( ( ) )
233239 }
234240
235- async fn send_request < R : Serialize > ( & self , url : & str , request : & R ) -> Result < Response , Error > {
241+ async fn send_request < R : Serialize > (
242+ & self ,
243+ url : & str ,
244+ request : & R ,
245+ timeout : Option < Duration > ,
246+ ) -> Result < Response , Error > {
236247 let token = self
237248 . token_fetcher
238249 . fetch_token ( )
239250 . await
240251 . map_err ( |source| Error :: TokenFetch { source } ) ?;
241- let response = self
252+
253+ let request = self
242254 . reqwest_client
243255 . post ( url)
244256 . bearer_auth ( token. access_token ( ) )
245- . json ( request)
257+ . json ( request) ;
258+ let request = timeout. into_iter ( ) . fold ( request, |r, t| r. timeout ( t) ) ;
259+
260+ let response = request
246261 . send ( )
247262 . await
248263 . map_err ( |source| Error :: HttpServiceCommunication { source } ) ?;
@@ -300,13 +315,13 @@ mod tests {
300315 }
301316
302317 #[ test]
303- fn new_ok ( ) {
318+ fn test_new_ok ( ) {
304319 let result = PubSubClient :: new ( "tests/valid_key.json" , Duration :: from_secs ( 30 ) ) ;
305320 assert ! ( result. is_ok( ) ) ;
306321 }
307322
308323 #[ test]
309- fn new_err_non_existent_key ( ) {
324+ fn test_new_err_non_existent_key ( ) {
310325 let result = PubSubClient :: new ( "non_existent" , Duration :: from_secs ( 30 ) ) ;
311326 assert ! ( result. is_err( ) ) ;
312327 match result. unwrap_err ( ) {
@@ -322,7 +337,7 @@ mod tests {
322337 }
323338
324339 #[ test]
325- fn new_err_invalid_key ( ) {
340+ fn test_new_err_invalid_key ( ) {
326341 let result = PubSubClient :: new ( "Cargo.toml" , Duration :: from_secs ( 30 ) ) ;
327342 assert ! ( result. is_err( ) ) ;
328343 match result. unwrap_err ( ) {
@@ -338,7 +353,7 @@ mod tests {
338353 }
339354
340355 #[ test]
341- fn new_err_invalid_private_key ( ) {
356+ fn test_new_err_invalid_private_key ( ) {
342357 let result = PubSubClient :: new ( "tests/invalid_key.json" , Duration :: from_secs ( 30 ) ) ;
343358 assert ! ( result. is_err( ) ) ;
344359 match result. unwrap_err ( ) {
@@ -351,7 +366,7 @@ mod tests {
351366 }
352367
353368 #[ test]
354- fn messages_from_pull_response_ok ( ) {
369+ fn test_deserialize_ok ( ) {
355370 let received_messages = vec ! [
356371 ReceivedMessage {
357372 ack_id: "ack_id" . to_string( ) ,
0 commit comments