Skip to content

Commit

Permalink
Add native synchronous event support (facebook#44451)
Browse files Browse the repository at this point in the history
Summary:

Changelog: [internal]

Exposing the experimental API EventEmitter::experimental_flushSync to trigger synchronous events from Android. The API will be changed in the future, this is exposed only for experimentation.

Reviewed By: NickGerleman

Differential Revision: D56886402
  • Loading branch information
Thomas Nardone authored and facebook-github-bot committed May 8, 2024
1 parent 01cbb17 commit 385fe9d
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ private EventEmitterWrapper(HybridData hybridData) {
private native void dispatchEvent(
String eventName, @Nullable NativeMap params, @EventCategoryDef int category);

private native void dispatchEventSynchronously(String eventName, @Nullable NativeMap params);

private native void dispatchUniqueEvent(String eventName, @Nullable NativeMap params);

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,22 @@ void EventEmitterWrapper::dispatchEvent(
}
}

void EventEmitterWrapper::dispatchEventSynchronously(
std::string eventName,
NativeMap* params) {
// It is marginal, but possible for this to be constructed without a valid
// EventEmitter. In those cases, make sure we noop/blackhole events instead of
// crashing.
if (eventEmitter != nullptr) {
eventEmitter->experimental_flushSync([&]() {
eventEmitter->dispatchEvent(
std::move(eventName),
(params != nullptr) ? params->consume() : folly::dynamic::object(),
RawEvent::Category::Discrete);
});
}
}

void EventEmitterWrapper::dispatchUniqueEvent(
std::string eventName,
NativeMap* payload) {
Expand All @@ -44,6 +60,9 @@ void EventEmitterWrapper::registerNatives() {
makeNativeMethod("dispatchEvent", EventEmitterWrapper::dispatchEvent),
makeNativeMethod(
"dispatchUniqueEvent", EventEmitterWrapper::dispatchUniqueEvent),
makeNativeMethod(
"dispatchEventSynchronously",
EventEmitterWrapper::dispatchEventSynchronously),
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class EventEmitterWrapper : public jni::HybridClass<EventEmitterWrapper> {
SharedEventEmitter eventEmitter;

void dispatchEvent(std::string eventName, NativeMap* params, int category);
void dispatchEventSynchronously(std::string eventName, NativeMap* params);
void dispatchUniqueEvent(std::string eventName, NativeMap* params);
};

Expand Down

0 comments on commit 385fe9d

Please sign in to comment.