Skip to content

Commit 6f968ed

Browse files
authored
feat: Add support for basic offline mode. (#94)
1 parent 4577ac6 commit 6f968ed

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

libs/client-sdk/src/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ add_library(${LIBNAME}
3434
flag_manager/flag_store.hpp
3535
flag_manager/flag_updater.hpp
3636
event_processor.hpp
37+
bindings/c/sdk.cpp
38+
data_sources/null_data_source.cpp
3739
flag_manager/context_index.cpp
3840
serialization/json_all_flags.hpp
3941
serialization/json_all_flags.cpp

libs/client-sdk/src/client_impl.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <utility>
66

77
#include "client_impl.hpp"
8+
#include "data_sources/null_data_source.hpp"
89
#include "data_sources/polling_data_source.hpp"
910
#include "data_sources/streaming_data_source.hpp"
1011

@@ -34,6 +35,10 @@ static std::shared_ptr<IDataSource> MakeDataSource(
3435
IDataSourceUpdateSink& flag_updater,
3536
data_sources::DataSourceStatusManager& status_manager,
3637
Logger& logger) {
38+
if (config.Offline()) {
39+
return std::make_shared<data_sources::NullDataSource>(executor,
40+
status_manager);
41+
}
3742
if (config.DataSourceConfig().method.index() == 0) {
3843
// TODO: use initial reconnect delay.
3944
return std::make_shared<
@@ -84,7 +89,7 @@ ClientImpl::ClientImpl(Config config, Context context)
8489
eval_reasons_available_(config.DataSourceConfig().with_reasons) {
8590
flag_manager_.LoadCache(context_);
8691

87-
if (config.Events().Enabled()) {
92+
if (config.Events().Enabled() && !config.Offline()) {
8893
event_processor_ = std::make_unique<EventProcessor>(ioc_.get_executor(),
8994
config, logger_);
9095
} else {
@@ -103,6 +108,11 @@ ClientImpl::ClientImpl(Config config, Context context)
103108
}
104109
});
105110

111+
if (config.Offline()) {
112+
LD_LOG(logger_, LogLevel::kInfo)
113+
<< "Starting LaunchDarkly client in offline mode";
114+
}
115+
106116
// Should listen to status before attempting to start.
107117
data_source_->Start();
108118

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include "null_data_source.hpp"
2+
3+
#include <boost/asio/post.hpp>
4+
5+
namespace launchdarkly::client_side::data_sources {
6+
7+
void NullDataSource::Start() {
8+
status_manager_.SetState(DataSourceStatus::DataSourceState::kSetOffline);
9+
}
10+
11+
void NullDataSource::ShutdownAsync(std::function<void()> complete) {
12+
boost::asio::post(exec_, complete);
13+
}
14+
15+
NullDataSource::NullDataSource(boost::asio::any_io_executor exec,
16+
DataSourceStatusManager& status_manager)
17+
: status_manager_(status_manager), exec_(exec) {}
18+
19+
} // namespace launchdarkly::client_side::data_sources
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
#include <boost/asio/any_io_executor.hpp>
4+
5+
#include "data_source.hpp"
6+
#include "data_source_status_manager.hpp"
7+
8+
namespace launchdarkly::client_side::data_sources {
9+
10+
class NullDataSource : public IDataSource {
11+
public:
12+
explicit NullDataSource(boost::asio::any_io_executor exec,
13+
DataSourceStatusManager& status_manager);
14+
void Start() override;
15+
void ShutdownAsync(std::function<void()>) override;
16+
17+
private:
18+
DataSourceStatusManager& status_manager_;
19+
boost::asio::any_io_executor exec_;
20+
};
21+
22+
} // namespace launchdarkly::client_side::data_sources

0 commit comments

Comments
 (0)