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