2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
44#include <express/Response.h>
45#include <web/http/server/SocketContext.h>
51#ifndef DOXYGEN_SHOULD_SKIP_THIS
56#include <log/Logger.h>
57#include <nlohmann/json.hpp>
71 return sseDistributor;
78 response->getSocketContext()->onDisconnected([
this, &eventReceiver]() {
88 const std::string& data,
89 const std::string& event,
90 const std::string& id) {
91 if (response->isConnected()) {
93 response->sendFragment(
"event:" + event);
96 response->sendFragment(
"id:" + id);
98 response->sendFragment(
"data:" + data);
99 response->sendFragment();
105 const std::string& event,
106 const std::string& id) {
111 VLOG(0) <<
"Server sent event: " << event <<
"\n" << data;
146 {{
"at",
timePointToString(std::chrono::system_clock::now()
)}, {
"name", bridgeName}}
, "bridge_disabled", std::to_string(
id++)
);
151 {{
"at",
timePointToString(std::chrono::system_clock::now()
)}, {
"name", bridgeName}}
, "bridge_starting", std::to_string(
id++)
);
156 {{
"at",
timePointToString(std::chrono::system_clock::now()
)}, {
"name", bridgeName}}
, "bridge_started", std::to_string(
id++)
);
161 {{
"at",
timePointToString(std::chrono::system_clock::now()
)}, {
"name", bridgeName}}
, "bridge_stopping", std::to_string(
id++)
);
166 {{
"at",
timePointToString(std::chrono::system_clock::now()
)}, {
"name", bridgeName}}
, "bridge_stopped", std::to_string(
id++)
);
172 std::to_string(
id++)
);
178 std::to_string(
id++)
);
184 std::to_string(
id++)
);
189 "broker_disconnecting",
190 std::to_string(
id++)
);
195 "broker_disconnected",
196 std::to_string(
id++)
);
204 std::time_t time = std::chrono::system_clock::to_time_t(timePoint);
205 const std::tm* tm_ptr = std::gmtime(&time);
208 std::string onlineSince =
"Formatting error";
211 if (std::strftime(buffer,
sizeof(buffer),
"%Y-%m-%d %H:%M:%S", tm_ptr)) {
212 onlineSince = std::string(buffer) +
" UTC";
219 const std::chrono::time_point<std::chrono::system_clock>& later) {
220 using seconds_duration_type = std::chrono::duration<std::chrono::seconds::rep>::rep;
222 seconds_duration_type totalSeconds = std::chrono::duration_cast<std::chrono::seconds>(later - bevore).count();
225 seconds_duration_type days = totalSeconds / 86400;
226 seconds_duration_type remainder = totalSeconds % 86400;
227 seconds_duration_type hours = remainder / 3600;
228 remainder = remainder % 3600;
229 seconds_duration_type minutes = remainder / 60;
230 seconds_duration_type seconds = remainder % 60;
233 std::ostringstream oss;
235 oss << days <<
" day" << (days == 1 ?
"" :
"s") <<
", ";
237 oss << std::setw(2) << std::setfill(
'0') << hours <<
":" << std::setw(2) << std::setfill(
'0') << minutes <<
":" << std::setw(2)
238 << std::setfill(
'0') << seconds;
247 response->sendFragment(
":keep-alive");
248 response->sendFragment();
core::timer::Timer heartbeatTimer
bool operator==(const EventReceiver &other)
std::weak_ptr< express::Response > response
std::shared_ptr< express::Response > getResponse() const
EventReceiver(const std::shared_ptr< express::Response > &response)
const std::string & getData() const
const std::string & getEvent() const
const std::string & getId() const
Event(const std::string &data, const std::string &event, const std::string &id)
void sendEvent(const std::string &data, const std::string &event="", const std::string &id="")
std::string bridgesStartedAt() const
static std::string durationToString(const std::chrono::time_point< std::chrono::system_clock > &bevore, const std::chrono::time_point< std::chrono::system_clock > &later=std::chrono::system_clock::now())
void bridgeStopped(const std::string &bridgeName)
void addEventReceiver(const std::shared_ptr< express::Response > &response, const std::string &lastEventId)
void brokerConnected(const std::string &bridgeName, const std::string &instanceName)
std::chrono::time_point< std::chrono::system_clock > bridgesStartTimePoint
void brokerConnecting(const std::string &bridgeName, const std::string &instanceName)
void brokerDisabled(const std::string &bridgeName, const std::string &instanceName)
static void sendJsonEvent(const std::shared_ptr< express::Response > &response, const nlohmann::json &json, const std::string &event="", const std::string &id="")
void bridgeDisabled(const std::string &bridgeName)
std::list< Event > replayEvents
static void sendEvent(const std::shared_ptr< express::Response > &response, const std::string &data, const std::string &event, const std::string &id)
void bridgeStarting(const std::string &bridgeName)
void bridgeStarted(const std::string &bridgeName)
static SSEDistributor & instance()
std::list< EventReceiver > eventReceiverList
std::chrono::time_point< std::chrono::system_clock > onlineSinceTimePoint
void brokerDisconnected(const std::string &bridgeName, const std::string &instanceName)
void brokerDisconnecting(const std::string &bridgeName, const std::string &instanceName)
static std::string timePointToString(const std::chrono::time_point< std::chrono::system_clock > &timePoint)
void sendJsonEvent(const nlohmann::json &json, const std::string &event="", const std::string &id="")
void bridgeStopping(const std::string &bridgeName)