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