1 #include "EventHandlerRegistry.h" 2 #include "WorkletEventHandler.h" 3 4 namespace reanimated { 5 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 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 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 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