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