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