Skip to content

Commit e6e71be

Browse files
committed
enhance(sdk-rs): builder pattern
1 parent 4aa5247 commit e6e71be

File tree

13 files changed

+722
-236
lines changed

13 files changed

+722
-236
lines changed

.changeset/busy-cloths-search.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
'hive-console-sdk-rs': minor
3+
---
4+
5+
Breaking Changes to avoid future breaking changes;
6+
7+
Switch to [Builder](https://rust-unofficial.github.io/patterns/patterns/creational/builder.html) pattern for `SupergraphFetcher`, `PersistedDocumentsManager` and `UsageAgent` structs.
8+
9+
Benefits;
10+
11+
- No need to provide all parameters at once when creating an instance even for default values.
12+
13+
Example;
14+
```rust
15+
// Before
16+
let fetcher = SupergraphFetcher::try_new_async(
17+
"SOME_ENDPOINT", // endpoint
18+
"SOME_KEY",
19+
"MyUserAgent/1.0".to_string(),
20+
Duration::from_secs(5), // connect_timeout
21+
Duration::from_secs(10), // request_timeout
22+
false, // accept_invalid_certs
23+
3, // retry_count
24+
)?;
25+
26+
// After
27+
// No need to provide all parameters at once, can use default values
28+
let fetcher = SupergraphFetcherBuilder::new()
29+
.endpoint("SOME_ENDPOINT".to_string())
30+
.key("SOME_KEY".to_string())
31+
.build_async()?;
32+
```
33+
34+
- Easier to add new configuration options in the future without breaking existing code.
35+
36+
Example;
37+
38+
```rust
39+
let fetcher = SupergraphFetcher::try_new_async(
40+
"SOME_ENDPOINT", // endpoint
41+
"SOME_KEY",
42+
"MyUserAgent/1.0".to_string(),
43+
Duration::from_secs(5), // connect_timeout
44+
Duration::from_secs(10), // request_timeout
45+
false, // accept_invalid_certs
46+
3, // retry_count
47+
circuit_breaker_config, // Breaking Change -> new parameter added
48+
)?;
49+
50+
let fetcher = SupergraphFetcherBuilder::new()
51+
.endpoint("SOME_ENDPOINT".to_string())
52+
.key("SOME_KEY".to_string())
53+
.build_async()?; // No breaking change, circuit_breaker_config can be added later if needed
54+
```

configs/cargo/Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/libraries/router/src/persisted_documents.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,38 @@ impl PersistedDocumentsPlugin {
100100
}
101101
};
102102

103+
let mut persisted_documents_manager = PersistedDocumentsManager::builder()
104+
.key(key)
105+
.endpoint(endpoint)
106+
.user_agent(format!("hive-apollo-router/{}", PLUGIN_VERSION));
107+
108+
if let Some(connect_timeout) = config.connect_timeout {
109+
persisted_documents_manager =
110+
persisted_documents_manager.connect_timeout(Duration::from_secs(connect_timeout));
111+
}
112+
113+
if let Some(request_timeout) = config.request_timeout {
114+
persisted_documents_manager =
115+
persisted_documents_manager.request_timeout(Duration::from_secs(request_timeout));
116+
}
117+
118+
if let Some(retry_count) = config.retry_count {
119+
persisted_documents_manager = persisted_documents_manager.max_retries(retry_count);
120+
}
121+
122+
if let Some(accept_invalid_certs) = config.accept_invalid_certs {
123+
persisted_documents_manager =
124+
persisted_documents_manager.accept_invalid_certs(accept_invalid_certs);
125+
}
126+
127+
if let Some(cache_size) = config.cache_size {
128+
persisted_documents_manager = persisted_documents_manager.cache_size(cache_size);
129+
}
130+
131+
let persisted_documents_manager = persisted_documents_manager.build()?;
132+
103133
Ok(PersistedDocumentsPlugin {
104-
persisted_documents_manager: Some(Arc::new(PersistedDocumentsManager::new(
105-
key,
106-
endpoint,
107-
config.accept_invalid_certs.unwrap_or(false),
108-
Duration::from_secs(config.connect_timeout.unwrap_or(5)),
109-
Duration::from_secs(config.request_timeout.unwrap_or(15)),
110-
config.retry_count.unwrap_or(3),
111-
config.cache_size.unwrap_or(1000),
112-
format!("hive-apollo-router/{}", PLUGIN_VERSION),
113-
))),
134+
persisted_documents_manager: Some(Arc::new(persisted_documents_manager)),
114135
allow_arbitrary_documents,
115136
})
116137
}

packages/libraries/router/src/registry.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use crate::consts::PLUGIN_VERSION;
22
use crate::registry_logger::Logger;
33
use anyhow::{anyhow, Result};
44
use hive_console_sdk::supergraph_fetcher::SupergraphFetcher;
5+
use hive_console_sdk::supergraph_fetcher::SupergraphFetcherBuilder;
56
use hive_console_sdk::supergraph_fetcher::SupergraphFetcherSyncState;
67
use sha2::Digest;
78
use sha2::Sha256;
89
use std::env;
910
use std::io::Write;
1011
use std::thread;
11-
use std::time::Duration;
1212

1313
#[derive(Debug)]
1414
pub struct HiveRegistry {
@@ -120,19 +120,18 @@ impl HiveRegistry {
120120
.to_string_lossy()
121121
.to_string(),
122122
);
123-
env::set_var("APOLLO_ROUTER_SUPERGRAPH_PATH", file_name.clone());
124-
env::set_var("APOLLO_ROUTER_HOT_RELOAD", "true");
125-
126-
let fetcher = SupergraphFetcher::try_new_sync(
127-
endpoint,
128-
&key,
129-
format!("hive-apollo-router/{}", PLUGIN_VERSION),
130-
Duration::from_secs(5),
131-
Duration::from_secs(60),
132-
accept_invalid_certs,
133-
3,
134-
)
135-
.map_err(|e| anyhow!("Failed to create SupergraphFetcher: {}", e))?;
123+
unsafe {
124+
env::set_var("APOLLO_ROUTER_SUPERGRAPH_PATH", file_name.clone());
125+
env::set_var("APOLLO_ROUTER_HOT_RELOAD", "true");
126+
}
127+
128+
let fetcher = SupergraphFetcherBuilder::new()
129+
.endpoint(endpoint)
130+
.key(key)
131+
.user_agent(format!("hive-apollo-router/{}", PLUGIN_VERSION))
132+
.accept_invalid_certs(accept_invalid_certs)
133+
.build_sync()
134+
.map_err(|e| anyhow!("Failed to create SupergraphFetcher: {}", e))?;
136135

137136
let registry = HiveRegistry {
138137
fetcher,

packages/libraries/router/src/usage.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ use core::ops::Drop;
88
use futures::StreamExt;
99
use graphql_parser::parse_schema;
1010
use graphql_parser::schema::Document;
11-
use hive_console_sdk::agent::UsageAgentExt;
12-
use hive_console_sdk::agent::{ExecutionReport, UsageAgent};
11+
use hive_console_sdk::agent::usage_agent::{ExecutionReport, UsageAgent, UsageAgentExt};
1312
use http::HeaderValue;
1413
use rand::Rng;
1514
use schemars::JsonSchema;
@@ -244,20 +243,27 @@ impl Plugin for UsagePlugin {
244243
.expect("Failed to parse schema")
245244
.into_static();
246245

246+
let token = token.expect("token is set");
247+
247248
let agent = if enabled {
248249
let flush_interval = Duration::from_secs(flush_interval);
249-
let agent = UsageAgent::try_new(
250-
&token.expect("token is set"),
251-
endpoint,
252-
target_id,
253-
buffer_size,
254-
Duration::from_secs(connect_timeout),
255-
Duration::from_secs(request_timeout),
256-
accept_invalid_certs,
257-
flush_interval,
258-
format!("hive-apollo-router/{}", PLUGIN_VERSION),
259-
)
260-
.map_err(Box::new)?;
250+
251+
let mut agent = UsageAgent::builder()
252+
.token(token)
253+
.endpoint(endpoint)
254+
.buffer_size(buffer_size)
255+
.connect_timeout(Duration::from_secs(connect_timeout))
256+
.request_timeout(Duration::from_secs(request_timeout))
257+
.accept_invalid_certs(accept_invalid_certs)
258+
.user_agent(format!("hive-apollo-router/{}", PLUGIN_VERSION))
259+
.flush_interval(flush_interval);
260+
261+
if let Some(target_id) = target_id {
262+
agent = agent.target_id(target_id);
263+
}
264+
265+
let agent = agent.build().map_err(Box::new)?;
266+
261267
start_flush_interval(agent.clone());
262268
Some(agent)
263269
} else {

packages/libraries/sdk-rs/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ serde_json = "1"
3232
moka = { version = "0.12.10", features = ["future", "sync"] }
3333
sha2 = { version = "0.10.8", features = ["std"] }
3434
tokio-util = "0.7.16"
35+
regex-automata = "0.4.10"
3536

3637
[dev-dependencies]
3738
mockito = "1.7.0"

0 commit comments

Comments
 (0)