C++ Server-Side SDK
LaunchDarkly SDK
conditions.hpp
1 #pragma once
2 
3 #include "../../data_interfaces/source/ifdv2_condition.hpp"
4 
5 #include <launchdarkly/async/cancellation.hpp>
6 #include <launchdarkly/async/promise.hpp>
7 
8 #include <boost/asio/any_io_executor.hpp>
9 
10 #include <chrono>
11 #include <cstdint>
12 #include <memory>
13 #include <mutex>
14 #include <optional>
15 #include <vector>
16 
17 namespace launchdarkly::server_side::data_systems {
18 
30  public:
31  TimedCondition(boost::asio::any_io_executor executor,
32  std::chrono::milliseconds timeout);
33 
34  ~TimedCondition() override;
35 
36  [[nodiscard]] async::Future<Type> Execute() override;
37 
38  void Close() override;
39 
40  protected:
46  void ArmTimer();
47 
52  void CancelTimer();
53 
54  private:
55  struct State {
56  std::mutex mutex;
57  bool closed = false;
58  async::Promise<Type> promise;
59  std::optional<async::CancellationSource> timer_cancel;
60  };
61 
62  boost::asio::any_io_executor const executor_;
63  std::chrono::milliseconds const timeout_;
64  std::shared_ptr<State> const state_;
65 };
66 
72 class FallbackCondition final : public TimedCondition {
73  public:
74  FallbackCondition(boost::asio::any_io_executor executor,
75  std::chrono::milliseconds timeout);
76 
77  void Inform(data_interfaces::FDv2SourceResult const& result) override;
78 
79  [[nodiscard]] Type GetType() const override { return Type::kFallback; }
80 };
81 
87 class RecoveryCondition final : public TimedCondition {
88  public:
89  RecoveryCondition(boost::asio::any_io_executor executor,
90  std::chrono::milliseconds timeout);
91 
92  void Inform(data_interfaces::FDv2SourceResult const& result) override;
93 
94  [[nodiscard]] Type GetType() const override { return Type::kRecovery; }
95 };
96 
102  public:
103  FallbackConditionFactory(boost::asio::any_io_executor executor,
104  std::chrono::milliseconds timeout);
105 
106  [[nodiscard]] std::unique_ptr<data_interfaces::IFDv2Condition> Build()
107  override;
108 
110  const override;
111 
112  private:
113  boost::asio::any_io_executor const executor_;
114  std::chrono::milliseconds const timeout_;
115 };
116 
122  public:
123  RecoveryConditionFactory(boost::asio::any_io_executor executor,
124  std::chrono::milliseconds timeout);
125 
126  [[nodiscard]] std::unique_ptr<data_interfaces::IFDv2Condition> Build()
127  override;
128 
130  const override;
131 
132  private:
133  boost::asio::any_io_executor const executor_;
134  std::chrono::milliseconds const timeout_;
135 };
136 
145 class Conditions final {
146  public:
147  explicit Conditions(
148  std::vector<std::unique_ptr<data_interfaces::IFDv2Condition>>
149  conditions);
150 
151  ~Conditions();
152 
153  Conditions(Conditions const&) = delete;
154  Conditions(Conditions&&) = delete;
155  Conditions& operator=(Conditions const&) = delete;
156  Conditions& operator=(Conditions&&) = delete;
157 
164  [[nodiscard]] async::Future<data_interfaces::IFDv2Condition::Type>
165  GetFuture(async::CancellationToken token);
166 
167  void Inform(data_interfaces::FDv2SourceResult const& result);
168 
169  void Close();
170 
171  private:
172  struct PendingEntry {
173  std::int64_t id;
174  async::Promise<data_interfaces::IFDv2Condition::Type> promise;
175  std::unique_ptr<async::CancellationCallback> cancel_cb;
176  };
177 
178  struct State {
179  std::mutex mutex;
180  std::int64_t next_id = 0;
181  std::vector<PendingEntry> pending;
182  std::optional<data_interfaces::IFDv2Condition::Type> aggregate_result;
183  };
184 
185  std::vector<std::unique_ptr<data_interfaces::IFDv2Condition>> conditions_;
186  std::shared_ptr<State> const state_;
187 };
188 
189 } // namespace launchdarkly::server_side::data_systems
async::Future< data_interfaces::IFDv2Condition::Type > GetFuture(async::CancellationToken token)
Definition: conditions.cpp:164
data_interfaces::IFDv2Condition::Type GetType() const override
Definition: conditions.cpp:101
void Inform(data_interfaces::FDv2SourceResult const &result) override
Definition: conditions.cpp:76
Type GetType() const override
Definition: conditions.hpp:79
data_interfaces::IFDv2Condition::Type GetType() const override
Definition: conditions.cpp:114
Type GetType() const override
Definition: conditions.hpp:94
void Inform(data_interfaces::FDv2SourceResult const &result) override
Definition: conditions.cpp:90
async::Future< Type > Execute() override
Definition: conditions.cpp:24
void Close() override
Definition: conditions.cpp:29
void CancelTimer()
Definition: conditions.cpp:64
void ArmTimer()
Definition: conditions.cpp:44