Skip to content

Commit 71987dc

Browse files
committed
feat: allow for specification of initial reconnect delay in streaming data source
1 parent 054df6f commit 71987dc

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

contract-tests/sdk-contract-tests/src/entity_manager.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,20 @@ std::optional<std::string> EntityManager::create(ConfigParams const& in) {
4848
endpoints.EventsBaseUrl(*in.serviceEndpoints->events);
4949
}
5050
}
51+
auto& datasource = config_builder.DataSource();
5152

5253
if (in.streaming) {
5354
if (in.streaming->baseUri) {
5455
endpoints.StreamingBaseUrl(*in.streaming->baseUri);
5556
}
57+
if (in.streaming->initialRetryDelayMs) {
58+
auto streaming = DataSourceBuilder::Streaming();
59+
streaming.InitialReconnectDelay(
60+
std::chrono::milliseconds(*in.streaming->initialRetryDelayMs));
61+
datasource.Method(std::move(streaming));
62+
}
5663
}
5764

58-
auto& datasource = config_builder.DataSource();
59-
6065
if (in.polling) {
6166
if (in.polling->baseUri) {
6267
endpoints.PollingBaseUrl(*in.polling->baseUri);

libs/server-sent-events/include/launchdarkly/sse/client.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ class Builder {
9090
*/
9191
Builder& write_timeout(std::chrono::milliseconds timeout);
9292

93+
/**
94+
* Specifies the initial delay before reconnection when backoff takes place
95+
* due to an error on the connection.
96+
* @param timeout
97+
* @return Reference to this builder.
98+
*/
99+
Builder& initial_reconnect_delay(std::chrono::milliseconds delay);
100+
93101
/**
94102
* Specify the method for the initial request. The default method is GET.
95103
* @param verb The HTTP method.
@@ -138,6 +146,7 @@ class Builder {
138146
std::optional<std::chrono::milliseconds> read_timeout_;
139147
std::optional<std::chrono::milliseconds> write_timeout_;
140148
std::optional<std::chrono::milliseconds> connect_timeout_;
149+
std::optional<std::chrono::milliseconds> initial_reconnect_delay_;
141150
LogCallback logging_cb_;
142151
EventReceiver receiver_;
143152
ErrorCallback error_cb_;

libs/server-sent-events/src/client.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ auto const kDefaultUserAgent = BOOST_BEAST_VERSION_STRING;
3737
// Time duration used when no timeout is specified (1 year).
3838
auto const kNoTimeout = std::chrono::hours(8760);
3939

40+
auto const kDefaultInitialReconnectDelay = std::chrono::seconds(1);
41+
auto const kDefaultMaxReconnectDelay = std::chrono::seconds(30);
42+
4043
static boost::optional<net::ssl::context&> ToOptRef(
4144
std::optional<net::ssl::context>& maybe_val) {
4245
if (maybe_val) {
@@ -60,6 +63,7 @@ class FoxyClient : public Client,
6063
std::optional<std::chrono::milliseconds> connect_timeout,
6164
std::optional<std::chrono::milliseconds> read_timeout,
6265
std::optional<std::chrono::milliseconds> write_timeout,
66+
std::optional<std::chrono::milliseconds> initial_reconnect_delay,
6367
Builder::EventReceiver receiver,
6468
Builder::LogCallback logger,
6569
Builder::ErrorCallback errors,
@@ -75,7 +79,9 @@ class FoxyClient : public Client,
7579
launchdarkly::foxy::session_opts{
7680
ToOptRef(ssl_context_),
7781
connect_timeout.value_or(kNoTimeout)}),
78-
backoff_(std::chrono::seconds(1), std::chrono::seconds(30)),
82+
backoff_(
83+
initial_reconnect_delay.value_or(kDefaultInitialReconnectDelay),
84+
kDefaultMaxReconnectDelay),
7985
last_event_id_(std::nullopt),
8086
backoff_timer_(session_.get_executor()),
8187
event_receiver_(std::move(receiver)),
@@ -347,6 +353,7 @@ Builder::Builder(net::any_io_executor ctx, std::string url)
347353
read_timeout_{std::nullopt},
348354
write_timeout_{std::nullopt},
349355
connect_timeout_{std::nullopt},
356+
initial_reconnect_delay_{std::nullopt},
350357
logging_cb_([](auto msg) {}),
351358
receiver_([](launchdarkly::sse::Event const&) {}),
352359
error_cb_([](auto err) {}) {
@@ -382,6 +389,11 @@ Builder& Builder::write_timeout(std::chrono::milliseconds timeout) {
382389
return *this;
383390
}
384391

392+
Builder& Builder::initial_reconnect_delay(std::chrono::milliseconds delay) {
393+
initial_reconnect_delay_ = delay;
394+
return *this;
395+
}
396+
385397
Builder& Builder::method(http::verb verb) {
386398
request_.method(verb);
387399
return *this;
@@ -441,8 +453,8 @@ std::shared_ptr<Client> Builder::build() {
441453

442454
return std::make_shared<FoxyClient>(
443455
net::make_strand(executor_), request, host, service, connect_timeout_,
444-
read_timeout_, write_timeout_, receiver_, logging_cb_, error_cb_,
445-
std::move(ssl));
456+
read_timeout_, write_timeout_, initial_reconnect_delay_, receiver_,
457+
logging_cb_, error_cb_, std::move(ssl));
446458
}
447459

448460
} // namespace launchdarkly::sse

0 commit comments

Comments
 (0)