#pragma once #include #include #include template class EventEndpoint { public: EventEndpoint(JsonStateReader stateReader, JsonStateUpdater stateUpdater, StatefulService *statefulService, const char *event) : _stateReader(stateReader), _stateUpdater(stateUpdater), _statefulService(statefulService), _event(event) { _statefulService->addUpdateHandler([&](const String &originId) { syncState(originId); }, false); } void begin() { socket.onEvent(_event, std::bind(&EventEndpoint::updateState, this, std::placeholders::_1, std::placeholders::_2)); socket.onSubscribe(_event, std::bind(&EventEndpoint::syncState, this, std::placeholders::_1, std::placeholders::_2)); } private: JsonStateReader _stateReader; JsonStateUpdater _stateUpdater; StatefulService *_statefulService; const char *_event; void updateState(JsonObject &root, int originId) { _statefulService->update(root, _stateUpdater, String(originId)); } void syncState(const String &originId, bool sync = false) { JsonDocument jsonDocument; JsonObject root = jsonDocument.to(); String output; _statefulService->read(root, _stateReader); serializeJson(root, output); ESP_LOGV("EventEndpoint", "Syncing state: %s", output.c_str()); socket.emit(_event, output.c_str(), originId.c_str(), sync); } };