-
Notifications
You must be signed in to change notification settings - Fork 149
/
Copy pathWebSocketLogHandler.h
104 lines (89 loc) · 2.96 KB
/
WebSocketLogHandler.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#ifndef WebSocketLogHandler_h
#define WebSocketLogHandler_h
#include <ESPAsyncWebServer.h>
#include <SecurityManager.h>
//#include <Logger.h>
#include <ESPUtils.h>
#include <time.h>
#define WEB_SOCKET_LOG_PATH "/ws/log"
#define WEB_SOCKET_LOG_BUFFER 512
enum LogLevel { DEBUG = 0, INFO = 1, WARNING = 2, ERROR = 3 };
class LogEvent {
public:
uint32_t id;
time_t time;
LogLevel level;
String file;
uint16_t line;
String message;
static void serialize(LogEvent& logEvent, JsonObject& root) {
root["time"] = logEvent.time;
root["level"] = (uint8_t)logEvent.level;
root["file"] = logEvent.file;
root["line"] = logEvent.line;
root["message"] = logEvent.message;
}
static void deserialize(JsonObject& root, LogEvent& logEvent) {
logEvent.time = root["time"];
logEvent.level = (LogLevel)root["level"].as<uint8_t>();
logEvent.file = root["file"] | "";
logEvent.line = root["line"];
logEvent.message = root["message"] | "";
}
};
class WebSocketLogHandler {
public:
WebSocketLogHandler(AsyncWebServer* server, SecurityManager* securityManager) : _webSocket(WEB_SOCKET_LOG_PATH) {
_webSocket.setFilter(securityManager->filterRequest(AuthenticationPredicates::IS_ADMIN));
server->addHandler(&_webSocket);
server->on(WEB_SOCKET_LOG_PATH, HTTP_GET, std::bind(&WebSocketLogHandler::forbidden, this, std::placeholders::_1));
}
void begin() {
//Logger::getInstance()->addEventHandler(std::bind(&WebSocketLogHandler::logEvent, this, std::placeholders::_1));
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > 1000) {
// save the last time you blinked the LED
previousMillis = currentMillis;
helloWorld();
}
}
private:
AsyncWebSocket _webSocket;
long previousMillis;
void forbidden(AsyncWebServerRequest* request) {
request->send(403);
}
void helloWorld() {
LogEvent helloWorldEvent;
helloWorldEvent.message = "Hello world";
logEvent(helloWorldEvent);
}
boolean logEvent(LogEvent& logEvent) {
// if there are no clients, don't bother doing anything
if (!_webSocket.getClients().length()) {
return true;
}
if (!_webSocket.availableForWriteAll()) {
return false;
}
// create JsonObject to hold log event
DynamicJsonDocument jsonDocument = DynamicJsonDocument(WEB_SOCKET_LOG_BUFFER);
JsonObject jsonObject = jsonDocument.to<JsonObject>();
jsonObject["time"] = ESPUtils::toISOString(localtime(&logEvent.time), true);
jsonObject["level"] = logEvent.level;
jsonObject["file"] = logEvent.file;
jsonObject["line"] = logEvent.line;
jsonObject["message"] = logEvent.message;
// transmit log event to all clients
size_t len = measureJson(jsonDocument);
AsyncWebSocketMessageBuffer* buffer = _webSocket.makeBuffer(len);
if (buffer) {
serializeJson(jsonDocument, (char*)buffer->get(), len + 1);
_webSocket.textAll(buffer);
}
return true;
}
};
#endif