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