diff --git a/src/network/http_server.rs b/src/network/http_server.rs index e6d096d0b..f0dcc3cf9 100644 --- a/src/network/http_server.rs +++ b/src/network/http_server.rs @@ -1138,9 +1138,8 @@ pub struct HubEvent { #[derive(Debug, Clone, Deserialize, Serialize)] pub struct EventsResponse { pub events: Vec, - // TODO: What's the best way to support next page token with multiple shards? - // #[serde(rename = "nextPageToken", skip_serializing_if = "Option::is_none")] - // pub next_page_token: Option, + #[serde(rename = "nextPageToken", skip_serializing_if = "Option::is_none")] + pub next_page_token: Option, } #[allow(non_snake_case)] @@ -1973,12 +1972,9 @@ fn map_proto_messages_response_to_json_paged_response( .iter() .map(|m| map_proto_message_to_json_message(m.clone()).unwrap()) .collect(), - next_page_token: Some( - messages_response - .next_page_token - .map(|t| BASE64_STANDARD.encode(t)) - .unwrap_or_else(|| "".to_string()), - ), + next_page_token: messages_response + .next_page_token + .map(|t| BASE64_STANDARD.encode(t)), }) } @@ -2958,6 +2954,9 @@ where .iter() .map(|e| map_proto_hub_event_to_json_hub_event(e.clone()).unwrap()) .collect(), + next_page_token: events_response + .next_page_token + .map(|t| BASE64_STANDARD.encode(t)), }) } diff --git a/src/network/server.rs b/src/network/server.rs index bc766bbfd..0f5877d7e 100644 --- a/src/network/server.rs +++ b/src/network/server.rs @@ -596,6 +596,20 @@ impl MyHubService { } } +/// Helper function to serialize page tokens only if at least one shard has more data. +/// Returns None if all shards have finished pagination (all tokens are None). +fn serialize_page_token_if_not_empty( + next_page_tokens: Vec>>, +) -> Result>, Status> { + if next_page_tokens.iter().any(|token| token.is_some()) { + let new_page_token = serde_json::to_vec(&next_page_tokens) + .map_err(|e| Status::internal(format!("Failed to serialize next_page_token: {}", e)))?; + Ok(Some(new_page_token)) + } else { + Ok(None) + } +} + #[tonic::async_trait] impl HubService for MyHubService { async fn submit_message( @@ -1219,11 +1233,11 @@ impl HubService for MyHubService { pages.iter().flat_map(|page| page.events.clone()).collect(); let next_page_tokens: Vec>> = pages.into_iter().map(|page| page.next_page_token).collect(); - let new_page_token = serde_json::to_vec(&next_page_tokens) - .map_err(|e| Status::internal(format!("Failed to serialize next_page_token: {}", e)))?; + let next_page_token = serialize_page_token_if_not_empty(next_page_tokens)?; + let response = EventsResponse { events: combined_events, - next_page_token: Some(new_page_token), + next_page_token, }; Ok(Response::new(response)) @@ -1552,11 +1566,11 @@ impl HubService for MyHubService { .collect(); let next_page_tokens: Vec>> = pages.into_iter().map(|page| page.next_page_token).collect(); - let new_page_token = serde_json::to_vec(&next_page_tokens) - .map_err(|e| Status::internal(format!("Failed to serialize next_page_token: {}", e)))?; + let next_page_token = serialize_page_token_if_not_empty(next_page_tokens)?; + let response = MessagesResponse { messages: combined_messages, - next_page_token: Some(new_page_token), + next_page_token, }; Ok(Response::new(response)) @@ -1611,13 +1625,11 @@ impl HubService for MyHubService { let next_page_tokens: Vec>> = pages.into_iter().map(|page| page.next_page_token).collect(); - - let new_page_token = serde_json::to_vec(&next_page_tokens) - .map_err(|e| Status::internal(format!("Failed to serialize next_page_token: {}", e)))?; + let next_page_token = serialize_page_token_if_not_empty(next_page_tokens)?; let response = MessagesResponse { messages: combined_messages, - next_page_token: Some(new_page_token), + next_page_token, }; Ok(Response::new(response)) @@ -1689,13 +1701,11 @@ impl HubService for MyHubService { let next_page_tokens: Vec>> = pages.into_iter().map(|page| page.next_page_token).collect(); - - let new_page_token = serde_json::to_vec(&next_page_tokens) - .map_err(|e| Status::internal(format!("Failed to serialize next_page_token: {}", e)))?; + let next_page_token = serialize_page_token_if_not_empty(next_page_tokens)?; let response = MessagesResponse { messages: combined_messages, - next_page_token: Some(new_page_token), + next_page_token, }; Ok(Response::new(response)) @@ -2198,13 +2208,11 @@ impl HubService for MyHubService { let next_page_tokens: Vec>> = pages.into_iter().map(|page| page.next_page_token).collect(); - - let new_page_token = serde_json::to_vec(&next_page_tokens) - .map_err(|e| Status::internal(format!("Failed to serialize next_page_token: {}", e)))?; + let next_page_token = serialize_page_token_if_not_empty(next_page_tokens)?; let response = MessagesResponse { messages: combined_messages, - next_page_token: Some(new_page_token), + next_page_token, }; Ok(Response::new(response))