C++ Server-Side SDK
LaunchDarkly SDK
polling_synchronizer.hpp
1 #pragma once
2 
3 #include "../../data_interfaces/source/ifdv2_synchronizer.hpp"
4 
5 #include <launchdarkly/async/cancellation.hpp>
6 #include <launchdarkly/logging/logger.hpp>
7 #include <launchdarkly/network/requester.hpp>
8 #include <launchdarkly/server_side/config/built/all_built.hpp>
9 
10 #include <boost/asio/any_io_executor.hpp>
11 
12 #include <chrono>
13 #include <mutex>
14 #include <optional>
15 #include <string>
16 
17 namespace launchdarkly::server_side::data_systems {
18 
34  public:
40  boost::asio::any_io_executor const& executor,
41  Logger const& logger,
42  std::string polling_base_url,
43  config::built::HttpProperties const& http_properties,
44  std::optional<std::string> filter_key,
45  std::chrono::seconds poll_interval);
46 
47  ~FDv2PollingSynchronizer() override;
48 
49  async::Future<data_interfaces::FDv2SourceResult> Next(
50  data_model::Selector selector) override;
51 
52  void Close() override;
53 
54  [[nodiscard]] std::string const& Identity() const override;
55 
56  private:
57  // Any state that may be accessed by async callbacks needs to be inside this
58  // class, managed by a shared_ptr. All mutable members are guarded by the
59  // mutex.
60  class State {
61  public:
62  State(Logger logger,
63  boost::asio::any_io_executor const& executor,
64  std::chrono::seconds poll_interval,
65  std::string polling_base_url,
66  config::built::HttpProperties const& http_properties,
67  std::optional<std::string> filter_key);
68 
71  async::Future<network::HttpResult> Request(
72  data_model::Selector const& selector) const;
73 
75  data_interfaces::FDv2SourceResult HandlePollResult(
76  network::HttpResult const& res);
77 
81  async::Future<bool> CreatePollDelayFuture(
82  async::CancellationToken token = {});
83 
85  void RecordPollStarted();
86 
90  async::Future<bool> Delay(std::chrono::nanoseconds duration,
91  async::CancellationToken token = {});
92 
93  private:
94  // Logger is itself thread-safe.
95  Logger logger_;
96 
97  // Immutable state
98  std::chrono::seconds const poll_interval_;
99  std::string const polling_base_url_;
100  config::built::HttpProperties const http_properties_;
101  std::optional<std::string> const filter_key_;
102  network::Requester const requester_;
103  boost::asio::any_io_executor const executor_;
104 
105  // Mutable state, guarded by mutex_.
106  std::mutex mutex_;
107  std::optional<std::chrono::time_point<std::chrono::steady_clock>>
108  last_poll_start_;
109  };
110 
115  static async::Future<data_interfaces::FDv2SourceResult> DoNext(
116  std::shared_ptr<State> state,
117  async::Future<std::monostate> closed,
118  data_model::Selector selector);
119 
124  static async::Future<data_interfaces::FDv2SourceResult> DoPoll(
125  std::shared_ptr<State> state,
126  async::Future<std::monostate> closed,
127  data_model::Selector const& selector);
128 
129  // Resolved by Close() or on destruction, cancelling any outstanding Next()
130  // calls.
131  async::Promise<std::monostate> close_promise_;
132 
133  // Shared with async callbacks.
134  std::shared_ptr<State> state_;
135 };
136 
137 } // namespace launchdarkly::server_side::data_systems
Definition: http_properties.hpp:70
FDv2PollingSynchronizer(boost::asio::any_io_executor const &executor, Logger const &logger, std::string polling_base_url, config::built::HttpProperties const &http_properties, std::optional< std::string > filter_key, std::chrono::seconds poll_interval)
Definition: polling_synchronizer.cpp:81
async::Future< data_interfaces::FDv2SourceResult > Next(data_model::Selector selector) override
Definition: polling_synchronizer.cpp:105
std::string const & Identity() const override
Definition: polling_synchronizer.cpp:114
void Close() override
Definition: polling_synchronizer.cpp:110