Skip to content

Commit 5ddbbd3

Browse files
committed
feat!: Migrate events and polling systems to HttpTransport
1 parent baaefd8 commit 5ddbbd3

6 files changed

Lines changed: 62 additions & 95 deletions

File tree

contract-tests/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ async-mutex = "1.4.0"
2525
[features]
2626
default = ["hyper-rustls"]
2727
hyper-rustls = ["dep:hyper-rustls", "launchdarkly-server-sdk/hyper-rustls"]
28-
tls = ["hyper-tls"]
28+
tls = ["hyper-tls", "launchdarkly-server-sdk/hyper"]

contract-tests/src/client_entity.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ impl ClientEntity {
131131
if let Some(attributes) = events.global_private_attributes {
132132
processor_builder.private_attributes(attributes);
133133
}
134-
processor_builder.https_connector(connector.clone());
134+
let transport = launchdarkly_server_sdk::HyperTransport::new_with_connector(connector.clone());
135+
processor_builder.transport(transport);
135136
processor_builder.omit_anonymous_contexts(events.omit_anonymous_contexts);
136137

137138
config_builder.event_processor(&processor_builder)

launchdarkly-server-sdk/src/client.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,6 @@ mod tests {
840840
use crossbeam_channel::Receiver;
841841
use eval::{ContextBuilder, MultiContextBuilder};
842842
use futures::FutureExt;
843-
use hyper_util::client::legacy::connect::HttpConnector;
844843
use launchdarkly_server_sdk_evaluation::{Flag, Reason, Segment};
845844
use maplit::hashmap;
846845
use std::collections::HashMap;
@@ -2612,7 +2611,7 @@ mod tests {
26122611
.daemon_mode(daemon_mode)
26132612
.data_source(MockDataSourceBuilder::new().data_source(updates))
26142613
.event_processor(
2615-
EventProcessorBuilder::<HttpConnector>::new().event_sender(Arc::new(event_sender)),
2614+
EventProcessorBuilder::<crate::HyperTransport>::new().event_sender(Arc::new(event_sender)),
26162615
)
26172616
.build()
26182617
.expect("config should build");

launchdarkly-server-sdk/src/config.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,15 @@ impl ConfigBuilder {
302302
}
303303
Some(builder) => Ok(builder),
304304
#[cfg(feature = "hyper-rustls")]
305-
None => Ok(Box::new(
306-
StreamingDataSourceBuilder::<es::HyperTransport>::new(),
307-
)),
305+
None => {
306+
let transport = es::HyperTransport::new_https();
307+
let mut builder = StreamingDataSourceBuilder::new();
308+
builder.transport(transport);
309+
Ok(Box::new(builder))
310+
}
308311
#[cfg(not(feature = "hyper-rustls"))]
309312
None => Err(BuildError::InvalidConfig(
310-
"data source builder required when rustls is disabled".into(),
313+
"data source builder required when hyper feature is disabled".into(),
311314
)),
312315
};
313316
let data_source_builder = data_source_builder_result?;
@@ -321,14 +324,15 @@ impl ConfigBuilder {
321324
}
322325
Some(builder) => Ok(builder),
323326
#[cfg(feature = "hyper-rustls")]
324-
None => Ok(Box::new(EventProcessorBuilder::<
325-
hyper_rustls::HttpsConnector<
326-
hyper_util::client::legacy::connect::HttpConnector,
327-
>,
328-
>::new())),
327+
None => {
328+
let transport = crate::HyperTransport::new_https();
329+
let mut builder = EventProcessorBuilder::new();
330+
builder.transport(transport);
331+
Ok(Box::new(builder))
332+
}
329333
#[cfg(not(feature = "hyper-rustls"))]
330334
None => Err(BuildError::InvalidConfig(
331-
"event processor factory required when rustls is disabled".into(),
335+
"event processor factory required when hyper-rustls feature is disabled".into(),
332336
)),
333337
};
334338
let event_processor_builder = event_processor_builder_result?;

launchdarkly-server-sdk/src/events/processor_builders.rs

Lines changed: 29 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ use std::sync::Arc;
55
use std::time::Duration;
66

77
use http::Uri;
8-
#[cfg(feature = "hyper-rustls")]
9-
use hyper_rustls::HttpsConnectorBuilder;
108
use launchdarkly_server_sdk_evaluation::Reference;
119
use thiserror::Error;
1210

13-
use crate::events::sender::HyperEventSender;
11+
use crate::events::sender::HttpEventSender;
12+
use crate::transport::HttpTransport;
1413
use crate::{service_endpoints, LAUNCHDARKLY_TAGS_HEADER};
1514

1615
use super::processor::{
@@ -61,41 +60,29 @@ pub trait EventProcessorFactory {
6160
///
6261
/// Adjust the flush interval
6362
/// ```
64-
/// # use launchdarkly_server_sdk::{EventProcessorBuilder, ConfigBuilder};
65-
/// # use hyper_rustls::HttpsConnector;
66-
/// # use hyper_util::client::legacy::connect::HttpConnector;
63+
/// # use launchdarkly_server_sdk::{EventProcessorBuilder, ConfigBuilder, HyperTransport};
6764
/// # use std::time::Duration;
6865
/// # fn main() {
69-
/// ConfigBuilder::new("sdk-key").event_processor(EventProcessorBuilder::<HttpsConnector<HttpConnector>>::new()
66+
/// ConfigBuilder::new("sdk-key").event_processor(EventProcessorBuilder::<HyperTransport>::new()
7067
/// .flush_interval(Duration::from_secs(10)));
7168
/// # }
7269
/// ```
7370
#[derive(Clone)]
74-
pub struct EventProcessorBuilder<C> {
71+
pub struct EventProcessorBuilder<T: HttpTransport = crate::HyperTransport> {
7572
capacity: usize,
7673
flush_interval: Duration,
7774
context_keys_capacity: NonZeroUsize,
7875
context_keys_flush_interval: Duration,
7976
event_sender: Option<Arc<dyn EventSender>>,
8077
all_attributes_private: bool,
8178
private_attributes: HashSet<Reference>,
82-
connector: Option<C>,
79+
transport: Option<T>,
8380
omit_anonymous_contexts: bool,
8481
compress_events: bool,
8582
// diagnostic_recording_interval: Duration
8683
}
8784

88-
impl<C> EventProcessorFactory for EventProcessorBuilder<C>
89-
where
90-
C: tower::Service<Uri> + Clone + Send + Sync + 'static,
91-
C::Response: hyper_util::client::legacy::connect::Connection
92-
+ hyper::rt::Read
93-
+ hyper::rt::Write
94-
+ Send
95-
+ Unpin,
96-
C::Future: Send + Unpin + 'static,
97-
C::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
98-
{
85+
impl<T: HttpTransport> EventProcessorFactory for EventProcessorBuilder<T> {
9986
fn build(
10087
&self,
10188
endpoints: &service_endpoints::ServiceEndpoints,
@@ -114,26 +101,20 @@ where
114101
// NOTE: This would only be possible under unit testing conditions.
115102
if let Some(event_sender) = &self.event_sender {
116103
Ok(event_sender.clone())
117-
} else if let Some(connector) = &self.connector {
118-
Ok(Arc::new(HyperEventSender::new(
119-
connector.clone(),
120-
hyper::Uri::from_str(url_string.as_str()).unwrap(),
104+
} else if let Some(transport) = &self.transport {
105+
Ok(Arc::new(HttpEventSender::new(
106+
transport.clone(),
107+
Uri::from_str(url_string.as_str()).unwrap(),
121108
sdk_key,
122109
default_headers,
123110
self.compress_events,
124111
)))
125112
} else {
126113
#[cfg(feature = "hyper-rustls")]
127114
{
128-
let connector = HttpsConnectorBuilder::new()
129-
.with_webpki_roots()
130-
.https_or_http()
131-
.enable_http1()
132-
.enable_http2()
133-
.build();
134-
135-
Ok(Arc::new(HyperEventSender::new(
136-
connector,
115+
let transport = crate::HyperTransport::new_https();
116+
Ok(Arc::new(HttpEventSender::new(
117+
transport,
137118
Uri::from_str(url_string.as_str()).unwrap(),
138119
sdk_key,
139120
default_headers,
@@ -142,7 +123,7 @@ where
142123
}
143124
#[cfg(not(feature = "hyper-rustls"))]
144125
Err(BuildError::InvalidConfig(
145-
"https connector is required when rustls is disabled".into(),
126+
"transport is required when hyper-rustls feature is disabled".into(),
146127
))
147128
};
148129
let event_sender = event_sender_result?;
@@ -169,7 +150,7 @@ where
169150
}
170151
}
171152

172-
impl<C> EventProcessorBuilder<C> {
153+
impl<T: HttpTransport> EventProcessorBuilder<T> {
173154
/// Create a new [EventProcessorBuilder] with all default values.
174155
pub fn new() -> Self {
175156
Self {
@@ -182,7 +163,7 @@ impl<C> EventProcessorBuilder<C> {
182163
all_attributes_private: false,
183164
private_attributes: HashSet::new(),
184165
omit_anonymous_contexts: false,
185-
connector: None,
166+
transport: None,
186167
compress_events: false,
187168
}
188169
}
@@ -246,12 +227,12 @@ impl<C> EventProcessorBuilder<C> {
246227
self
247228
}
248229

249-
/// Sets the connector for the event sender to use. This allows for re-use of a connector
230+
/// Sets the transport for the event sender to use. This allows for re-use of a transport
250231
/// between multiple client instances. This is especially useful for the `sdk-test-harness`
251232
/// where many client instances are created throughout the test and reading the native
252233
/// certificates is a substantial portion of the runtime.
253-
pub fn https_connector(&mut self, connector: C) -> &mut Self {
254-
self.connector = Some(connector);
234+
pub fn transport(&mut self, transport: T) -> &mut Self {
235+
self.transport = Some(transport);
255236
self
256237
}
257238

@@ -284,7 +265,7 @@ impl<C> EventProcessorBuilder<C> {
284265
}
285266
}
286267

287-
impl<C> Default for EventProcessorBuilder<C> {
268+
impl<T: HttpTransport> Default for EventProcessorBuilder<T> {
288269
fn default() -> Self {
289270
Self::new()
290271
}
@@ -325,7 +306,6 @@ impl Default for NullEventProcessorBuilder {
325306

326307
#[cfg(test)]
327308
mod tests {
328-
use hyper_util::client::legacy::connect::HttpConnector;
329309
use launchdarkly_server_sdk_evaluation::ContextBuilder;
330310
use maplit::hashset;
331311
use mockito::Matcher;
@@ -337,36 +317,36 @@ mod tests {
337317

338318
#[test]
339319
fn default_builder_has_correct_defaults() {
340-
let builder = EventProcessorBuilder::<HttpConnector>::new();
320+
let builder = EventProcessorBuilder::<crate::HyperTransport>::new();
341321
assert_eq!(builder.capacity, DEFAULT_EVENT_CAPACITY);
342322
assert_eq!(builder.flush_interval, DEFAULT_FLUSH_POLL_INTERVAL);
343323
}
344324

345325
#[test]
346326
fn capacity_can_be_adjusted() {
347-
let mut builder = EventProcessorBuilder::<HttpConnector>::new();
327+
let mut builder = EventProcessorBuilder::<crate::HyperTransport>::new();
348328
builder.capacity(1234);
349329
assert_eq!(builder.capacity, 1234);
350330
}
351331

352332
#[test]
353333
fn flush_interval_can_be_adjusted() {
354-
let mut builder = EventProcessorBuilder::<HttpConnector>::new();
334+
let mut builder = EventProcessorBuilder::<crate::HyperTransport>::new();
355335
builder.flush_interval(Duration::from_secs(1234));
356336
assert_eq!(builder.flush_interval, Duration::from_secs(1234));
357337
}
358338

359339
#[test]
360340
fn context_keys_capacity_can_be_adjusted() {
361-
let mut builder = EventProcessorBuilder::<HttpConnector>::new();
341+
let mut builder = EventProcessorBuilder::<crate::HyperTransport>::new();
362342
let cap = NonZeroUsize::new(1234).expect("1234 > 0");
363343
builder.context_keys_capacity(cap);
364344
assert_eq!(builder.context_keys_capacity, cap);
365345
}
366346

367347
#[test]
368348
fn context_keys_flush_interval_can_be_adjusted() {
369-
let mut builder = EventProcessorBuilder::<HttpConnector>::new();
349+
let mut builder = EventProcessorBuilder::<crate::HyperTransport>::new();
370350
builder.context_keys_flush_interval(Duration::from_secs(1000));
371351
assert_eq!(
372352
builder.context_keys_flush_interval,
@@ -376,7 +356,7 @@ mod tests {
376356

377357
#[test]
378358
fn all_attribute_private_can_be_adjusted() {
379-
let mut builder = EventProcessorBuilder::<HttpConnector>::new();
359+
let mut builder = EventProcessorBuilder::<crate::HyperTransport>::new();
380360

381361
assert!(!builder.all_attributes_private);
382362
builder.all_attributes_private(true);
@@ -385,7 +365,7 @@ mod tests {
385365

386366
#[test]
387367
fn attribte_names_can_be_adjusted() {
388-
let mut builder = EventProcessorBuilder::<HttpConnector>::new();
368+
let mut builder = EventProcessorBuilder::<crate::HyperTransport>::new();
389369

390370
assert!(builder.private_attributes.is_empty());
391371
builder.private_attributes(hashset!["name"]);
@@ -410,7 +390,7 @@ mod tests {
410390
.build()
411391
.expect("Service endpoints failed to be created");
412392

413-
let builder = EventProcessorBuilder::<HttpConnector>::new();
393+
let builder = EventProcessorBuilder::<crate::HyperTransport>::new();
414394
let processor = builder
415395
.build(&service_endpoints, "sdk-key", tag)
416396
.expect("Processor failed to build");

0 commit comments

Comments
 (0)