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