Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
tcp_server_adapter.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2024, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
6
9
11
12tcp_server_adapter::tcp_server_adapter(std::string_view server_id)
13 : server_id_(server_id)
14 , server_(std::make_shared<core::messaging_server>(std::string(server_id)))
15{
17}
18
20{
21 if (server_ && server_->is_running())
22 {
23 (void)server_->stop_server();
24 }
25}
26
27// =========================================================================
28// i_network_component interface implementation
29// =========================================================================
30
32{
33 return server_ && server_->is_running();
34}
35
37{
38 if (server_)
39 {
40 server_->wait_for_stop();
41 }
42}
43
44// =========================================================================
45// i_protocol_server interface implementation
46// =========================================================================
47
49{
50 if (!server_)
51 {
52 return error_void(
54 "Server not initialized",
55 "tcp_server_adapter::start"
56 );
57 }
58 return server_->start_server(port);
59}
60
62{
63 if (!server_)
64 {
65 return error_void(
67 "Server not initialized",
68 "tcp_server_adapter::stop"
69 );
70 }
71
72 auto result = server_->stop_server();
73
74 // Clear tracked sessions on stop
75 {
76 std::lock_guard<std::mutex> lock(sessions_mutex_);
77 sessions_.clear();
78 }
79
80 return result;
81}
82
84{
85 std::lock_guard<std::mutex> lock(sessions_mutex_);
86 return sessions_.size();
87}
88
90{
91 std::lock_guard<std::mutex> lock(callbacks_mutex_);
92 connection_callback_ = std::move(callback);
93}
94
96{
97 std::lock_guard<std::mutex> lock(callbacks_mutex_);
98 disconnection_callback_ = std::move(callback);
99}
100
102{
103 std::lock_guard<std::mutex> lock(callbacks_mutex_);
104 receive_callback_ = std::move(callback);
105}
106
108{
109 std::lock_guard<std::mutex> lock(callbacks_mutex_);
110 error_callback_ = std::move(callback);
111}
112
113// =========================================================================
114// Internal methods
115// =========================================================================
116
118{
119 if (!server_)
120 {
121 return;
122 }
123
124 // Bridge legacy connection callback to i_protocol_server callback
125 server_->set_connection_callback(
126 [this](std::shared_ptr<session::messaging_session> session)
127 {
128 if (!session)
129 {
130 return;
131 }
132
133 // Track the session
134 auto i_session_ptr = track_session(session);
135
136 // Invoke the interface callback
137 connection_callback_t callback_copy;
138 {
139 std::lock_guard<std::mutex> lock(callbacks_mutex_);
140 callback_copy = connection_callback_;
141 }
142 if (callback_copy)
143 {
144 callback_copy(std::move(i_session_ptr));
145 }
146 });
147
148 // Bridge legacy disconnection callback
149 server_->set_disconnection_callback(
150 [this](const std::string& session_id)
151 {
152 // Remove from tracked sessions
153 {
154 std::lock_guard<std::mutex> lock(sessions_mutex_);
155 sessions_.erase(session_id);
156 }
157
158 // Invoke the interface callback
159 disconnection_callback_t callback_copy;
160 {
161 std::lock_guard<std::mutex> lock(callbacks_mutex_);
162 callback_copy = disconnection_callback_;
163 }
164 if (callback_copy)
165 {
166 callback_copy(session_id);
167 }
168 });
169
170 // Bridge legacy receive callback
171 server_->set_receive_callback(
172 [this](std::shared_ptr<session::messaging_session> session,
173 const std::vector<uint8_t>& data)
174 {
175 if (!session)
176 {
177 return;
178 }
179
180 // Get session ID (messaging_session inherits from i_session)
181 std::string session_id(session->id());
182
183 // Invoke the interface callback
184 receive_callback_t callback_copy;
185 {
186 std::lock_guard<std::mutex> lock(callbacks_mutex_);
187 callback_copy = receive_callback_;
188 }
189 if (callback_copy)
190 {
191 callback_copy(session_id, data);
192 }
193 });
194
195 // Bridge legacy error callback
196 server_->set_error_callback(
197 [this](std::shared_ptr<session::messaging_session> session,
198 std::error_code ec)
199 {
200 if (!session)
201 {
202 return;
203 }
204
205 // Get session ID
206 std::string session_id(session->id());
207
208 // Invoke the interface callback
209 error_callback_t callback_copy;
210 {
211 std::lock_guard<std::mutex> lock(callbacks_mutex_);
212 callback_copy = error_callback_;
213 }
214 if (callback_copy)
215 {
216 callback_copy(session_id, ec);
217 }
218 });
219}
220
221auto tcp_server_adapter::track_session(std::shared_ptr<session::messaging_session> session)
222 -> std::shared_ptr<interfaces::i_session>
223{
224 if (!session)
225 {
226 return nullptr;
227 }
228
229 std::string session_id(session->id());
230
231 {
232 std::lock_guard<std::mutex> lock(sessions_mutex_);
233 sessions_[session_id] = session;
234 }
235
236 // messaging_session inherits from i_session, so we can return it directly
237 return session;
238}
239
240} // namespace kcenon::network::internal::adapters
std::function< void(std::string_view)> disconnection_callback_t
Callback type for disconnections (session_id)
std::function< void(std::string_view, const std::vector< uint8_t > &)> receive_callback_t
Callback type for received data (session_id, data)
std::function< void(std::string_view, std::error_code)> error_callback_t
Callback type for errors (session_id, error)
std::function< void(std::shared_ptr< i_session >)> connection_callback_t
Callback type for new connections.
auto set_error_callback(error_callback_t callback) -> void override
Sets the callback for errors.
std::unordered_map< std::string, std::shared_ptr< session::messaging_session > > sessions_
~tcp_server_adapter() override
Destructor ensures proper cleanup.
auto set_disconnection_callback(disconnection_callback_t callback) -> void override
Sets the callback for disconnections.
auto set_connection_callback(connection_callback_t callback) -> void override
Sets the callback for new connections.
auto setup_internal_callbacks() -> void
Sets up internal callbacks to bridge legacy callbacks to i_protocol_server callbacks.
auto track_session(std::shared_ptr< session::messaging_session > session) -> std::shared_ptr< interfaces::i_session >
Tracks a session and returns it as i_session.
auto is_running() const -> bool override
Checks if the component is currently running.
auto stop() -> VoidResult override
Stops the server and closes all connections.
auto connection_count() const -> size_t override
Gets the number of active client connections.
std::shared_ptr< core::messaging_server > server_
auto start(uint16_t port) -> VoidResult override
Starts the server and begins listening for connections.
auto set_receive_callback(receive_callback_t callback) -> void override
Sets the callback for received data.
tcp_server_adapter(std::string_view server_id)
Constructs an adapter with a unique server ID.
auto wait_for_stop() -> void override
Blocks until the component has stopped.
TCP server implementation.
Messaging session managing bidirectional message exchange.
VoidResult error_void(int code, const std::string &message, const std::string &source="network_system", const std::string &details="")