1*4440fb50SKudo Chien #include "EventHandlerRegistry.h"
2*4440fb50SKudo Chien #include "WorkletEventHandler.h"
3*4440fb50SKudo Chien
4*4440fb50SKudo Chien namespace reanimated {
5*4440fb50SKudo Chien
registerEventHandler(std::shared_ptr<WorkletEventHandler> eventHandler)6*4440fb50SKudo Chien void EventHandlerRegistry::registerEventHandler(
7*4440fb50SKudo Chien std::shared_ptr<WorkletEventHandler> eventHandler) {
8*4440fb50SKudo Chien const std::lock_guard<std::mutex> lock(instanceMutex);
9*4440fb50SKudo Chien eventMappings[eventHandler->eventName][eventHandler->id] = eventHandler;
10*4440fb50SKudo Chien eventHandlers[eventHandler->id] = eventHandler;
11*4440fb50SKudo Chien }
12*4440fb50SKudo Chien
unregisterEventHandler(uint64_t id)13*4440fb50SKudo Chien void EventHandlerRegistry::unregisterEventHandler(uint64_t id) {
14*4440fb50SKudo Chien const std::lock_guard<std::mutex> lock(instanceMutex);
15*4440fb50SKudo Chien auto handlerIt = eventHandlers.find(id);
16*4440fb50SKudo Chien if (handlerIt != eventHandlers.end()) {
17*4440fb50SKudo Chien eventMappings[handlerIt->second->eventName].erase(id);
18*4440fb50SKudo Chien if (eventMappings[handlerIt->second->eventName].empty()) {
19*4440fb50SKudo Chien eventMappings.erase(handlerIt->second->eventName);
20*4440fb50SKudo Chien }
21*4440fb50SKudo Chien eventHandlers.erase(handlerIt);
22*4440fb50SKudo Chien }
23*4440fb50SKudo Chien }
24*4440fb50SKudo Chien
processEvent(jsi::Runtime & rt,double eventTimestamp,const std::string & eventName,const jsi::Value & eventPayload)25*4440fb50SKudo Chien void EventHandlerRegistry::processEvent(
26*4440fb50SKudo Chien jsi::Runtime &rt,
27*4440fb50SKudo Chien double eventTimestamp,
28*4440fb50SKudo Chien const std::string &eventName,
29*4440fb50SKudo Chien const jsi::Value &eventPayload) {
30*4440fb50SKudo Chien std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent;
31*4440fb50SKudo Chien {
32*4440fb50SKudo Chien const std::lock_guard<std::mutex> lock(instanceMutex);
33*4440fb50SKudo Chien auto handlersIt = eventMappings.find(eventName);
34*4440fb50SKudo Chien if (handlersIt != eventMappings.end()) {
35*4440fb50SKudo Chien for (auto handler : handlersIt->second) {
36*4440fb50SKudo Chien handlersForEvent.push_back(handler.second);
37*4440fb50SKudo Chien }
38*4440fb50SKudo Chien }
39*4440fb50SKudo Chien }
40*4440fb50SKudo Chien
41*4440fb50SKudo Chien eventPayload.asObject(rt).setProperty(
42*4440fb50SKudo Chien rt, "eventName", jsi::String::createFromUtf8(rt, eventName));
43*4440fb50SKudo Chien for (auto handler : handlersForEvent) {
44*4440fb50SKudo Chien handler->process(eventTimestamp, eventPayload);
45*4440fb50SKudo Chien }
46*4440fb50SKudo Chien }
47*4440fb50SKudo Chien
isAnyHandlerWaitingForEvent(const std::string & eventName)48*4440fb50SKudo Chien bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(
49*4440fb50SKudo Chien const std::string &eventName) {
50*4440fb50SKudo Chien const std::lock_guard<std::mutex> lock(instanceMutex);
51*4440fb50SKudo Chien auto it = eventMappings.find(eventName);
52*4440fb50SKudo Chien return (it != eventMappings.end()) && (!(it->second).empty());
53*4440fb50SKudo Chien }
54*4440fb50SKudo Chien
55*4440fb50SKudo Chien } // namespace reanimated
56