Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
kcenon::network::session::quic_session Class Reference

Represents a single QUIC client session on the server side. More...

#include <quic_session.h>

Inheritance diagram for kcenon::network::session::quic_session:
Inheritance graph
Collaboration diagram for kcenon::network::session::quic_session:
Collaboration graph

Public Member Functions

 quic_session (std::shared_ptr< internal::quic_socket > socket, std::string_view session_id)
 Constructs a QUIC session with an existing socket.
 
 ~quic_session () noexcept
 Destructor; closes the session if still active.
 
 quic_session (const quic_session &)=delete
 
quic_sessionoperator= (const quic_session &)=delete
 
auto session_id () const -> const std::string &
 Get the unique session identifier.
 
auto remote_endpoint () const -> asio::ip::udp::endpoint
 Get the remote endpoint address.
 
auto is_active () const noexcept -> bool
 Check if the session is currently active.
 
auto send (std::string_view data) -> VoidResult
 Send string data on the default stream.
 
auto close (uint64_t error_code) -> VoidResult
 Close the session gracefully with error code.
 
auto stats () const -> core::quic_connection_stats
 Get connection statistics.
 
auto set_receive_callback (std::function< void(const std::vector< uint8_t > &)> callback) -> void
 Set callback for received data on the default stream.
 
auto set_stream_receive_callback (std::function< void(uint64_t, const std::vector< uint8_t > &, bool)> callback) -> void
 Set callback for stream data reception.
 
auto set_close_callback (std::function< void()> callback) -> void
 Set callback when session closes.
 
auto start_session () -> void
 Start receiving data (called by server).
 
auto handle_packet (std::span< const uint8_t > data) -> void
 Handle incoming packet (called by server).
 
auto matches_connection_id (const protocols::quic::connection_id &conn_id) const -> bool
 Check if this session matches a connection ID.
 
auto id () const -> std::string_view override
 Gets the unique session identifier (interface version).
 
auto is_connected () const -> bool override
 Checks if the session is currently connected (interface version).
 
auto send (std::vector< uint8_t > &&data) -> VoidResult override
 Sends data to the client (interface version).
 
auto close () -> void override
 Closes the session (interface version).
 
auto create_stream () -> Result< uint64_t > override
 Creates a new bidirectional stream (interface version).
 
auto create_unidirectional_stream () -> Result< uint64_t > override
 Creates a new unidirectional stream (interface version).
 
auto send_on_stream (uint64_t stream_id, std::vector< uint8_t > &&data, bool fin=false) -> VoidResult override
 Sends data on a specific stream (interface version).
 
auto close_stream (uint64_t stream_id) -> VoidResult override
 Closes a stream (interface version).
 
- Public Member Functions inherited from kcenon::network::interfaces::i_quic_session
- Public Member Functions inherited from kcenon::network::interfaces::i_session
virtual ~i_session ()=default
 Virtual destructor for proper cleanup.
 
 i_session (const i_session &)=delete
 
i_sessionoperator= (const i_session &)=delete
 
 i_session (i_session &&)=delete
 
i_sessionoperator= (i_session &&)=delete
 

Private Member Functions

auto on_stream_data (uint64_t stream_id, std::span< const uint8_t > data, bool fin) -> void
 
auto on_error (std::error_code ec) -> void
 
auto on_close (uint64_t error_code, const std::string &reason) -> void
 

Private Attributes

std::string session_id_
 
std::mutex socket_mutex_
 
std::shared_ptr< internal::quic_socketsocket_
 
std::atomic< bool > is_active_ {true}
 
uint64_t default_stream_id_ {0}
 
std::function< void(const std::vector< uint8_t > &)> receive_callback_
 
std::function< void(uint64_t, const std::vector< uint8_t > &, bool)> stream_receive_callback_
 
std::function< void()> close_callback_
 
std::mutex callback_mutex_
 

Additional Inherited Members

- Protected Member Functions inherited from kcenon::network::interfaces::i_session
 i_session ()=default
 Default constructor (only for derived classes)
 

Detailed Description

Represents a single QUIC client session on the server side.

Overview

This class wraps a QUIC connection from a connected client, providing methods to send/receive data, manage streams, and handle session lifecycle.

Thread Safety

  • All public methods are thread-safe.
  • Session state is protected by atomic operations.
  • Socket access is protected by internal mutex.
  • Callbacks are invoked on I/O threads.

Key Features

  • Manages a single client's QUIC connection
  • Supports multiple concurrent streams (QUIC feature)
  • Provides send/receive callbacks for data handling
  • Thread-safe session management

Definition at line 69 of file quic_session.h.

Constructor & Destructor Documentation

◆ quic_session() [1/2]

kcenon::network::session::quic_session::quic_session ( std::shared_ptr< internal::quic_socket > socket,
std::string_view session_id )

Constructs a QUIC session with an existing socket.

Parameters
socketThe QUIC socket for this session.
session_idUnique identifier for this session.

Definition at line 14 of file quic_session.cpp.

16 : session_id_(session_id), socket_(std::move(socket))
17 {
18 NETWORK_LOG_DEBUG("[quic_session] Created session: " + session_id_);
19 }
auto session_id() const -> const std::string &
Get the unique session identifier.
std::shared_ptr< internal::quic_socket > socket_
#define NETWORK_LOG_DEBUG(msg)

References NETWORK_LOG_DEBUG, and session_id_.

◆ ~quic_session()

kcenon::network::session::quic_session::~quic_session ( )
noexcept

Destructor; closes the session if still active.

Definition at line 21 of file quic_session.cpp.

22 {
23 try
24 {
25 if (is_active_.load())
26 {
27 auto result = close(0);
28 (void)result; // Ignore result in destructor
29 }
30 }
31 catch (...)
32 {
33 // Destructor must not throw
34 }
35 }
auto close() -> void override
Closes the session (interface version).

References close(), and is_active_.

Here is the call graph for this function:

◆ quic_session() [2/2]

kcenon::network::session::quic_session::quic_session ( const quic_session & )
delete

Member Function Documentation

◆ close() [1/2]

auto kcenon::network::session::quic_session::close ( ) -> void
inlineoverridevirtual

Closes the session (interface version).

Implements i_session::close().

Implements kcenon::network::interfaces::i_session.

Definition at line 231 of file quic_session.h.

231 {
232 auto result = close(0);
233 (void)result;
234 }

References close().

Referenced by close(), and ~quic_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ close() [2/2]

auto kcenon::network::session::quic_session::close ( uint64_t error_code) -> VoidResult
nodiscard

Close the session gracefully with error code.

Parameters
error_codeApplication error code (0 for no error).
Returns
VoidResult indicating success or error.

Definition at line 170 of file quic_session.cpp.

171 {
172 if (!is_active_.exchange(false))
173 {
174 return ok();
175 }
176
177 NETWORK_LOG_INFO("[quic_session] Closing session: " + session_id_);
178
179 VoidResult result = ok();
180
181 {
182 std::lock_guard<std::mutex> lock(socket_mutex_);
183 if (socket_)
184 {
185 result = socket_->close(error_code, "Session closed");
186 }
187 }
188
189 // Invoke close callback
190 {
191 std::lock_guard<std::mutex> lock(callback_mutex_);
192 if (close_callback_)
193 {
194 try
195 {
197 }
198 catch (const std::exception& e)
199 {
200 NETWORK_LOG_ERROR("[quic_session] Exception in close callback: "
201 + std::string(e.what()));
202 }
203 }
204 }
205
206 return result;
207 }
std::function< void()> close_callback_
#define NETWORK_LOG_INFO(msg)
#define NETWORK_LOG_ERROR(msg)
Result< std::monostate > VoidResult
VoidResult ok()

References NETWORK_LOG_ERROR, NETWORK_LOG_INFO, and kcenon::network::ok().

Here is the call graph for this function:

◆ close_stream()

auto kcenon::network::session::quic_session::close_stream ( uint64_t stream_id) -> VoidResult
nodiscardoverridevirtual

Closes a stream (interface version).

Parameters
stream_idThe stream to close.
Returns
VoidResult indicating success or failure.

Implements i_quic_session::close_stream().

Implements kcenon::network::interfaces::i_quic_session.

Definition at line 150 of file quic_session.cpp.

151 {
152 if (!is_active_.load())
153 {
155 "Session is not active",
156 "quic_session");
157 }
158
159 std::lock_guard<std::mutex> lock(socket_mutex_);
160 if (!socket_)
161 {
163 "Socket is null",
164 "quic_session");
165 }
166
167 return socket_->close_stream(stream_id);
168 }
VoidResult error_void(int code, const std::string &message, const std::string &source="network_system", const std::string &details="")

References kcenon::network::error_codes::network_system::connection_closed, and kcenon::network::error_void().

Here is the call graph for this function:

◆ create_stream()

auto kcenon::network::session::quic_session::create_stream ( ) -> Result<uint64_t>
nodiscardoverridevirtual

Creates a new bidirectional stream (interface version).

Returns
Stream ID or error.

Implements i_quic_session::create_stream().

Implements kcenon::network::interfaces::i_quic_session.

Definition at line 110 of file quic_session.cpp.

111 {
112 if (!is_active_.load())
113 {
115 "Session is not active",
116 "quic_session");
117 }
118
119 std::lock_guard<std::mutex> lock(socket_mutex_);
120 if (!socket_)
121 {
123 "Socket is null",
124 "quic_session");
125 }
126
127 return socket_->create_stream(false);
128 }

References kcenon::network::error_codes::network_system::connection_closed, and kcenon::network::error.

◆ create_unidirectional_stream()

auto kcenon::network::session::quic_session::create_unidirectional_stream ( ) -> Result<uint64_t>
nodiscardoverridevirtual

Creates a new unidirectional stream (interface version).

Returns
Stream ID or error.

Implements i_quic_session::create_unidirectional_stream().

Implements kcenon::network::interfaces::i_quic_session.

Definition at line 130 of file quic_session.cpp.

131 {
132 if (!is_active_.load())
133 {
135 "Session is not active",
136 "quic_session");
137 }
138
139 std::lock_guard<std::mutex> lock(socket_mutex_);
140 if (!socket_)
141 {
143 "Socket is null",
144 "quic_session");
145 }
146
147 return socket_->create_stream(true);
148 }

References kcenon::network::error_codes::network_system::connection_closed, and kcenon::network::error.

◆ handle_packet()

auto kcenon::network::session::quic_session::handle_packet ( std::span< const uint8_t > data) -> void

Handle incoming packet (called by server).

Parameters
dataRaw packet data.

Definition at line 283 of file quic_session.cpp.

284 {
285 // This is called by the server when a packet arrives for this session
286 // The actual packet handling is done by quic_socket
287 std::lock_guard<std::mutex> lock(socket_mutex_);
288 if (socket_)
289 {
290 // The socket will process the packet internally
291 // No direct call needed as socket handles its own receive loop
292 }
293 }

◆ id()

auto kcenon::network::session::quic_session::id ( ) const -> std::string_view
inlinenodiscardoverridevirtual

Gets the unique session identifier (interface version).

Returns
A string view of the session ID.

Implements i_session::id().

Implements kcenon::network::interfaces::i_session.

Definition at line 203 of file quic_session.h.

203 {
204 return session_id_;
205 }

References session_id_.

◆ is_active()

auto kcenon::network::session::quic_session::is_active ( ) const -> bool
nodiscardnoexcept

Check if the session is currently active.

Returns
true if active, false if closed.

Definition at line 52 of file quic_session.cpp.

53 {
54 return is_active_.load(std::memory_order_relaxed);
55 }

References is_active_.

Referenced by is_connected().

Here is the caller graph for this function:

◆ is_connected()

auto kcenon::network::session::quic_session::is_connected ( ) const -> bool
inlinenodiscardoverridevirtual

Checks if the session is currently connected (interface version).

Returns
true if connected, false otherwise.

Implements i_session::is_connected().

Implements kcenon::network::interfaces::i_session.

Definition at line 213 of file quic_session.h.

213 {
214 return is_active();
215 }
auto is_active() const noexcept -> bool
Check if the session is currently active.

References is_active().

Here is the call graph for this function:

◆ matches_connection_id()

auto kcenon::network::session::quic_session::matches_connection_id ( const protocols::quic::connection_id & conn_id) const -> bool
nodiscard

Check if this session matches a connection ID.

Parameters
conn_idConnection ID to match.
Returns
true if matches.

Definition at line 295 of file quic_session.cpp.

297 {
298 std::lock_guard<std::mutex> lock(socket_mutex_);
299 if (!socket_)
300 {
301 return false;
302 }
303 return socket_->local_connection_id() == conn_id ||
304 socket_->remote_connection_id() == conn_id;
305 }

◆ on_close()

auto kcenon::network::session::quic_session::on_close ( uint64_t error_code,
const std::string & reason ) -> void
private

Definition at line 366 of file quic_session.cpp.

368 {
369 NETWORK_LOG_INFO("[quic_session] Session " + session_id_ + " closed: "
370 + reason + " (code: " + std::to_string(error_code) + ")");
371
372 is_active_.store(false);
373
374 // Invoke close callback
375 {
376 std::lock_guard<std::mutex> lock(callback_mutex_);
377 if (close_callback_)
378 {
379 try
380 {
382 }
383 catch (const std::exception& e)
384 {
385 NETWORK_LOG_ERROR("[quic_session] Exception in close callback: "
386 + std::string(e.what()));
387 }
388 }
389 }
390 }

References NETWORK_LOG_ERROR, and NETWORK_LOG_INFO.

◆ on_error()

auto kcenon::network::session::quic_session::on_error ( std::error_code ec) -> void
private

Definition at line 356 of file quic_session.cpp.

357 {
358 NETWORK_LOG_ERROR("[quic_session] Error on session " + session_id_ + ": "
359 + ec.message());
360
361 // Close the session on error
362 auto result = close(1);
363 (void)result;
364 }

References NETWORK_LOG_ERROR.

◆ on_stream_data()

auto kcenon::network::session::quic_session::on_stream_data ( uint64_t stream_id,
std::span< const uint8_t > data,
bool fin ) -> void
private

Definition at line 307 of file quic_session.cpp.

310 {
311 if (!is_active_.load())
312 {
313 return;
314 }
315
316 // Report bytes received metric
318
319 NETWORK_LOG_DEBUG("[quic_session] Received " + std::to_string(data.size())
320 + " bytes on stream " + std::to_string(stream_id));
321
322 std::vector<uint8_t> data_copy(data.begin(), data.end());
323
324 std::lock_guard<std::mutex> lock(callback_mutex_);
325
326 // Call stream-specific callback if set
328 {
329 try
330 {
331 stream_receive_callback_(stream_id, data_copy, fin);
332 }
333 catch (const std::exception& e)
334 {
336 "[quic_session] Exception in stream receive callback: "
337 + std::string(e.what()));
338 }
339 }
340
341 // Also call default receive callback for default stream
342 if (stream_id == default_stream_id_ && receive_callback_)
343 {
344 try
345 {
346 receive_callback_(data_copy);
347 }
348 catch (const std::exception& e)
349 {
350 NETWORK_LOG_ERROR("[quic_session] Exception in receive callback: "
351 + std::string(e.what()));
352 }
353 }
354 }
static void report_bytes_received(size_t bytes)
Report bytes received.
std::function< void(const std::vector< uint8_t > &)> receive_callback_
std::function< void(uint64_t, const std::vector< uint8_t > &, bool)> stream_receive_callback_

References NETWORK_LOG_DEBUG, NETWORK_LOG_ERROR, and kcenon::network::metrics::metric_reporter::report_bytes_received().

Here is the call graph for this function:

◆ operator=()

quic_session & kcenon::network::session::quic_session::operator= ( const quic_session & )
delete

◆ remote_endpoint()

auto kcenon::network::session::quic_session::remote_endpoint ( ) const -> asio::ip::udp::endpoint
nodiscard

Get the remote endpoint address.

Returns
Remote UDP endpoint.

Definition at line 42 of file quic_session.cpp.

43 {
44 std::lock_guard<std::mutex> lock(socket_mutex_);
45 if (socket_)
46 {
47 return socket_->remote_endpoint();
48 }
49 return {};
50 }

References socket_, and socket_mutex_.

◆ send() [1/2]

auto kcenon::network::session::quic_session::send ( std::string_view data) -> VoidResult
nodiscard

Send string data on the default stream.

Parameters
dataString to send.
Returns
VoidResult indicating success or error.

Definition at line 80 of file quic_session.cpp.

81 {
82 std::vector<uint8_t> bytes(data.begin(), data.end());
83 return send(std::move(bytes));
84 }
auto send(std::string_view data) -> VoidResult
Send string data on the default stream.

◆ send() [2/2]

auto kcenon::network::session::quic_session::send ( std::vector< uint8_t > && data) -> VoidResult
nodiscardoverridevirtual

Sends data to the client (interface version).

Parameters
dataThe data to send.
Returns
VoidResult indicating success or failure.

Implements i_session::send().

Implements kcenon::network::interfaces::i_session.

Definition at line 57 of file quic_session.cpp.

58 {
59 if (!is_active_.load())
60 {
62 "Session is not active",
63 "quic_session");
64 }
65
66 std::lock_guard<std::mutex> lock(socket_mutex_);
67 if (!socket_)
68 {
70 "Socket is null",
71 "quic_session");
72 }
73
74 // Report bytes sent metric
76
77 return socket_->send_stream_data(default_stream_id_, std::move(data), false);
78 }
static void report_bytes_sent(size_t bytes)
Report bytes sent.

References kcenon::network::error_codes::network_system::connection_closed, kcenon::network::error_void(), and kcenon::network::metrics::metric_reporter::report_bytes_sent().

Here is the call graph for this function:

◆ send_on_stream()

auto kcenon::network::session::quic_session::send_on_stream ( uint64_t stream_id,
std::vector< uint8_t > && data,
bool fin = false ) -> VoidResult
nodiscardoverridevirtual

Sends data on a specific stream (interface version).

Parameters
stream_idThe target stream ID.
dataThe data to send.
finTrue if this is the final data on the stream.
Returns
VoidResult indicating success or failure.

Implements i_quic_session::send_on_stream().

Implements kcenon::network::interfaces::i_quic_session.

Definition at line 86 of file quic_session.cpp.

89 {
90 if (!is_active_.load())
91 {
93 "Session is not active",
94 "quic_session");
95 }
96
97 std::lock_guard<std::mutex> lock(socket_mutex_);
98 if (!socket_)
99 {
101 "Socket is null",
102 "quic_session");
103 }
104
106
107 return socket_->send_stream_data(stream_id, std::move(data), fin);
108 }

References kcenon::network::error_codes::network_system::connection_closed, kcenon::network::error_void(), and kcenon::network::metrics::metric_reporter::report_bytes_sent().

Here is the call graph for this function:

◆ session_id()

auto kcenon::network::session::quic_session::session_id ( ) const -> const std::string&
nodiscard

Get the unique session identifier.

Returns
Session ID string.

Definition at line 37 of file quic_session.cpp.

38 {
39 return session_id_;
40 }

References session_id_.

◆ set_close_callback()

auto kcenon::network::session::quic_session::set_close_callback ( std::function< void()> callback) -> void

Set callback when session closes.

Parameters
callbackFunction called on session close.

Definition at line 230 of file quic_session.cpp.

231 {
232 std::lock_guard<std::mutex> lock(callback_mutex_);
233 close_callback_ = std::move(callback);
234 }

◆ set_receive_callback()

auto kcenon::network::session::quic_session::set_receive_callback ( std::function< void(const std::vector< uint8_t > &)> callback) -> void

Set callback for received data on the default stream.

Parameters
callbackFunction called when data is received.

Definition at line 215 of file quic_session.cpp.

217 {
218 std::lock_guard<std::mutex> lock(callback_mutex_);
219 receive_callback_ = std::move(callback);
220 }

◆ set_stream_receive_callback()

auto kcenon::network::session::quic_session::set_stream_receive_callback ( std::function< void(uint64_t, const std::vector< uint8_t > &, bool)> callback) -> void

Set callback for stream data reception.

Parameters
callbackFunction with stream_id, data, and fin flag.

Definition at line 222 of file quic_session.cpp.

225 {
226 std::lock_guard<std::mutex> lock(callback_mutex_);
227 stream_receive_callback_ = std::move(callback);
228 }

◆ start_session()

auto kcenon::network::session::quic_session::start_session ( ) -> void

Start receiving data (called by server).

Definition at line 236 of file quic_session.cpp.

237 {
238 if (!is_active_.load())
239 {
240 return;
241 }
242
243 auto weak_self = weak_from_this();
244
245 std::lock_guard<std::mutex> lock(socket_mutex_);
246 if (!socket_)
247 {
248 return;
249 }
250
251 // Set up stream data callback
252 socket_->set_stream_data_callback(
253 [weak_self](uint64_t stream_id, std::span<const uint8_t> data, bool fin)
254 {
255 if (auto self = weak_self.lock())
256 {
257 self->on_stream_data(stream_id, data, fin);
258 }
259 });
260
261 // Set up error callback
262 socket_->set_error_callback([weak_self](std::error_code ec)
263 {
264 if (auto self = weak_self.lock())
265 {
266 self->on_error(ec);
267 }
268 });
269
270 // Set up close callback
271 socket_->set_close_callback(
272 [weak_self](uint64_t error_code, const std::string& reason)
273 {
274 if (auto self = weak_self.lock())
275 {
276 self->on_close(error_code, reason);
277 }
278 });
279
280 NETWORK_LOG_INFO("[quic_session] Started session: " + session_id_);
281 }

References NETWORK_LOG_INFO.

◆ stats()

auto kcenon::network::session::quic_session::stats ( ) const -> core::quic_connection_stats
nodiscard

Get connection statistics.

Returns
Current connection stats.

Definition at line 209 of file quic_session.cpp.

210 {
211 // Return empty stats for now - will be implemented with actual QUIC stats
212 return core::quic_connection_stats{};
213 }

Member Data Documentation

◆ callback_mutex_

std::mutex kcenon::network::session::quic_session::callback_mutex_
mutableprivate

Definition at line 307 of file quic_session.h.

◆ close_callback_

std::function<void()> kcenon::network::session::quic_session::close_callback_
private

Definition at line 305 of file quic_session.h.

◆ default_stream_id_

uint64_t kcenon::network::session::quic_session::default_stream_id_ {0}
private

Definition at line 299 of file quic_session.h.

299{0};

◆ is_active_

std::atomic<bool> kcenon::network::session::quic_session::is_active_ {true}
private

Definition at line 297 of file quic_session.h.

297{true};

Referenced by is_active(), and ~quic_session().

◆ receive_callback_

std::function<void(const std::vector<uint8_t>&)> kcenon::network::session::quic_session::receive_callback_
private

Definition at line 302 of file quic_session.h.

◆ session_id_

std::string kcenon::network::session::quic_session::session_id_
private

Definition at line 292 of file quic_session.h.

Referenced by id(), quic_session(), and session_id().

◆ socket_

std::shared_ptr<internal::quic_socket> kcenon::network::session::quic_session::socket_
private

Definition at line 295 of file quic_session.h.

Referenced by remote_endpoint().

◆ socket_mutex_

std::mutex kcenon::network::session::quic_session::socket_mutex_
mutableprivate

Definition at line 294 of file quic_session.h.

Referenced by remote_endpoint().

◆ stream_receive_callback_

std::function<void(uint64_t, const std::vector<uint8_t>&, bool)> kcenon::network::session::quic_session::stream_receive_callback_
private

Definition at line 304 of file quic_session.h.


The documentation for this class was generated from the following files: