PubSubListener.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. std::thread _subscriberThread;
  39. };
  40. /**
  41. * Listener for network notifications via GCP PubSub
  42. */
  43. class PubSubNetworkListener : public PubSubListener {
  44. public:
  45. PubSubNetworkListener(std::string controller_id, std::string project, DB* db);
  46. virtual ~PubSubNetworkListener();
  47. virtual void onNotification(const std::string& payload) override;
  48. private:
  49. DB* _db;
  50. };
  51. /**
  52. * Listener for member notifications via GCP PubSub
  53. */
  54. class PubSubMemberListener : public PubSubListener {
  55. public:
  56. PubSubMemberListener(std::string controller_id, std::string project, DB* db);
  57. virtual ~PubSubMemberListener();
  58. virtual void onNotification(const std::string& payload) override;
  59. private:
  60. DB* _db;
  61. };
  62. } // namespace ZeroTier
  63. #endif // ZT_CONTROLLER_PUBSUBLISTENER_HPP
  64. #endif // ZT_CONTROLLER_USE_LIBPQ