C++ Client-Side SDK
LaunchDarkly SDK
client_impl.hpp
1 #pragma once
2 
3 #include "data_sources/data_source.hpp"
4 #include "data_sources/data_source_status_manager.hpp"
5 #include "flag_manager/flag_manager.hpp"
6 
7 #include <launchdarkly/client_side/client.hpp>
8 #include <launchdarkly/client_side/data_source_status.hpp>
9 #include <launchdarkly/client_side/flag_notifier.hpp>
10 #include <launchdarkly/config/client.hpp>
11 #include <launchdarkly/context.hpp>
12 #include <launchdarkly/data/evaluation_detail.hpp>
13 #include <launchdarkly/error.hpp>
14 #include <launchdarkly/events/event_processor_interface.hpp>
15 #include <launchdarkly/logging/logger.hpp>
16 #include <launchdarkly/value.hpp>
17 
18 #include <boost/asio/executor_work_guard.hpp>
19 #include <boost/asio/io_context.hpp>
20 
21 #include <condition_variable>
22 #include <cstdint>
23 #include <memory>
24 #include <optional>
25 #include <shared_mutex>
26 #include <string>
27 #include <thread>
28 #include <unordered_set>
29 
30 namespace launchdarkly::client_side {
31 class ClientImpl : public IClient {
32  public:
33  ClientImpl(Config config, Context context, std::string const& version);
34 
35  ClientImpl(ClientImpl&&) = delete;
36  ClientImpl(ClientImpl const&) = delete;
37  ClientImpl& operator=(ClientImpl) = delete;
38  ClientImpl& operator=(ClientImpl&& other) = delete;
39 
40  bool Initialized() const override;
41 
42  using FlagKey = std::string;
43  [[nodiscard]] std::unordered_map<FlagKey, Value> AllFlags() const override;
44 
45  void Track(std::string event_name,
46  Value data,
47  double metric_value) override;
48 
49  void Track(std::string event_name, Value data) override;
50 
51  void Track(std::string event_name) override;
52 
53  void FlushAsync() override;
54 
55  std::future<bool> IdentifyAsync(Context context) override;
56 
57  bool BoolVariation(FlagKey const& key, bool default_value) override;
58 
60  bool default_value) override;
61 
62  std::string StringVariation(FlagKey const& key,
63  std::string default_value) override;
64 
66  FlagKey const& key,
67  std::string default_value) override;
68 
69  double DoubleVariation(FlagKey const& key, double default_value) override;
70 
72  FlagKey const& key,
73  double default_value) override;
74 
75  int IntVariation(FlagKey const& key, int default_value) override;
76 
78  int default_value) override;
79 
80  Value JsonVariation(FlagKey const& key, Value default_value) override;
81 
83  Value default_value) override;
84 
86 
88 
89  ~ClientImpl();
90 
91  std::future<bool> StartAsync() override;
92 
93  private:
94  template <typename T>
95  [[nodiscard]] EvaluationDetail<T> VariationInternal(FlagKey const& key,
96  Value default_value,
97  bool check_type,
98  bool detailed,
99  std::unordered_set<std::string>* visited = nullptr);
100  void TrackInternal(std::string event_name,
101  std::optional<Value> data,
102  std::optional<double> metric_value);
103 
104  template <typename F>
105  auto ReadContextSynchronized(F fn) const
106  -> std::invoke_result_t<F, Context const&> {
107  std::shared_lock lock(context_mutex_);
108  return fn(context_);
109  }
110 
111  void UpdateContextSynchronized(Context context);
112 
113  void RestartDataSource();
114 
115  std::future<bool> StartAsyncInternal();
116  Config config_;
117  Logger logger_;
118 
120 
121  boost::asio::io_context ioc_;
122  boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
123  work_;
124 
125  Context context_;
126  mutable std::shared_mutex context_mutex_;
127 
128  flag_manager::FlagManager flag_manager_;
129  std::function<std::shared_ptr<data_sources::IDataSource>()>
130  data_source_factory_;
131 
132  std::shared_ptr<data_sources::IDataSource> data_source_;
133 
134  std::unique_ptr<events::IEventProcessor> event_processor_;
135 
136  mutable std::mutex init_mutex_;
137  std::condition_variable init_waiter_;
138 
140 
141  std::thread run_thread_;
142 
143  bool eval_reasons_available_;
144 };
145 } // namespace launchdarkly::client_side
Definition: context.hpp:29
Definition: evaluation_detail.hpp:18
Definition: value.hpp:42
Definition: client_impl.hpp:31
bool Initialized() const override
Definition: client_impl.cpp:206
std::string StringVariation(FlagKey const &key, std::string default_value) override
Definition: client_impl.cpp:391
Value JsonVariation(FlagKey const &key, Value default_value) override
Definition: client_impl.cpp:424
EvaluationDetail< Value > JsonVariationDetail(FlagKey const &key, Value default_value) override
Definition: client_impl.cpp:418
void FlushAsync() override
Definition: client_impl.cpp:242
flag_manager::IFlagNotifier & FlagNotifier() override
Definition: client_impl.cpp:434
EvaluationDetail< int > IntVariationDetail(FlagKey const &key, int default_value) override
Definition: client_impl.cpp:408
std::future< bool > IdentifyAsync(Context context) override
Definition: client_impl.cpp:161
std::future< bool > StartAsync() override
Definition: client_impl.cpp:202
void Track(std::string event_name, Value data, double metric_value) override
Definition: client_impl.cpp:228
std::unordered_map< FlagKey, Value > AllFlags() const override
Definition: client_impl.cpp:210
EvaluationDetail< std::string > StringVariationDetail(FlagKey const &key, std::string default_value) override
Definition: client_impl.cpp:384
data_sources::IDataSourceStatusProvider & DataSourceStatus() override
Definition: client_impl.cpp:430
bool BoolVariation(FlagKey const &key, bool default_value) override
Definition: client_impl.cpp:379
EvaluationDetail< double > DoubleVariationDetail(FlagKey const &key, double default_value) override
Definition: client_impl.cpp:397
int IntVariation(FlagKey const &key, int default_value) override
Definition: client_impl.cpp:414
double DoubleVariation(FlagKey const &key, double default_value) override
Definition: client_impl.cpp:403
EvaluationDetail< bool > BoolVariationDetail(FlagKey const &key, bool default_value) override
Definition: client_impl.cpp:373
Definition: client.hpp:26
std::string FlagKey
Definition: client.hpp:31
Definition: data_source_status_manager.hpp:17
Definition: http_properties.hpp:70
Definition: config.hpp:20