1 #include "EventHandlerRegistry.h"
2 #include "WorkletEventHandler.h"
3 
4 namespace reanimated {
5 
registerEventHandler(std::shared_ptr<WorkletEventHandler> eventHandler)6 void EventHandlerRegistry::registerEventHandler(
7     std::shared_ptr<WorkletEventHandler> eventHandler) {
8   const std::lock_guard<std::mutex> lock(instanceMutex);
9   eventMappings[eventHandler->eventName][eventHandler->id] = eventHandler;
10   eventHandlers[eventHandler->id] = eventHandler;
11 }
12 
unregisterEventHandler(uint64_t id)13 void EventHandlerRegistry::unregisterEventHandler(uint64_t id) {
14   const std::lock_guard<std::mutex> lock(instanceMutex);
15   auto handlerIt = eventHandlers.find(id);
16   if (handlerIt != eventHandlers.end()) {
17     eventMappings[handlerIt->second->eventName].erase(id);
18     if (eventMappings[handlerIt->second->eventName].empty()) {
19       eventMappings.erase(handlerIt->second->eventName);
20     }
21     eventHandlers.erase(handlerIt);
22   }
23 }
24 
processEvent(jsi::Runtime & rt,double eventTimestamp,const std::string & eventName,const jsi::Value & eventPayload)25 void EventHandlerRegistry::processEvent(
26     jsi::Runtime &rt,
27     double eventTimestamp,
28     const std::string &eventName,
29     const jsi::Value &eventPayload) {
30   std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent;
31   {
32     const std::lock_guard<std::mutex> lock(instanceMutex);
33     auto handlersIt = eventMappings.find(eventName);
34     if (handlersIt != eventMappings.end()) {
35       for (auto handler : handlersIt->second) {
36         handlersForEvent.push_back(handler.second);
37       }
38     }
39   }
40 
41   eventPayload.asObject(rt).setProperty(
42       rt, "eventName", jsi::String::createFromUtf8(rt, eventName));
43   for (auto handler : handlersForEvent) {
44     handler->process(eventTimestamp, eventPayload);
45   }
46 }
47 
isAnyHandlerWaitingForEvent(const std::string & eventName)48 bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(
49     const std::string &eventName) {
50   const std::lock_guard<std::mutex> lock(instanceMutex);
51   auto it = eventMappings.find(eventName);
52   return (it != eventMappings.end()) && (!(it->second).empty());
53 }
54 
55 } // namespace reanimated
56