98 std::cout <<
"=== Observer Pattern Example ===" << std::endl;
102 constexpr uint16_t port = 9004;
104 auto server = tcp.create_server({
106 .server_id =
"ObserverTestServer",
109 std::mutex sessions_mutex;
110 std::map<std::string, std::shared_ptr<interfaces::i_session>> sessions;
112 server->set_connection_callback(
113 [&sessions, &sessions_mutex](std::shared_ptr<interfaces::i_session> session) {
114 std::lock_guard<std::mutex> lock(sessions_mutex);
115 sessions[std::string(session->id())] = session;
118 server->set_disconnection_callback(
119 [&sessions, &sessions_mutex](std::string_view session_id) {
120 std::lock_guard<std::mutex> lock(sessions_mutex);
121 sessions.erase(std::string(session_id));
124 server->set_receive_callback(
125 [&sessions, &sessions_mutex](std::string_view session_id,
126 const std::vector<uint8_t>& data) {
127 std::lock_guard<std::mutex> lock(sessions_mutex);
128 auto it = sessions.find(std::string(session_id));
129 if (it != sessions.end()) {
130 it->second->send(std::vector<uint8_t>(data));
134 auto server_result = server->start(port);
135 if (server_result.is_err()) {
136 std::cerr <<
"Server start failed: " << server_result.error().message << std::endl;
139 std::cout <<
"Echo server running on port " << port << std::endl;
140 std::this_thread::sleep_for(std::chrono::milliseconds(100));
143 std::cout <<
"\n--- Example 1: Full connection_observer ---" << std::endl;
145 auto client = tcp.create_client({
148 .client_id =
"ObserverClient",
151 auto observer = std::make_shared<chat_observer>(
"FullObserver");
152 client->set_observer(observer);
154 auto result = client->start(
"127.0.0.1", port);
155 if (result.is_ok()) {
156 std::this_thread::sleep_for(std::chrono::milliseconds(200));
158 std::string msg =
"Hello via observer!";
159 std::vector<uint8_t> data(msg.begin(), msg.end());
160 client->send(std::move(data));
162 std::this_thread::sleep_for(std::chrono::milliseconds(500));
163 std::cout <<
"Messages received: " << observer->message_count() << std::endl;
167 std::this_thread::sleep_for(std::chrono::milliseconds(100));
171 std::cout <<
"\n--- Example 2: callback_adapter ---" << std::endl;
173 auto client = tcp.create_client({
176 .client_id =
"AdapterClient",
179 auto adapter = std::make_shared<interfaces::callback_adapter>();
180 adapter->on_connected([]() {
181 std::cout <<
"[Adapter] Connected!" << std::endl;
183 .on_receive([](std::span<const uint8_t> data) {
184 std::string msg(data.begin(), data.end());
185 std::cout <<
"[Adapter] Received: " << msg << std::endl;
187 .on_disconnected([](std::optional<std::string_view> reason) {
188 std::cout <<
"[Adapter] Disconnected." << std::endl;
190 .on_error([](std::error_code ec) {
191 std::cerr <<
"[Adapter] Error: " << ec.message() << std::endl;
194 client->set_observer(adapter);
196 auto result = client->start(
"127.0.0.1", port);
197 if (result.is_ok()) {
198 std::this_thread::sleep_for(std::chrono::milliseconds(200));
200 std::string msg =
"Hello via callback_adapter!";
201 std::vector<uint8_t> data(msg.begin(), msg.end());
202 client->send(std::move(data));
204 std::this_thread::sleep_for(std::chrono::milliseconds(500));
208 std::this_thread::sleep_for(std::chrono::milliseconds(100));
213 std::cout <<
"\n=== Observer pattern example completed ===" << std::endl;