6#include "proto/main.pb.h"
7#include "protocol/jsonl_server.h"
9#include "net/ethernet.h"
10#include "protocol/protocol.h"
11#include "utils/logging.h"
13void msg::ApplicationServer::begin() {
14 server.begin(net::StartupConfig::get().jsonl_port);
17void msg::ApplicationServer::_accept_clients() {
18 net::EthernetClient client_socket = server.accept();
20 if (!client_socket)
return;
21 auto remote_ip = client_socket.remoteIP();
26 if (clients.size() == net::StartupConfig::get().max_connections) {
27 LOG5(
"Cannot accept client from ", remote_ip,
" because maximum number of connections (",
28 net::StartupConfig::get().max_connections,
") already reached.");
37 auto socket = std::make_shared<net::EthernetClient>(std::move(client_socket));
39 LOG4(
"Client ",
static_cast<unsigned>(clients.size()),
" connected from ", remote_ip);
40 auto& client = clients.emplace_back(ApplicationClient{
42 .transport = transport::Transport(
43 std::make_shared<transport::DelimitedInputStream<std::shared_ptr<Client>>>(socket),
44 std::make_shared<transport::DelimitedMessageOutputStream<std::shared_ptr<Client>>>(socket),
45 std::make_shared<transport::DelimitedMessageOutputStream<std::shared_ptr<Client>>>(socket),
50 client.user_context.set_remote_identifier(net::auth::RemoteIdentifier{remote_ip});
53void msg::ApplicationServer::_handle_clients() {
56 for (
auto it = clients.begin(); it != clients.end(); ++it) {
58 auto& socket = client.socket;
60 if (socket->connected()) {
61 if (socket->available() > 0) {
62 Broker::get().process(client.transport);
63 client.last_contact.reset();
64 }
else if (client.last_contact.expired(net::StartupConfig::get().connection_timeout_ms)) {
65 LOG3(
"Client timed out after ",
66 net::StartupConfig::get().connection_timeout_ms,
" ms of idling");
70 LOG3(
"Client was ", client.user_context,
", disconnected");
79void msg::ApplicationServer::loop() {