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(uint64_t id)13 void EventHandlerRegistry::unregisterEventHandler(uint64_t 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,double eventTimestamp,const std::string & eventName,const jsi::Value & eventPayload)25 void EventHandlerRegistry::processEvent(
26 jsi::Runtime &rt,
27 double eventTimestamp,
28 const std::string &eventName,
29 const jsi::Value &eventPayload) {
30 std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent;
31 {
32 const std::lock_guard<std::mutex> lock(instanceMutex);
33 auto handlersIt = eventMappings.find(eventName);
34 if (handlersIt != eventMappings.end()) {
35 for (auto handler : handlersIt->second) {
36 handlersForEvent.push_back(handler.second);
37 }
38 }
39 }
40
41 eventPayload.asObject(rt).setProperty(
42 rt, "eventName", jsi::String::createFromUtf8(rt, eventName));
43 for (auto handler : handlersForEvent) {
44 handler->process(eventTimestamp, eventPayload);
45 }
46 }
47
isAnyHandlerWaitingForEvent(const std::string & eventName)48 bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(
49 const std::string &eventName) {
50 const std::lock_guard<std::mutex> lock(instanceMutex);
51 auto it = eventMappings.find(eventName);
52 return (it != eventMappings.end()) && (!(it->second).empty());
53 }
54
55 } // namespace reanimated
56