ORE Studio 0.0.4
Loading...
Searching...
No Matches
subscription_manager.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 *
3 * Copyright (C) 2025 Marco Craveiro <marco.craveiro@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20#ifndef ORES_COMMS_SERVICE_SUBSCRIPTION_MANAGER_HPP
21#define ORES_COMMS_SERVICE_SUBSCRIPTION_MANAGER_HPP
22
23#include <mutex>
24#include <string>
25#include <vector>
26#include <chrono>
27#include <memory>
28#include <functional>
29#include <unordered_map>
30#include <unordered_set>
31#include "ores.utility/log/make_logger.hpp"
32
33namespace ores::comms::service {
34
41using notification_callback =
42 std::function<bool(const std::string&, std::chrono::system_clock::time_point)>;
43
50using session_id = std::string;
51
84private:
85 [[nodiscard]] static auto& lg() {
86 using namespace ores::utility::log;
87 static auto instance = make_logger(
88 "ores.comms.service.subscription_manager");
89 return instance;
90 }
91
92 struct session_info {
93 notification_callback callback;
94 std::unordered_set<std::string> subscribed_events;
95 };
96
97public:
98 subscription_manager() = default;
99 ~subscription_manager() = default;
100
102 subscription_manager& operator=(const subscription_manager&) = delete;
104 subscription_manager& operator=(subscription_manager&&) = delete;
105
114 void register_session(const session_id& id, notification_callback callback);
115
124 void unregister_session(const session_id& id);
125
133 bool subscribe(const session_id& id, const std::string& event_type);
134
143 bool unsubscribe(const session_id& id, const std::string& event_type);
144
156 std::size_t notify(const std::string& event_type,
157 std::chrono::system_clock::time_point timestamp);
158
165 [[nodiscard]] std::size_t subscriber_count(const std::string& event_type) const;
166
172 [[nodiscard]] std::size_t session_count() const;
173
180 [[nodiscard]] std::vector<std::string> get_subscriptions(const session_id& id) const;
181
182private:
183 mutable std::mutex mutex_;
184 std::unordered_map<session_id, session_info> sessions_;
185 std::unordered_map<std::string, std::unordered_set<session_id>> event_subscribers_;
186};
187
188}
189
190#endif
Implements logging for ORE Studio.
Definition lifecycle_manager.hpp:30
Manages client subscriptions to event notifications.
Definition subscription_manager.hpp:83
std::size_t session_count() const
Get the total number of registered sessions.
Definition subscription_manager.cpp:219
std::vector< std::string > get_subscriptions(const session_id &id) const
Get the event types a session is subscribed to.
Definition subscription_manager.cpp:224
void unregister_session(const session_id &id)
Unregister a session from the subscription manager.
Definition subscription_manager.cpp:45
bool subscribe(const session_id &id, const std::string &event_type)
Subscribe a session to an event type.
Definition subscription_manager.cpp:78
bool unsubscribe(const session_id &id, const std::string &event_type)
Unsubscribe a session from an event type.
Definition subscription_manager.cpp:109
void register_session(const session_id &id, notification_callback callback)
Register a new session with the subscription manager.
Definition subscription_manager.cpp:26
std::size_t subscriber_count(const std::string &event_type) const
Get the number of subscribers for an event type.
Definition subscription_manager.cpp:208
std::size_t notify(const std::string &event_type, std::chrono::system_clock::time_point timestamp)
Notify all subscribers of an event.
Definition subscription_manager.cpp:148