From ffdfbbec08b1afb1970d2cfe75a78a203d4a79a4 Mon Sep 17 00:00:00 2001 From: Peter Argany Date: Fri, 7 Aug 2020 11:53:58 -0700 Subject: [PATCH] Support bridgeless in RCTEventDispatcher Summary: This ties the stack together, utilizes new TM functionality to avoid using the bridge in `RCTEventDispatcher`. Changelog: [Internal] Differential Revision: D22962320 fbshipit-source-id: de4e001a4a6ce232c37d7feed1e0c0d1d70a80f8 --- React/Base/RCTEventDispatcher.h | 3 +- React/Base/RCTEventDispatcher.m | 49 +++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/React/Base/RCTEventDispatcher.h b/React/Base/RCTEventDispatcher.h index dd00be3aaa1..dfaba98c2cf 100644 --- a/React/Base/RCTEventDispatcher.h +++ b/React/Base/RCTEventDispatcher.h @@ -8,6 +8,7 @@ #import #import +#import typedef NS_ENUM(NSInteger, RCTTextEventType) { RCTTextEventTypeFocus, @@ -79,7 +80,7 @@ RCT_EXTERN NSString *RCTNormalizeInputEventName(NSString *eventName); * This class wraps the -[RCTBridge enqueueJSCall:args:] method, and * provides some convenience methods for generating event calls. */ -@interface RCTEventDispatcher : NSObject +@interface RCTEventDispatcher : NSObject /** * Deprecated, do not use. diff --git a/React/Base/RCTEventDispatcher.m b/React/Base/RCTEventDispatcher.m index 3da2e268ed7..2930fa855ee 100644 --- a/React/Base/RCTEventDispatcher.m +++ b/React/Base/RCTEventDispatcher.m @@ -48,6 +48,9 @@ static uint16_t RCTUniqueCoalescingKeyGenerator = 0; } @synthesize bridge = _bridge; +@synthesize dispatchToJSThread = _dispatchToJSThread; +@synthesize invokeJS = _invokeJS; +@synthesize invokeJSWithModuleDotMethod = _invokeJSWithModuleDotMethod; RCT_EXPORT_MODULE() @@ -64,18 +67,26 @@ RCT_EXPORT_MODULE() - (void)sendAppEventWithName:(NSString *)name body:(id)body { - [_bridge enqueueJSCall:@"RCTNativeAppEventEmitter" - method:@"emit" - args:body ? @[ name, body ] : @[ name ] - completion:NULL]; + if (_bridge) { + [_bridge enqueueJSCall:@"RCTNativeAppEventEmitter" + method:@"emit" + args:body ? @[ name, body ] : @[ name ] + completion:NULL]; + } else { + _invokeJS(@"RCTNativeAppEventEmitter", @"emit", body ? @[ name, body ] : @[ name ]); + } } - (void)sendDeviceEventWithName:(NSString *)name body:(id)body { - [_bridge enqueueJSCall:@"RCTDeviceEventEmitter" - method:@"emit" - args:body ? @[ name, body ] : @[ name ] - completion:NULL]; + if (_bridge) { + [_bridge enqueueJSCall:@"RCTDeviceEventEmitter" + method:@"emit" + args:body ? @[ name, body ] : @[ name ] + completion:NULL]; + } else { + _invokeJS(@"RCTDeviceEventEmitter", @"emit", body ? @[ name, body ] : @[ name ]); + } } - (void)sendTextEventWithType:(RCTTextEventType)type @@ -162,11 +173,17 @@ RCT_EXPORT_MODULE() [_eventQueueLock unlock]; if (scheduleEventsDispatch) { - [_bridge - dispatchBlock:^{ - [self flushEventsQueue]; - } - queue:RCTJSThread]; + if (_bridge) { + [_bridge + dispatchBlock:^{ + [self flushEventsQueue]; + } + queue:RCTJSThread]; + } else { + _dispatchToJSThread(^{ + [self flushEventsQueue]; + }); + } } } @@ -186,7 +203,11 @@ RCT_EXPORT_MODULE() - (void)dispatchEvent:(id)event { - [_bridge enqueueJSCall:[[event class] moduleDotMethod] args:[event arguments]]; + if (_bridge) { + [_bridge enqueueJSCall:[[event class] moduleDotMethod] args:[event arguments]]; + } else { + _invokeJSWithModuleDotMethod([[event class] moduleDotMethod], [event arguments]); + } } - (dispatch_queue_t)methodQueue