PubSubListener.hpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. /**
  14. * Base class for GCP PubSub listeners
  15. */
  16. class PubSubListener : public NotificationListener {
  17. public:
  18. PubSubListener(std::string controller_id, std::string project, std::string topic);
  19. virtual ~PubSubListener();
  20. virtual bool onNotification(const std::string& payload) = 0;
  21. protected:
  22. std::string _controller_id;
  23. std::string _project;
  24. std::string _topic;
  25. std::string _subscription_id;
  26. private:
  27. void subscribe();
  28. bool _run = false;
  29. google::cloud::pubsub_admin::SubscriptionAdminClient _adminClient;
  30. google::cloud::pubsub::Subscription* _subscription;
  31. std::shared_ptr<google::cloud::pubsub::Subscriber> _subscriber;
  32. std::thread _subscriberThread;
  33. };
  34. /**
  35. * Listener for network notifications via GCP PubSub
  36. */
  37. class PubSubNetworkListener : public PubSubListener {
  38. public:
  39. PubSubNetworkListener(std::string controller_id, std::string project, std::string topic, DB* db);
  40. virtual ~PubSubNetworkListener();
  41. virtual bool onNotification(const std::string& payload) override;
  42. private:
  43. DB* _db;
  44. };
  45. /**
  46. * Listener for member notifications via GCP PubSub
  47. */
  48. class PubSubMemberListener : public PubSubListener {
  49. public:
  50. PubSubMemberListener(std::string controller_id, std::string project, std::string topic, DB* db);
  51. virtual ~PubSubMemberListener();
  52. virtual bool onNotification(const std::string& payload) override;
  53. private:
  54. DB* _db;
  55. };
  56. } // namespace ZeroTier
  57. #endif // ZT_CONTROLLER_PUBSUBLISTENER_HPP
  58. #endif // ZT_CONTROLLER_USE_LIBPQ