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