1 #include "EventHandlerRegistry.h" 2 #include "WorkletEventHandler.h" 3 4 namespace reanimated { 5 6 void EventHandlerRegistry::registerEventHandler(std::shared_ptr<WorkletEventHandler> eventHandler) { 7 const std::lock_guard<std::mutex> lock(instanceMutex); 8 eventMappings[eventHandler->eventName][eventHandler->id] = eventHandler; 9 eventHandlers[eventHandler->id] = eventHandler; 10 } 11 12 void EventHandlerRegistry::unregisterEventHandler(unsigned long id) { 13 const std::lock_guard<std::mutex> lock(instanceMutex); 14 auto handlerIt = eventHandlers.find(id); 15 if (handlerIt != eventHandlers.end()) { 16 eventMappings[handlerIt->second->eventName].erase(id); 17 if (eventMappings[handlerIt->second->eventName].empty()) { 18 eventMappings.erase(handlerIt->second->eventName); 19 } 20 eventHandlers.erase(handlerIt); 21 } 22 } 23 24 void EventHandlerRegistry::processEvent(jsi::Runtime &rt, std::string eventName, std::string eventPayload) { 25 std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent; 26 { 27 const std::lock_guard<std::mutex> lock(instanceMutex); 28 auto handlersIt = eventMappings.find(eventName); 29 if (handlersIt != eventMappings.end()) { 30 for (auto handler : handlersIt->second) { 31 handlersForEvent.push_back(handler.second); 32 } 33 } 34 } 35 // We receive here a JS Map with JSON as a value of NativeMap key 36 // { NativeMap: { "jsonProp": "json value" } } 37 // So we need to extract only JSON part 38 std::string delimimter = "NativeMap:"; 39 auto positionToSplit = eventPayload.find(delimimter) + delimimter.size(); 40 auto lastBracketCharactedPosition = eventPayload.size() - positionToSplit - 1; 41 auto eventJSON = eventPayload.substr(positionToSplit, lastBracketCharactedPosition); 42 43 if (eventJSON.compare(std::string("null")) == 0) { 44 return; 45 } 46 47 auto eventObject = jsi::Value::createFromJsonUtf8(rt, (uint8_t*)(&eventJSON[0]), eventJSON.size()); 48 49 eventObject.asObject(rt).setProperty(rt, "eventName", jsi::String::createFromUtf8(rt, eventName)); 50 for (auto handler : handlersForEvent) { 51 handler->process(rt, eventObject); 52 } 53 } 54 55 bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(std::string eventName) { 56 const std::lock_guard<std::mutex> lock(instanceMutex); 57 auto it = eventMappings.find(eventName); 58 return (it != eventMappings.end()) and (!(it->second).empty()); 59 } 60 61 } 62