PubSubListener.hpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifdef ZT_CONTROLLER_USE_LIBPQ
  2. #ifndef ZT_CONTROLLER_PUBSUBLISTENER_HPP
  3. #define ZT_CONTROLLER_PUBSUBLISTENER_HPP
  4. #include "NotificationListener.hpp"
  5. #include "rustybits.h"
  6. #include <google/cloud/pubsub/admin/subscription_admin_client.h>
  7. #include <google/cloud/pubsub/subscriber.h>
  8. #include <memory>
  9. #include <string>
  10. #include <thread>
  11. namespace ZeroTier {
  12. class DB;
  13. struct PubSubConfig {
  14. const char* controller_id;
  15. std::string project;
  16. std::string topic;
  17. uint64_t listen_timeout;
  18. };
  19. /**
  20. * Base class for GCP PubSub listeners
  21. */
  22. class PubSubListener : public NotificationListener {
  23. public:
  24. PubSubListener(std::string controller_id, std::string project, std::string topic);
  25. virtual ~PubSubListener();
  26. virtual void onNotification(const std::string& payload) = 0;
  27. protected:
  28. std::string _controller_id;
  29. std::string _project;
  30. std::string _topic;
  31. std::string _subscription_id;
  32. private:
  33. void subscribe();
  34. bool _run = false;
  35. google::cloud::pubsub_admin::SubscriptionAdminClient _adminClient;
  36. google::cloud::pubsub::Subscription _subscription;
  37. std::shared_ptr<google::cloud::pubsub::Subscriber> _subscriber;
  38. google::cloud::future<google::cloud::Status> _session;
  39. std::thread _subscriberThread;
  40. };
  41. /**
  42. * Listener for network notifications via GCP PubSub
  43. */
  44. class PubSubNetworkListener : public PubSubListener {
  45. public:
  46. PubSubNetworkListener(std::string controller_id, std::string project, DB* db);
  47. virtual ~PubSubNetworkListener();
  48. virtual void onNotification(const std::string& payload) override;
  49. private:
  50. DB* _db;
  51. };
  52. /**
  53. * Listener for member notifications via GCP PubSub
  54. */
  55. class PubSubMemberListener : public PubSubListener {
  56. public:
  57. PubSubMemberListener(std::string controller_id, std::string project, DB* db);
  58. virtual ~PubSubMemberListener();
  59. virtual void onNotification(const std::string& payload) override;
  60. private:
  61. DB* _db;
  62. };
  63. } // namespace ZeroTier
  64. #endif // ZT_CONTROLLER_PUBSUBLISTENER_HPP
  65. #endif // ZT_CONTROLLER_USE_LIBPQ