13#include <shared_mutex>
50 return count >= threshold;
64 std::string
id = session_id.empty() ?
generate_id(
"session_") : session_id;
66 auto [it, inserted] =
sessions_.emplace(
id, std::move(handle));
82 std::string
id = session_id.empty() ?
generate_id(
"session_") : session_id;
84 auto [it, inserted] =
sessions_.emplace(
id, std::move(handle));
107 return (it !=
sessions_.end()) ? &it->second :
nullptr;
110 [[nodiscard]]
auto get_session(
const std::string& session_id)
const
114 return (it !=
sessions_.end()) ? &it->second :
nullptr;
122 callback(it->second);
128 [[nodiscard]]
auto has_session(
const std::string& session_id)
const ->
bool {
135 std::vector<std::string> ids;
137 for (
const auto& [
id, handle] :
sessions_) {
156 const std::function<
void(
const session_handle&)>& callback)
const ->
void {
158 for (
const auto& [
id, handle] :
sessions_) {
165 size_t sent_count = 0;
168 if (handle.is_connected()) {
169 std::vector<uint8_t> copy = data;
170 auto result = handle.send(std::move(copy));
171 if (result.is_ok()) {
187 it->second.update_activity();
194 std::vector<std::string> to_remove;
199 for (
const auto& [
id, handle] :
sessions_) {
200 if (handle.has_activity_tracking() &&
202 to_remove.push_back(
id);
209 for (
const auto&
id : to_remove) {
272 return static_cast<double>(
session_count_.load(std::memory_order_acquire)) /
294 .active_sessions =
session_count_.load(std::memory_order_acquire),
308 static auto generate_id(
const std::string& prefix) -> std::string {
309 static std::atomic<uint64_t> counter{0};
310 return prefix + std::to_string(counter.fetch_add(1, std::memory_order_relaxed));
316 std::unordered_map<std::string, session_handle>
sessions_;
345 const std::string& session_id) ->
bool {
346 return impl_->add_session(std::move(handle), session_id);
350 return impl_->remove_session(session_id);
355 return impl_->get_session(session_id);
360 return impl_->get_session(session_id);
364 const std::string& session_id,
366 return impl_->with_session(session_id, callback);
371 return impl_->has_session(session_id);
375 -> std::vector<std::
string> {
381 impl_->for_each_mutable(callback);
385 const std::function<
void(
const session_handle&)>& callback)
const ->
void {
386 impl_->for_each_const(callback);
390 return impl_->broadcast(std::move(data));
395 return impl_->update_activity(session_id);
399 return impl_->cleanup_idle_sessions();
403 impl_->clear_all_sessions();
407 impl_->clear_all_sessions();
431 impl_->set_max_sessions(max_sessions);
445 return impl::generate_id(prefix);
449 const std::string& session_id)
451 return impl_->add_session(std::move(handle), session_id);
455 session_handle handle,
const std::string& session_id) -> std::string {
456 return impl_->add_session_with_id(std::move(handle), session_id);
460 impl_->increment_rejected();
Value-semantic wrapper for type-erased sessions.
PIMPL implementation hiding all template-related code.
std::atomic< uint64_t > total_rejected_
auto is_backpressure_active() const -> bool
unified_session_config config_
auto get_all_session_ids() const -> std::vector< std::string >
std::atomic< uint64_t > total_accepted_
std::unordered_map< std::string, session_handle > sessions_
auto has_session(const std::string &session_id) const -> bool
auto remove_session(const std::string &session_id) -> bool
auto add_session(session_handle handle, const std::string &session_id) -> bool
auto update_activity(const std::string &session_id) -> bool
auto add_session_with_id(session_handle handle, const std::string &session_id) -> std::string
auto set_max_sessions(size_t max_sessions) -> void
auto get_session(const std::string &session_id) const -> const session_handle *
auto with_session(const std::string &session_id, const std::function< void(session_handle &)> &callback) -> bool
auto for_each_const(const std::function< void(const session_handle &)> &callback) const -> void
static auto generate_id(const std::string &prefix) -> std::string
impl(const unified_session_config &config)
auto get_total_accepted() const -> uint64_t
std::atomic< uint64_t > total_cleaned_up_
auto clear_all_sessions() -> void
auto broadcast(std::vector< uint8_t > data) -> size_t
auto increment_rejected() -> void
std::shared_mutex sessions_mutex_
auto cleanup_idle_sessions() -> size_t
auto get_total_rejected() const -> uint64_t
auto can_accept_connection() const -> bool
auto get_config() const -> const unified_session_config &
auto get_utilization() const -> double
auto for_each_mutable(const std::function< void(session_handle &)> &callback) -> void
auto get_session_count() const -> size_t
auto get_total_cleaned_up() const -> uint64_t
std::atomic< size_t > session_count_
auto get_stats() const -> unified_session_manager::stats
auto get_session(const std::string &session_id) -> session_handle *
Type-erased session manager that handles any session type.
auto get_total_cleaned_up() const -> uint64_t
Get total cleaned up sessions.
auto is_backpressure_active() const -> bool
Check if backpressure should be applied.
auto get_all_session_ids() const -> std::vector< std::string >
Get all session IDs.
auto add_session_with_id_impl(session_handle handle, const std::string &session_id) -> std::string
auto broadcast(std::vector< uint8_t > data) -> size_t
Broadcast data to all connected sessions.
auto cleanup_idle_sessions() -> size_t
Cleanup idle sessions that exceeded idle_timeout.
auto update_activity(const std::string &session_id) -> bool
Update activity timestamp for a session.
auto with_session(const std::string &session_id, const std::function< void(session_handle &)> &callback) -> bool
Execute a callback with a session (safer than get_session)
auto get_total_accepted() const -> uint64_t
Get total accepted connections.
auto get_stats() const -> stats
Get comprehensive statistics.
auto stop_all_sessions() -> void
Stop all sessions (alias for clear_all_sessions)
auto add_session(std::shared_ptr< SessionType > session, const std::string &session_id="") -> bool
Add a session using type erasure.
auto set_max_sessions(size_t max_sessions) -> void
Set maximum sessions.
auto get_utilization() const -> double
Get current session utilization.
auto increment_rejected() -> void
auto has_session(const std::string &session_id) const -> bool
Check if a session exists.
unified_session_manager()
Constructs a unified session manager with default configuration.
auto remove_session(const std::string &session_id) -> bool
Remove session by ID.
auto for_each(const std::function< void(session_handle &)> &callback) -> void
Execute a callback for each session.
~unified_session_manager()
auto get_total_rejected() const -> uint64_t
Get total rejected connections.
auto add_session_impl(session_handle handle, const std::string &session_id) -> bool
auto get_session(const std::string &session_id) -> session_handle *
Get session handle by ID (non-owning reference)
std::unique_ptr< impl > impl_
auto can_accept_connection() const -> bool
Check if new connection can be accepted.
auto get_session_count() const -> size_t
Get current session count.
auto get_config() const -> const unified_session_config &
Get current configuration.
static auto generate_id(const std::string &prefix="session_") -> std::string
Generate a unique session ID.
auto clear_all_sessions() -> void
Clear all sessions.
Configuration for unified session management.
double backpressure_threshold
std::chrono::milliseconds idle_timeout
Comprehensive session manager statistics.