104819bfdSŁukasz Kosmaty #include "EventHandlerRegistry.h"
204819bfdSŁukasz Kosmaty #include "WorkletEventHandler.h"
304819bfdSŁukasz Kosmaty
404819bfdSŁukasz Kosmaty namespace reanimated {
504819bfdSŁukasz Kosmaty
registerEventHandler(std::shared_ptr<WorkletEventHandler> eventHandler)604819bfdSŁukasz Kosmaty void EventHandlerRegistry::registerEventHandler(
704819bfdSŁukasz Kosmaty std::shared_ptr<WorkletEventHandler> eventHandler) {
804819bfdSŁukasz Kosmaty const std::lock_guard<std::mutex> lock(instanceMutex);
904819bfdSŁukasz Kosmaty eventMappings[eventHandler->eventName][eventHandler->id] = eventHandler;
1004819bfdSŁukasz Kosmaty eventHandlers[eventHandler->id] = eventHandler;
1104819bfdSŁukasz Kosmaty }
1204819bfdSŁukasz Kosmaty
unregisterEventHandler(uint64_t id)13*5f154df9Saleqsio void EventHandlerRegistry::unregisterEventHandler(uint64_t id) {
1404819bfdSŁukasz Kosmaty const std::lock_guard<std::mutex> lock(instanceMutex);
1504819bfdSŁukasz Kosmaty auto handlerIt = eventHandlers.find(id);
1604819bfdSŁukasz Kosmaty if (handlerIt != eventHandlers.end()) {
1704819bfdSŁukasz Kosmaty eventMappings[handlerIt->second->eventName].erase(id);
1804819bfdSŁukasz Kosmaty if (eventMappings[handlerIt->second->eventName].empty()) {
1904819bfdSŁukasz Kosmaty eventMappings.erase(handlerIt->second->eventName);
2004819bfdSŁukasz Kosmaty }
2104819bfdSŁukasz Kosmaty eventHandlers.erase(handlerIt);
2204819bfdSŁukasz Kosmaty }
2304819bfdSŁukasz Kosmaty }
2404819bfdSŁukasz Kosmaty
processEvent(jsi::Runtime & rt,double eventTimestamp,const std::string & eventName,const jsi::Value & eventPayload)2504819bfdSŁukasz Kosmaty void EventHandlerRegistry::processEvent(
2604819bfdSŁukasz Kosmaty jsi::Runtime &rt,
27*5f154df9Saleqsio double eventTimestamp,
28*5f154df9Saleqsio const std::string &eventName,
29*5f154df9Saleqsio const jsi::Value &eventPayload) {
3004819bfdSŁukasz Kosmaty std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent;
3104819bfdSŁukasz Kosmaty {
3204819bfdSŁukasz Kosmaty const std::lock_guard<std::mutex> lock(instanceMutex);
3304819bfdSŁukasz Kosmaty auto handlersIt = eventMappings.find(eventName);
3404819bfdSŁukasz Kosmaty if (handlersIt != eventMappings.end()) {
3504819bfdSŁukasz Kosmaty for (auto handler : handlersIt->second) {
3604819bfdSŁukasz Kosmaty handlersForEvent.push_back(handler.second);
3704819bfdSŁukasz Kosmaty }
3804819bfdSŁukasz Kosmaty }
3904819bfdSŁukasz Kosmaty }
4004819bfdSŁukasz Kosmaty
41*5f154df9Saleqsio eventPayload.asObject(rt).setProperty(
4204819bfdSŁukasz Kosmaty rt, "eventName", jsi::String::createFromUtf8(rt, eventName));
4304819bfdSŁukasz Kosmaty for (auto handler : handlersForEvent) {
44*5f154df9Saleqsio handler->process(eventTimestamp, eventPayload);
4504819bfdSŁukasz Kosmaty }
4604819bfdSŁukasz Kosmaty }
4704819bfdSŁukasz Kosmaty
isAnyHandlerWaitingForEvent(const std::string & eventName)48*5f154df9Saleqsio bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(
49*5f154df9Saleqsio const std::string &eventName) {
5004819bfdSŁukasz Kosmaty const std::lock_guard<std::mutex> lock(instanceMutex);
5104819bfdSŁukasz Kosmaty auto it = eventMappings.find(eventName);
5204819bfdSŁukasz Kosmaty return (it != eventMappings.end()) && (!(it->second).empty());
5304819bfdSŁukasz Kosmaty }
5404819bfdSŁukasz Kosmaty
5504819bfdSŁukasz Kosmaty } // namespace reanimated
56