Skip to content

Commit 636665c

Browse files
RSNarafacebook-github-bot
authored andcommitted
Bridgeless: Introduce main queue setup api in turbo modules (#49957)
Summary: Pull Request resolved: #49957 ## Changes This diff introduces the api for "main queue modules" into turbo modules. This will occur occurs before any rendering. ## Rationale Rendering can now include main -> js sync calls. If we allow js -> main sync calls during rendering, react native can deadlock. With this diff, we can move the js -> main sync calls to before any rendering happens. ## APIs **Buck API:** Plugin: ``` react_module_plugin_providers( name = "AccessibilityManager", native_class_func = "RCTAccessibilityManagerCls", unstable_requires_main_queue_setup = True, ) ``` **OSS API:** [codegenConfig](https://reactnative.dev/docs/the-new-architecture/using-codegen) in package.json: ``` "codegenConfig": { "name": "<SpecName>", "type": "<types>", "jsSrcsDir": "<source_dir>", "android": { "javaPackageName": "<java.package.name>" }, "ios": { "modules": { "AccessibilityManager": { "className": "RCTAccessibilityManager", "unstableRequiresMainQueueSetup": true } } } }, ``` Changelog: [iOS][Added] Introduce unstableRequiresMainQueueSetup api to modules Reviewed By: cipolleschi Differential Revision: D70413478 fbshipit-source-id: 78d89437c2869a979ae5c94f08b01087686dfae7
1 parent 0448cf2 commit 636665c

17 files changed

+256
-6
lines changed

packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
namespace facebook::react {
3333
class RuntimeScheduler;
3434
}
35+
RCT_EXTERN NSArray<NSString *> *RCTAppSetupUnstableModulesRequiringMainQueueSetup(
36+
id<RCTDependencyProvider> dependencyProvider);
3537

3638
RCT_EXTERN id<RCTTurboModule> RCTAppSetupDefaultModuleFromClass(
3739
Class moduleClass,

packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled)
5454
return [[RCTRootView alloc] initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties];
5555
}
5656

57+
NSArray<NSString *> *RCTAppSetupUnstableModulesRequiringMainQueueSetup(id<RCTDependencyProvider> dependencyProvider)
58+
{
59+
// For oss, insert core main queue setup modules here
60+
return dependencyProvider ? dependencyProvider.unstableModulesRequiringMainQueueSetup : @[];
61+
}
62+
5763
id<RCTTurboModule> RCTAppSetupDefaultModuleFromClass(Class moduleClass, id<RCTDependencyProvider> dependencyProvider)
5864
{
5965
// private block used to filter out modules depending on protocol conformance

packages/react-native/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ - (void)hostDidStart:(RCTHost *)host
9292
{
9393
}
9494

95+
- (NSArray<NSString *> *)unstableModulesRequiringMainQueueSetup
96+
{
97+
return self.dependencyProvider ? RCTAppSetupUnstableModulesRequiringMainQueueSetup(self.dependencyProvider) : @[];
98+
}
99+
95100
- (nullable id<RCTModuleProvider>)getModuleProvider:(const char *)name
96101
{
97102
NSString *providerName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];

packages/react-native/Libraries/AppDelegate/RCTDependencyProvider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ NS_ASSUME_NONNULL_BEGIN
2020

2121
- (NSArray<NSString *> *)URLRequestHandlerClassNames;
2222

23+
- (NSArray<NSString *> *)unstableModulesRequiringMainQueueSetup;
24+
2325
- (NSDictionary<NSString *, Class<RCTComponentViewProtocol>> *)thirdPartyFabricComponents;
2426

2527
- (nonnull NSDictionary<NSString *, id<RCTModuleProvider>> *)moduleProviders;

packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,17 @@ - (void)hostDidStart:(RCTHost *)host
229229
}
230230
}
231231

232+
- (NSArray<NSString *> *)unstableModulesRequiringMainQueueSetup
233+
{
234+
#if RN_DISABLE_OSS_PLUGIN_HEADER
235+
return RCTTurboModulePluginUnstableModulesRequiringMainQueueSetup();
236+
#else
237+
return self.delegate.dependencyProvider
238+
? RCTAppSetupUnstableModulesRequiringMainQueueSetup(self.delegate.dependencyProvider)
239+
: @[];
240+
#endif
241+
}
242+
232243
- (RCTRootViewFactory *)createRCTRootViewFactory
233244
{
234245
__weak __typeof(self) weakSelf = self;

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ typedef NSURL *_Nullable (^RCTHostBundleURLProvider)(void);
3030
- (void)hostDidStart:(RCTHost *)host;
3131

3232
@optional
33+
- (NSArray<NSString *> *)unstableModulesRequiringMainQueueSetup;
34+
3335
- (void)loadBundleAtURL:(NSURL *)sourceURL
3436
onProgress:(RCTSourceLoadProgressBlock)onProgress
3537
onComplete:(RCTSourceLoadBlock)loadCallback;

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,14 @@ - (void)dealloc
307307

308308
#pragma mark - RCTInstanceDelegate
309309

310+
- (NSArray<NSString *> *)unstableModulesRequiringMainQueueSetup
311+
{
312+
if ([_hostDelegate respondsToSelector:@selector(unstableModulesRequiringMainQueueSetup)]) {
313+
return [_hostDelegate unstableModulesRequiringMainQueueSetup];
314+
}
315+
return @[];
316+
}
317+
310318
- (BOOL)instance:(RCTInstance *)instance
311319
didReceiveJSErrorStack:(NSArray<NSDictionary<NSString *, id> *> *)stack
312320
message:(NSString *)message

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ RCT_EXTERN void RCTInstanceSetRuntimeDiagnosticFlags(NSString *_Nullable flags);
4343
onProgress:(RCTSourceLoadProgressBlock)onProgress
4444
onComplete:(RCTSourceLoadBlock)loadCallback;
4545

46+
- (NSArray<NSString *> *)unstableModulesRequiringMainQueueSetup;
47+
4648
// TODO(T205780509): Remove this api in react native v0.78
4749
// The bridgeless js error handling api will just call into exceptionsmanager directly
4850
- (BOOL)instance:(RCTInstance *)instance

packages/react-native/scripts/codegen/__test_fixtures__/test-app/lib/test-library/package.json

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,26 @@
3434
"componentProvider": {
3535
"TestLibraryDeprecatedComponent": "RCTTestLibraryDeprecatedComponentClass"
3636
},
37+
"unstableModulesRequiringMainQueueSetup": [
38+
"RCTTestLibraryDeprecatedImageURLLoader",
39+
"RCTTestLibraryDeprecatedURLRequestHandler",
40+
"RCTTestLibraryDeprecatedImageDataDecoder"
41+
],
3742
"modules": {
3843
"TestLibraryImageURLLoader": {
3944
"conformsToProtocols": ["RCTImageURLLoader"],
40-
"className": "RCTTestLibraryImageURLLoader"
45+
"className": "RCTTestLibraryImageURLLoader",
46+
"unstableRequiresMainQueueSetup": true
4147
},
4248
"TestLibraryURLRequestHandler": {
4349
"conformsToProtocols": ["RCTURLRequestHandler"],
44-
"className": "RCTTestLibraryURLRequestHandler"
50+
"className": "RCTTestLibraryURLRequestHandler",
51+
"unstableRequiresMainQueueSetup": true
4552
},
4653
"TestLibraryImageDataDecoder": {
4754
"conformsToProtocols": ["RCTImageDataDecoder"],
48-
"className": "RCTTestLibraryImageDataDecoder"
55+
"className": "RCTTestLibraryImageDataDecoder",
56+
"unstableRequiresMainQueueSetup": true
4957
}
5058
},
5159
"components": {

packages/react-native/scripts/codegen/__test_fixtures__/test-app/package.json

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,26 @@
3535
"componentProvider": {
3636
"TestAppDeprecatedComponent": "RCTTestAppDeprecatedComponentClass"
3737
},
38+
"unstableModulesRequiringMainQueueSetup": [
39+
"RCTTestAppDeprecatedImageURLLoader",
40+
"RCTTestAppDeprecatedURLRequestHandler",
41+
"RCTTestAppDeprecatedImageDataDecoder"
42+
],
3843
"modules": {
3944
"TestAppImageURLLoader": {
4045
"conformsToProtocols": ["RCTImageURLLoader"],
41-
"className": "RCTTestAppImageURLLoader"
46+
"className": "RCTTestAppImageURLLoader",
47+
"unstableRequiresMainQueueSetup": true
4248
},
4349
"TestAppURLRequestHandler": {
4450
"conformsToProtocols": ["RCTURLRequestHandler"],
45-
"className": "RCTTestAppURLRequestHandler"
51+
"className": "RCTTestAppURLRequestHandler",
52+
"unstableRequiresMainQueueSetup": true
4653
},
4754
"TestAppImageDataDecoder": {
4855
"conformsToProtocols": ["RCTImageDataDecoder"],
49-
"className": "RCTTestAppImageDataDecoder"
56+
"className": "RCTTestAppImageDataDecoder",
57+
"unstableRequiresMainQueueSetup": true
5058
}
5159
},
5260
"components": {

0 commit comments

Comments
 (0)