diff options
author | Michael Jurkoic <mjjurkoic@gmail.com> | 2024-04-10 21:33:45 -0500 |
---|---|---|
committer | Michael Jurkoic <mjjurkoic@gmail.com> | 2024-04-10 21:33:45 -0500 |
commit | c8bb6c8f56e0c6d93c8623722ab932c04de882b5 (patch) | |
tree | b61f055748e8c8058f9d27c1441bf68d3bca030d /include | |
parent | 0a185a13aa4c202ad8d76ac3e62a878dc5f06619 (diff) |
Handle relay response messages
These changes do not yet have unit tests.
Diffstat (limited to 'include')
-rw-r--r-- | include/client/web_socket_client.hpp | 13 | ||||
-rw-r--r-- | include/nostr.hpp | 44 |
2 files changed, 52 insertions, 5 deletions
diff --git a/include/client/web_socket_client.hpp b/include/client/web_socket_client.hpp index 3ef2b86..6fbede6 100644 --- a/include/client/web_socket_client.hpp +++ b/include/client/web_socket_client.hpp @@ -43,6 +43,19 @@ public: virtual std::tuple<std::string, bool> send(std::string message, std::string uri) = 0; /** + * @brief Sends the given message to the given server and sets up a message handler for + * messages received from the server. + * @returns A tuple indicating the server URI and whether the message was successfully + * sent. + * @remark Use this method to send a message and set up a message handler for responses in the + * same call. + */ + virtual std::tuple<std::string, bool> send( + std::string message, + std::string uri, + std::function<void(const std::string&)> messageHandler) = 0; + + /** * @brief Sets up a message handler for the given server. * @param uri The URI of the server to which the message handler should be attached. * @param messageHandler A callable object that will be invoked with the payload the client diff --git a/include/nostr.hpp b/include/nostr.hpp index e450505..62eceff 100644 --- a/include/nostr.hpp +++ b/include/nostr.hpp @@ -157,10 +157,24 @@ public: * @returns A tuple of `RelayList` objects, of the form `<successes, failures>`, indicating * to which relays the event was published successfully, and to which relays the event failed * to publish. - */ + */ std::tuple<RelayList, RelayList> publishEvent(std::shared_ptr<Event> event); /** + * @brief Queries all open relay connections for events matching the given set of filters, and + * returns all stored matching events returned by the relays. + * @param filters The filters to use for the query. + * @returns A vector of all events matching the filters from all open relay connections. + * @remark This method runs until the relays send an EOSE message, indicating they have no more + * stored events matching the given filters. When the EOSE message is received, the method + * will close the subscription for each relay and return the received events. + * @remark Use this method to fetch a batch of events from the relays. A `limit` value must be + * set on the filters in the range 1-64, inclusive. If no valid limit is given, it will be + * defaulted to 16. + */ + std::vector<std::shared_ptr<Event>> queryRelays(std::shared_ptr<Filters> filters); + + /** * @brief Queries all open relay connections for events matching the given set of filters. * @param filters The filters to use for the query. * @param responseHandler A callable object that will be invoked each time the client receives @@ -172,7 +186,9 @@ public: */ std::string queryRelays( std::shared_ptr<Filters> filters, - std::function<void(const std::string&, std::shared_ptr<Event>)> responseHandler); + std::function<void(const std::string&, std::shared_ptr<Event>)> eventHandler, + std::function<void(const std::string&)> eoseHandler, + std::function<void(const std::string&, const std::string&)> closeHandler); /** * @brief Closes the subscription with the given ID on all open relay connections. @@ -269,11 +285,29 @@ private: bool hasSubscription(std::string relay, std::string subscriptionId); /** - * @brief Parses messages received from the relay and invokes the appropriate message handler. + * @brief Parses EVENT messages received from the relay and invokes the given event handler. + * @param message The raw message received from the relay. + * @param eventHandler A callable object that will be invoked with the subscription ID and the + * payload of the event. + * @param eoseHandler A callable object that will be invoked with the subscription ID when the + * relay sends an EOSE message, indicating it has reached the end of stored events for the + * given query. + * @param closeHandler A callable object that will be invoked with the subscription ID and the + * message sent by the relay if the subscription is ended by the relay. */ - void onMessage( + void onSubscriptionMessage( std::string message, - std::function<void(const std::string&, std::shared_ptr<Event>)> eventHandler); + std::function<void(const std::string&, std::shared_ptr<Event>)> eventHandler, + std::function<void(const std::string&)> eoseHandler, + std::function<void(const std::string&, const std::string&)> closeHandler); + + /** + * @brief Parses OK messages received from the relay and invokes the given acceptance handler. + * @remark The OK message type is sent to indicate whether the relay has accepted an event sent + * by the client. Note that this is distinct from whether the message was successfully sent to + * the relay over the WebSocket connection. + */ + void onAcceptance(std::string message, std::function<void(const bool)> acceptanceHandler); }; class ISigner |