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(unsigned long 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 std::string eventName, 28 std::string eventPayload) { 29 std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent; 30 { 31 const std::lock_guard<std::mutex> lock(instanceMutex); 32 auto handlersIt = eventMappings.find(eventName); 33 if (handlersIt != eventMappings.end()) { 34 for (auto handler : handlersIt->second) { 35 handlersForEvent.push_back(handler.second); 36 } 37 } 38 } 39 // We receive here a JS Map with JSON as a value of NativeMap key 40 // { NativeMap: { "jsonProp": "json value" } } 41 // So we need to extract only JSON part 42 std::string delimimter = "NativeMap:"; 43 auto positionToSplit = eventPayload.find(delimimter) + delimimter.size(); 44 auto lastBracketCharactedPosition = eventPayload.size() - positionToSplit - 1; 45 auto eventJSON = 46 eventPayload.substr(positionToSplit, lastBracketCharactedPosition); 47 48 if (eventJSON.compare(std::string("null")) == 0) { 49 return; 50 } 51 52 auto eventObject = jsi::Value::createFromJsonUtf8( 53 rt, reinterpret_cast<uint8_t *>(&eventJSON[0]), eventJSON.size()); 54 55 eventObject.asObject(rt).setProperty( 56 rt, "eventName", jsi::String::createFromUtf8(rt, eventName)); 57 for (auto handler : handlersForEvent) { 58 handler->process(rt, eventObject); 59 } 60 } 61 62 bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(std::string eventName) { 63 const std::lock_guard<std::mutex> lock(instanceMutex); 64 auto it = eventMappings.find(eventName); 65 return (it != eventMappings.end()) && (!(it->second).empty()); 66 } 67 68 } // namespace reanimated 69