Skip to content

Commit 842240e

Browse files
author
Heiko Seeberger
committed
feat: add optional timeout param to pull and acknowledge
1 parent 8ab8298 commit 842240e

3 files changed

Lines changed: 43 additions & 18 deletions

File tree

examples/transform_versioned.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async fn run() -> Result<(), Error> {
3030
)?;
3131

3232
let msg_envelopes: Vec<Result<MessageEnvelope<Message>, Error>> = pub_sub_client
33-
.pull_with_transform(SUBSCRIPTION, 42, transform)
33+
.pull_with_transform(SUBSCRIPTION, 42, Some(Duration::from_secs(45)), transform)
3434
.await?;
3535

3636
for msg_envelope in msg_envelopes {
@@ -40,7 +40,7 @@ async fn run() -> Result<(), Error> {
4040
m.id, m.message, m.delivery_attempt
4141
);
4242
match pub_sub_client
43-
.acknowledge(SUBSCRIPTION, vec![&m.ack_id])
43+
.acknowledge(SUBSCRIPTION, vec![&m.ack_id], Some(Duration::from_secs(10)))
4444
.await
4545
{
4646
Ok(_) => println!("Successfully acknowledged"),

src/lib.rs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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(),

tests/test.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ async fn test() {
8080
let pub_sub_client = pub_sub_client.unwrap();
8181

8282
// Pull
83-
let response = pub_sub_client.pull::<Message>(SUBSCRIPTION_ID, 42).await;
83+
let response = pub_sub_client
84+
.pull::<Message>(SUBSCRIPTION_ID, 42, Some(Duration::from_secs(45)))
85+
.await;
8486
assert!(response.is_ok());
8587
let response = response.unwrap();
8688
assert_eq!(response.len(), 3);
@@ -114,11 +116,15 @@ async fn test() {
114116

115117
// Acknowledge
116118
let ack_ids = vec![ack_id_1, ack_id_2];
117-
let response = pub_sub_client.acknowledge(SUBSCRIPTION_ID, ack_ids).await;
119+
let response = pub_sub_client
120+
.acknowledge(SUBSCRIPTION_ID, ack_ids, Some(Duration::from_secs(10)))
121+
.await;
118122
assert!(response.is_ok());
119123

120124
// Pull again
121-
let response = pub_sub_client.pull::<Message>(SUBSCRIPTION_ID, 42).await;
125+
let response = pub_sub_client
126+
.pull::<Message>(SUBSCRIPTION_ID, 42, Some(Duration::from_secs(45)))
127+
.await;
122128
assert!(response.is_ok());
123129
let response = response.unwrap();
124130
assert_eq!(response.len(), 1);
@@ -128,7 +134,11 @@ async fn test() {
128134

129135
// Acknowledge with invalid ACK ID
130136
let response = pub_sub_client
131-
.acknowledge(SUBSCRIPTION_ID, vec!["invalid"])
137+
.acknowledge(
138+
SUBSCRIPTION_ID,
139+
vec!["invalid"],
140+
Some(Duration::from_secs(10)),
141+
)
132142
.await;
133143
assert!(response.is_err());
134144
}

0 commit comments

Comments
 (0)