6#include "protocol/jsonl_server.h"
8#include "net/ethernet.h"
9#include "protocol/protocol.h"
10#include "utils/logging.h"
12void msg::JsonlServer::begin() { server.begin(net::StartupConfig::get().jsonl_port); }
14void msg::JsonlServer::loop() {
15 net::EthernetClient client_socket = server.accept();
22 client.user_context.set_remote_identifier(net::auth::RemoteIdentifier{client_socket.remoteIP()});
23 client.socket = std::move(client_socket);
28 if (clients.size() == net::StartupConfig::get().max_connections) {
29 LOG5(
"Cannot accept client from ", client.socket.remoteIP(),
" because maximum number of connections (",
30 net::StartupConfig::get().max_connections,
") already reached.");
33 LOG4(
"Client ",
static_cast<unsigned>(clients.size()),
" connected from ", client.socket.remoteIP());
34 clients.push_back(std::move(client));
35 msg::JsonLinesProtocol::get().broadcast.add(&(std::prev(clients.end())->socket));
41 for (
auto client = clients.begin(); client != clients.end(); ++client) {
42 const auto client_idx = std::distance(clients.begin(), client);
43 if (client->socket.connected()) {
44 if (client->socket.available() > 0) {
45 msg::JsonLinesProtocol::get().process_tcp_input(client->socket, client->user_context);
46 client->last_contact.reset();
47 }
else if (client->last_contact.expired(net::StartupConfig::get().connection_timeout_ms)) {
48 LOG5(
"Client ",
static_cast<unsigned>(client_idx),
", timed out after ",
49 net::StartupConfig::get().connection_timeout_ms,
" ms of idling");
50 client->socket.stop();
53 LOG5(
"Client ",
static_cast<unsigned>(client_idx),
", was ", client->user_context,
", disconnected");
54 msg::JsonLinesProtocol::get().broadcast.remove(&client->socket);
55 client->socket.stop();
56 clients.erase(client);