Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
session_handle.h
Go to the documentation of this file.
1/*****************************************************************************
2BSD 3-Clause License
3
4Copyright (c) 2025, kcenon
5All rights reserved.
6*****************************************************************************/
7
8#pragma once
9
12
13#include <memory>
14#include <optional>
15#include <string>
16#include <string_view>
17
18namespace kcenon::network::core {
19
20// Import VoidResult from network namespace for convenience
22
62public:
66 session_handle() = default;
67
72 explicit session_handle(std::unique_ptr<session_concept> session_concept_ptr)
73 : concept_(std::move(session_concept_ptr)) {}
74
80 template <typename SessionType>
81 explicit session_handle(std::shared_ptr<SessionType> session)
82 : concept_(make_session_model(std::move(session))) {}
83
84 // Move-only semantics
87
90
91 ~session_handle() = default;
92
93 // =========================================================================
94 // Validity Check
95 // =========================================================================
96
101 [[nodiscard]] explicit operator bool() const noexcept {
102 return concept_ != nullptr;
103 }
104
109 [[nodiscard]] auto valid() const noexcept -> bool {
110 return concept_ != nullptr;
111 }
112
113 // =========================================================================
114 // Core Session Operations
115 // =========================================================================
116
121 [[nodiscard]] auto id() const -> std::string_view {
122 return concept_ ? concept_->id() : std::string_view{};
123 }
124
129 [[nodiscard]] auto is_connected() const -> bool {
130 return concept_ && concept_->is_connected();
131 }
132
138 [[nodiscard]] auto send(std::vector<uint8_t>&& data) -> VoidResult {
139 if (!concept_) {
140 return VoidResult::err(-1, "Invalid session handle");
141 }
142 return concept_->send(std::move(data));
143 }
144
148 auto close() -> void {
149 if (concept_) {
150 concept_->close();
151 }
152 }
153
157 auto stop() -> void {
158 if (concept_) {
159 concept_->stop();
160 }
161 }
162
163 // =========================================================================
164 // Type Recovery
165 // =========================================================================
166
181 template <typename T>
182 [[nodiscard]] auto as() noexcept -> T* {
183 if (!concept_ || concept_->type() != typeid(T)) {
184 return nullptr;
185 }
186 return static_cast<T*>(concept_->get_raw());
187 }
188
194 template <typename T>
195 [[nodiscard]] auto as() const noexcept -> const T* {
196 if (!concept_ || concept_->type() != typeid(T)) {
197 return nullptr;
198 }
199 return static_cast<const T*>(concept_->get_raw());
200 }
201
207 template <typename T>
208 [[nodiscard]] auto is_type() const noexcept -> bool {
209 return concept_ && concept_->type() == typeid(T);
210 }
211
216 [[nodiscard]] auto type() const noexcept -> const std::type_info& {
217 return concept_ ? concept_->type() : typeid(void);
218 }
219
220 // =========================================================================
221 // Activity Tracking
222 // =========================================================================
223
228 [[nodiscard]] auto has_activity_tracking() const noexcept -> bool {
229 return concept_ && concept_->has_activity_tracking();
230 }
231
236 [[nodiscard]] auto created_at() const -> std::chrono::steady_clock::time_point {
237 return concept_ ? concept_->created_at()
238 : std::chrono::steady_clock::time_point{};
239 }
240
245 [[nodiscard]] auto last_activity() const -> std::chrono::steady_clock::time_point {
246 return concept_ ? concept_->last_activity()
247 : std::chrono::steady_clock::time_point{};
248 }
249
253 auto update_activity() -> void {
254 if (concept_) {
255 concept_->update_activity();
256 }
257 }
258
263 [[nodiscard]] auto idle_duration() const -> std::chrono::milliseconds {
264 return concept_ ? concept_->idle_duration() : std::chrono::milliseconds{0};
265 }
266
267 // =========================================================================
268 // Access to Underlying Concept
269 // =========================================================================
270
275 [[nodiscard]] auto get_concept() noexcept -> session_concept* {
276 return concept_.get();
277 }
278
283 [[nodiscard]] auto get_concept() const noexcept -> const session_concept* {
284 return concept_.get();
285 }
286
291 [[nodiscard]] auto release() noexcept -> std::unique_ptr<session_concept> {
292 return std::move(concept_);
293 }
294
298 auto reset() noexcept -> void {
299 concept_.reset();
300 }
301
302private:
303 std::unique_ptr<session_concept> concept_;
304};
305
312template <typename SessionType>
313[[nodiscard]] auto make_session_handle(std::shared_ptr<SessionType> session)
314 -> session_handle {
315 return session_handle(std::move(session));
316}
317
318} // namespace kcenon::network::core
static Result< T > err(const simple_error &error)
Type-erased interface for session management.
Value-semantic wrapper for type-erased sessions.
auto created_at() const -> std::chrono::steady_clock::time_point
Gets the creation timestamp.
session_handle & operator=(const session_handle &)=delete
auto id() const -> std::string_view
Gets the session's unique identifier.
session_handle()=default
Creates an empty (invalid) handle.
auto update_activity() -> void
Updates the last activity timestamp.
session_handle & operator=(session_handle &&)=default
auto get_concept() noexcept -> session_concept *
Gets the underlying session concept (non-owning)
auto as() const noexcept -> const T *
Attempts to cast to a specific session type (const version)
session_handle(session_handle &&)=default
session_handle(std::shared_ptr< SessionType > session)
Creates a handle from a concrete session type.
auto valid() const noexcept -> bool
Checks if the handle is valid.
session_handle(std::unique_ptr< session_concept > session_concept_ptr)
Creates a handle from a type-erased session concept.
auto is_connected() const -> bool
Checks if the session is currently connected.
auto last_activity() const -> std::chrono::steady_clock::time_point
Gets the last activity timestamp.
session_handle(const session_handle &)=delete
auto close() -> void
Closes the session.
auto send(std::vector< uint8_t > &&data) -> VoidResult
Sends data through the session.
auto idle_duration() const -> std::chrono::milliseconds
Gets the idle duration since last activity.
auto as() noexcept -> T *
Attempts to cast to a specific session type.
auto release() noexcept -> std::unique_ptr< session_concept >
Releases ownership of the session concept.
auto get_concept() const noexcept -> const session_concept *
Gets the underlying session concept (non-owning, const)
auto has_activity_tracking() const noexcept -> bool
Checks if activity tracking is enabled for this session.
std::unique_ptr< session_concept > concept_
auto reset() noexcept -> void
Resets the handle to empty state.
auto is_type() const noexcept -> bool
Checks if the session is of a specific type.
auto type() const noexcept -> const std::type_info &
Gets type information of the wrapped session.
auto stop() -> void
Stops the session.
auto make_session_handle(std::shared_ptr< SessionType > session) -> session_handle
Factory function to create a session_handle.
auto make_session_model(std::shared_ptr< SessionType > session) -> std::unique_ptr< session_concept >
Factory function to create a session_model.