1 #include "EventHandlerRegistry.h"
2 #include "WorkletEventHandler.h"
3
4 namespace reanimated {
5
registerEventHandler(std::shared_ptr<WorkletEventHandler> eventHandler)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
unregisterEventHandler(unsigned long id)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
processEvent(jsi::Runtime & rt,std::string eventName,std::string eventPayload)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
isAnyHandlerWaitingForEvent(std::string eventName)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