mutable
A Database System for Research and Fast Prototyping
Loading...
Searching...
No Matches
WebSocketServer.cpp
Go to the documentation of this file.
2
3
4namespace ip = boost::asio::ip;
5namespace ws = boost::beast::websocket;
6
7
8using namespace m;
9using namespace std::chrono_literals;
10
11
12/*======================================================================================================================
13 * WebSocketServer
14 *====================================================================================================================*/
15
17 : io_ctx_(/* concurrency_level= */ 1)
18 , acceptor_(io_ctx_, { ip::make_address("127.0.0.1"), port })
19 , on_message_(on_message)
20 , port_(port)
21{ }
22
24{
25 ip::tcp::socket socket(io_ctx_);
26 acceptor_.accept(socket);
27 return Connection(*this, std::make_unique<web_socket_t>(std::move(socket)));
28}
29
30
31/*======================================================================================================================
32 * WebSocketServer::Connection
33 *====================================================================================================================*/
34
35WebSocketServer::Connection::Connection(WebSocketServer &server, std::unique_ptr<web_socket_t> ws)
36 : server_(server)
37 , ws_(std::move(ws))
38{ }
39
40void WebSocketServer::Connection::send(std::string_view msg)
41{
42 ws_->text(ws_->got_text());
43 ws_->write(boost::asio::buffer(msg.data(), msg.length()));
44}
45
47{
48 boost::beast::multi_buffer buffer;
49 ws_->accept();
50 for (;;) {
51 try {
52 buffer.clear();
53 if (ws_->read(buffer) == 0)
54 return;
55 } catch (const boost::system::system_error &e) {
56 const auto ec = e.code();
57 if (ec == ws::error::closed)
58 return;
59 else
60 throw;
61 }
62 std::string msg = boost::beast::buffers_to_string(buffer.data());
63 server().on_message(msg);
64 }
65}
66
68{
69 boost::beast::multi_buffer buffer;
70 try {
71 buffer.clear();
72 if (ws_->read(buffer) == 0)
73 return false;
74 } catch (const boost::system::system_error &e) {
75 const auto ec = e.code();
76 if (ec == ws::error::closed)
77 return false;
78 else
79 throw;
80 }
81 std::string msg = boost::beast::buffers_to_string(buffer.data());
82 server().on_message(msg);
83 return true;
84}
‍mutable namespace
Definition: Backend.hpp:10
STL namespace.
Connection(WebSocketServer &server, std::unique_ptr< web_socket_t > ws)
void send(std::string_view msg)
boost::asio::io_context io_ctx_
boost::asio::ip::tcp::acceptor acceptor_
std::function< void(std::string)> on_message_t
WebSocketServer(uint16_t port, on_message_t onMessage)
uint16_t port() const