#pragma once #include "nostr.hpp" namespace nostr { class NostrServiceBase : public INostrServiceBase { public: NostrServiceBase( std::shared_ptr appender, std::shared_ptr client); NostrServiceBase( std::shared_ptr appender, std::shared_ptr client, std::vector relays); ~NostrServiceBase() override; std::vector defaultRelays() const; std::vector activeRelays() const; std::unordered_map> subscriptions() const; std::vector openRelayConnections() override; std::vector openRelayConnections(std::vector relays) override; void closeRelayConnections() override; void closeRelayConnections(std::vector relays) override; // TODO: Make this method return a promise. std::tuple, std::vector> publishEvent( std::shared_ptr event) override; // TODO: Make this method return a promise. // TODO: Add a timeout to this method to prevent hanging while waiting for the relay. std::vector> queryRelays( std::shared_ptr filters) override; std::string queryRelays( std::shared_ptr filters, std::function)> eventHandler, std::function eoseHandler, std::function closeHandler) override; std::tuple, std::vector> closeSubscription( std::string subscriptionId) override; bool closeSubscription(std::string subscriptionId, std::string relay) override; std::vector closeSubscriptions() override; private: ///< The maximum number of events the service will store for each subscription. const int MAX_EVENTS_PER_SUBSCRIPTION = 128; ///< The WebSocket client used to communicate with relays. std::shared_ptr _client; ///< A mutex to protect the instance properties. std::mutex _propertyMutex; ///< The default set of Nostr relays to which the service will attempt to connect. std::vector _defaultRelays; ///< The set of Nostr relays to which the service is currently connected. std::vector _activeRelays; ///< A map from subscription IDs to the relays on which each subscription is open. std::unordered_map> _subscriptions; std::vector _getConnectedRelays(std::vector relays); std::vector _getUnconnectedRelays(std::vector relays); bool _isConnected(std::string relay); void _eraseActiveRelay(std::string relay); void _connect(std::string relay); void _disconnect(std::string relay); std::string _generateSubscriptionId(); std::string _generateCloseRequest(std::string subscriptionId); bool _hasSubscription(std::string subscriptionId); bool _hasSubscription(std::string subscriptionId, std::string relay); void _onSubscriptionMessage( std::string message, std::function)> eventHandler, std::function eoseHandler, std::function closeHandler); void _onAcceptance(std::string message, std::function acceptanceHandler); }; } // namespace nostr