react-native 0.83.0-rc.0 → 0.83.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/Libraries/Core/ReactNativeVersion.js +1 -1
  2. package/React/Base/RCTVersion.m +1 -1
  3. package/React/CoreModules/React-CoreModules.podspec +1 -0
  4. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +8 -0
  5. package/React/Runtime/React-RCTRuntime.podspec +1 -0
  6. package/ReactAndroid/gradle.properties +1 -1
  7. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +7 -1
  8. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +11 -1
  9. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +3 -1
  10. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +3 -1
  11. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +12 -1
  12. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +3 -1
  13. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  14. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +15 -1
  15. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +4 -1
  16. package/ReactCommon/cxxreact/React-cxxreact.podspec +1 -0
  17. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  18. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +1 -0
  19. package/ReactCommon/jsinspector-modern/HostAgent.cpp +33 -0
  20. package/ReactCommon/jsinspector-modern/HostAgent.h +6 -0
  21. package/ReactCommon/jsinspector-modern/HostTarget.h +5 -0
  22. package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +6 -0
  23. package/ReactCommon/jsinspector-modern/InspectorFlags.h +7 -0
  24. package/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +37 -0
  25. package/ReactCommon/jsinspector-modern/InspectorInterfaces.h +12 -1
  26. package/ReactCommon/jsinspector-modern/TracingAgent.cpp +11 -1
  27. package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +4 -0
  28. package/ReactCommon/jsitooling/React-jsitooling.podspec +1 -0
  29. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +5 -1
  30. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +6 -1
  31. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +48 -30
  32. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +4 -2
  33. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +5 -1
  34. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +10 -1
  35. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +2 -1
  36. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +6 -1
  37. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +3 -1
  38. package/ReactCommon/react/utils/React-utils.podspec +3 -1
  39. package/package.json +9 -8
  40. package/scripts/cocoapods/rncore.rb +3 -2
  41. package/sdks/.hermesv1version +1 -0
  42. package/sdks/hermes-engine/version.properties +1 -1
  43. package/src/private/featureflags/ReactNativeFeatureFlags.js +6 -1
  44. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +2 -1
@@ -29,7 +29,7 @@ export default class ReactNativeVersion {
29
29
  static major: number = 0;
30
30
  static minor: number = 83;
31
31
  static patch: number = 0;
32
- static prerelease: string | null = 'rc.0';
32
+ static prerelease: string | null = 'rc.1';
33
33
 
34
34
  static getVersionString(): string {
35
35
  return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`;
@@ -24,7 +24,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(83),
26
26
  RCTVersionPatch: @(0),
27
- RCTVersionPrerelease: @"rc.0",
27
+ RCTVersionPrerelease: @"rc.1",
28
28
  };
29
29
  });
30
30
  return __rnVersion;
@@ -61,6 +61,7 @@ Pod::Spec.new do |s|
61
61
  add_dependency(s, "React-RCTFBReactNativeSpec")
62
62
  add_dependency(s, "ReactCommon", :subspec => "turbomodule/core", :additional_framework_paths => ["react/nativemodule/core"])
63
63
  add_dependency(s, "React-NativeModulesApple")
64
+ add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
64
65
 
65
66
  add_rn_third_party_dependencies(s)
66
67
  add_rncore_dependency(s)
@@ -278,6 +278,7 @@ protected:
278
278
  methodMap_["enableVirtualViewWindowFocusDetection"] = MethodMetadata {.argCount = 0, .invoker = __enableVirtualViewWindowFocusDetection};
279
279
  methodMap_["enableWebPerformanceAPIsByDefault"] = MethodMetadata {.argCount = 0, .invoker = __enableWebPerformanceAPIsByDefault};
280
280
  methodMap_["fixMappingOfEventPrioritiesBetweenFabricAndReact"] = MethodMetadata {.argCount = 0, .invoker = __fixMappingOfEventPrioritiesBetweenFabricAndReact};
281
+ methodMap_["fuseboxAssertSingleHostState"] = MethodMetadata {.argCount = 0, .invoker = __fuseboxAssertSingleHostState};
281
282
  methodMap_["fuseboxEnabledRelease"] = MethodMetadata {.argCount = 0, .invoker = __fuseboxEnabledRelease};
282
283
  methodMap_["fuseboxNetworkInspectionEnabled"] = MethodMetadata {.argCount = 0, .invoker = __fuseboxNetworkInspectionEnabled};
283
284
  methodMap_["hideOffscreenVirtualViewsOnIOS"] = MethodMetadata {.argCount = 0, .invoker = __hideOffscreenVirtualViewsOnIOS};
@@ -695,6 +696,13 @@ private:
695
696
  return bridging::callFromJs<bool>(rt, &T::fixMappingOfEventPrioritiesBetweenFabricAndReact, static_cast<NativeReactNativeFeatureFlagsCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule));
696
697
  }
697
698
 
699
+ static jsi::Value __fuseboxAssertSingleHostState(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* /*args*/, size_t /*count*/) {
700
+ static_assert(
701
+ bridging::getParameterCount(&T::fuseboxAssertSingleHostState) == 1,
702
+ "Expected fuseboxAssertSingleHostState(...) to have 1 parameters");
703
+ return bridging::callFromJs<bool>(rt, &T::fuseboxAssertSingleHostState, static_cast<NativeReactNativeFeatureFlagsCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule));
704
+ }
705
+
698
706
  static jsi::Value __fuseboxEnabledRelease(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* /*args*/, size_t /*count*/) {
699
707
  static_assert(
700
708
  bridging::getParameterCount(&T::fuseboxEnabledRelease) == 1,
@@ -56,6 +56,7 @@ Pod::Spec.new do |s|
56
56
 
57
57
  add_dependency(s, "React-RuntimeCore")
58
58
  add_dependency(s, "React-RuntimeApple")
59
+ add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
59
60
 
60
61
  if use_third_party_jsc()
61
62
  s.exclude_files = ["RCTHermesInstanceFactory.{mm,h}", "RCTJscInstanceFactory.{mm,h}"]
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.83.0-rc.0
1
+ VERSION_NAME=0.83.0-rc.1
2
2
  react.internal.publishingGroup=com.facebook.react
3
3
  react.internal.hermesPublishingGroup=com.facebook.hermes
4
4
 
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<d8dc8c3a2efe8b7e870546e5749ef5ad>>
7
+ * @generated SignedSource<<09d1f1bdf5e156afcd7ce15f73ca1c3b>>
8
8
  */
9
9
 
10
10
  /**
@@ -354,6 +354,12 @@ public object ReactNativeFeatureFlags {
354
354
  @JvmStatic
355
355
  public fun fixMappingOfEventPrioritiesBetweenFabricAndReact(): Boolean = accessor.fixMappingOfEventPrioritiesBetweenFabricAndReact()
356
356
 
357
+ /**
358
+ * Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`.
359
+ */
360
+ @JvmStatic
361
+ public fun fuseboxAssertSingleHostState(): Boolean = accessor.fuseboxAssertSingleHostState()
362
+
357
363
  /**
358
364
  * Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in release builds. This flag is global and should not be changed across React Host lifetimes.
359
365
  */
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<447ccc7271b71b0208a2297b7eba5995>>
7
+ * @generated SignedSource<<017aba8e549dc289c27bb4fa93e6d038>>
8
8
  */
9
9
 
10
10
  /**
@@ -74,6 +74,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
74
74
  private var enableVirtualViewWindowFocusDetectionCache: Boolean? = null
75
75
  private var enableWebPerformanceAPIsByDefaultCache: Boolean? = null
76
76
  private var fixMappingOfEventPrioritiesBetweenFabricAndReactCache: Boolean? = null
77
+ private var fuseboxAssertSingleHostStateCache: Boolean? = null
77
78
  private var fuseboxEnabledReleaseCache: Boolean? = null
78
79
  private var fuseboxNetworkInspectionEnabledCache: Boolean? = null
79
80
  private var hideOffscreenVirtualViewsOnIOSCache: Boolean? = null
@@ -590,6 +591,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
590
591
  return cached
591
592
  }
592
593
 
594
+ override fun fuseboxAssertSingleHostState(): Boolean {
595
+ var cached = fuseboxAssertSingleHostStateCache
596
+ if (cached == null) {
597
+ cached = ReactNativeFeatureFlagsCxxInterop.fuseboxAssertSingleHostState()
598
+ fuseboxAssertSingleHostStateCache = cached
599
+ }
600
+ return cached
601
+ }
602
+
593
603
  override fun fuseboxEnabledRelease(): Boolean {
594
604
  var cached = fuseboxEnabledReleaseCache
595
605
  if (cached == null) {
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<d6403b67e269ad80ef3e2389ac923c8a>>
7
+ * @generated SignedSource<<278f3853a98e1dd72b66ad6168e11686>>
8
8
  */
9
9
 
10
10
  /**
@@ -136,6 +136,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
136
136
 
137
137
  @DoNotStrip @JvmStatic public external fun fixMappingOfEventPrioritiesBetweenFabricAndReact(): Boolean
138
138
 
139
+ @DoNotStrip @JvmStatic public external fun fuseboxAssertSingleHostState(): Boolean
140
+
139
141
  @DoNotStrip @JvmStatic public external fun fuseboxEnabledRelease(): Boolean
140
142
 
141
143
  @DoNotStrip @JvmStatic public external fun fuseboxNetworkInspectionEnabled(): Boolean
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<ab48ba86a7cf3cd35ec530a216aea774>>
7
+ * @generated SignedSource<<31da0143bec4eacc9884c950970f0a25>>
8
8
  */
9
9
 
10
10
  /**
@@ -131,6 +131,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
131
131
 
132
132
  override fun fixMappingOfEventPrioritiesBetweenFabricAndReact(): Boolean = false
133
133
 
134
+ override fun fuseboxAssertSingleHostState(): Boolean = true
135
+
134
136
  override fun fuseboxEnabledRelease(): Boolean = false
135
137
 
136
138
  override fun fuseboxNetworkInspectionEnabled(): Boolean = false
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<6f6b5abe79764b88cf3ed62fe0230786>>
7
+ * @generated SignedSource<<14a5680355bb8c42e39a67edfa6a8974>>
8
8
  */
9
9
 
10
10
  /**
@@ -78,6 +78,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
78
78
  private var enableVirtualViewWindowFocusDetectionCache: Boolean? = null
79
79
  private var enableWebPerformanceAPIsByDefaultCache: Boolean? = null
80
80
  private var fixMappingOfEventPrioritiesBetweenFabricAndReactCache: Boolean? = null
81
+ private var fuseboxAssertSingleHostStateCache: Boolean? = null
81
82
  private var fuseboxEnabledReleaseCache: Boolean? = null
82
83
  private var fuseboxNetworkInspectionEnabledCache: Boolean? = null
83
84
  private var hideOffscreenVirtualViewsOnIOSCache: Boolean? = null
@@ -648,6 +649,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
648
649
  return cached
649
650
  }
650
651
 
652
+ override fun fuseboxAssertSingleHostState(): Boolean {
653
+ var cached = fuseboxAssertSingleHostStateCache
654
+ if (cached == null) {
655
+ cached = currentProvider.fuseboxAssertSingleHostState()
656
+ accessedFeatureFlags.add("fuseboxAssertSingleHostState")
657
+ fuseboxAssertSingleHostStateCache = cached
658
+ }
659
+ return cached
660
+ }
661
+
651
662
  override fun fuseboxEnabledRelease(): Boolean {
652
663
  var cached = fuseboxEnabledReleaseCache
653
664
  if (cached == null) {
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<6b61490a8d6b1df1d6264016455382f8>>
7
+ * @generated SignedSource<<5a348c354bb6dd2ddfbc869a9e2f0dbe>>
8
8
  */
9
9
 
10
10
  /**
@@ -131,6 +131,8 @@ public interface ReactNativeFeatureFlagsProvider {
131
131
 
132
132
  @DoNotStrip public fun fixMappingOfEventPrioritiesBetweenFabricAndReact(): Boolean
133
133
 
134
+ @DoNotStrip public fun fuseboxAssertSingleHostState(): Boolean
135
+
134
136
  @DoNotStrip public fun fuseboxEnabledRelease(): Boolean
135
137
 
136
138
  @DoNotStrip public fun fuseboxNetworkInspectionEnabled(): Boolean
@@ -15,6 +15,6 @@ public object ReactNativeVersion {
15
15
  "major" to 0,
16
16
  "minor" to 83,
17
17
  "patch" to 0,
18
- "prerelease" to "rc.0"
18
+ "prerelease" to "rc.1"
19
19
  )
20
20
  }
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<13ed11b5c260fae79048ea80745d22fe>>
7
+ * @generated SignedSource<<5b2d44dcf36386f86f26c694d3f00229>>
8
8
  */
9
9
 
10
10
  /**
@@ -363,6 +363,12 @@ class ReactNativeFeatureFlagsJavaProvider
363
363
  return method(javaProvider_);
364
364
  }
365
365
 
366
+ bool fuseboxAssertSingleHostState() override {
367
+ static const auto method =
368
+ getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxAssertSingleHostState");
369
+ return method(javaProvider_);
370
+ }
371
+
366
372
  bool fuseboxEnabledRelease() override {
367
373
  static const auto method =
368
374
  getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("fuseboxEnabledRelease");
@@ -811,6 +817,11 @@ bool JReactNativeFeatureFlagsCxxInterop::fixMappingOfEventPrioritiesBetweenFabri
811
817
  return ReactNativeFeatureFlags::fixMappingOfEventPrioritiesBetweenFabricAndReact();
812
818
  }
813
819
 
820
+ bool JReactNativeFeatureFlagsCxxInterop::fuseboxAssertSingleHostState(
821
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
822
+ return ReactNativeFeatureFlags::fuseboxAssertSingleHostState();
823
+ }
824
+
814
825
  bool JReactNativeFeatureFlagsCxxInterop::fuseboxEnabledRelease(
815
826
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
816
827
  return ReactNativeFeatureFlags::fuseboxEnabledRelease();
@@ -1149,6 +1160,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
1149
1160
  makeNativeMethod(
1150
1161
  "fixMappingOfEventPrioritiesBetweenFabricAndReact",
1151
1162
  JReactNativeFeatureFlagsCxxInterop::fixMappingOfEventPrioritiesBetweenFabricAndReact),
1163
+ makeNativeMethod(
1164
+ "fuseboxAssertSingleHostState",
1165
+ JReactNativeFeatureFlagsCxxInterop::fuseboxAssertSingleHostState),
1152
1166
  makeNativeMethod(
1153
1167
  "fuseboxEnabledRelease",
1154
1168
  JReactNativeFeatureFlagsCxxInterop::fuseboxEnabledRelease),
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<1e57bf8252c16fc10bbfcae08710af85>>
7
+ * @generated SignedSource<<5a03db93d78fc1b14283ca3dc92db207>>
8
8
  */
9
9
 
10
10
  /**
@@ -192,6 +192,9 @@ class JReactNativeFeatureFlagsCxxInterop
192
192
  static bool fixMappingOfEventPrioritiesBetweenFabricAndReact(
193
193
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
194
194
 
195
+ static bool fuseboxAssertSingleHostState(
196
+ facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
197
+
195
198
  static bool fuseboxEnabledRelease(
196
199
  facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
197
200
 
@@ -44,6 +44,7 @@ Pod::Spec.new do |s|
44
44
  s.dependency "React-logger", version
45
45
  s.dependency "React-debug", version
46
46
  s.dependency "React-timing", version
47
+ add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
47
48
 
48
49
  s.resource_bundles = {'React-cxxreact_privacy' => 'PrivacyInfo.xcprivacy'}
49
50
 
@@ -22,7 +22,7 @@ constexpr struct {
22
22
  int32_t Major = 0;
23
23
  int32_t Minor = 83;
24
24
  int32_t Patch = 0;
25
- std::string_view Prerelease = "rc.0";
25
+ std::string_view Prerelease = "rc.1";
26
26
  } ReactNativeVersion;
27
27
 
28
28
  } // namespace facebook::react
@@ -37,6 +37,7 @@ Pod::Spec.new do |s|
37
37
  add_dependency(s, "React-jsinspector", :framework_name => 'jsinspector_modern')
38
38
  add_dependency(s, "React-jsinspectorcdp", :framework_name => 'jsinspector_moderncdp')
39
39
  add_dependency(s, "React-jsinspectortracing", :framework_name => 'jsinspector_moderntracing')
40
+ add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
40
41
  if use_hermes()
41
42
  s.dependency 'hermes-engine'
42
43
  end
@@ -10,6 +10,7 @@
10
10
 
11
11
  #ifdef REACT_NATIVE_DEBUGGER_ENABLED
12
12
  #include "InspectorFlags.h"
13
+ #include "InspectorInterfaces.h"
13
14
  #include "NetworkIOAgent.h"
14
15
  #include "SessionState.h"
15
16
  #include "TracingAgent.h"
@@ -145,6 +146,19 @@ class HostAgent::Impl final {
145
146
  }
146
147
  if (InspectorFlags::getInstance().getNetworkInspectionEnabled()) {
147
148
  if (req.method == "Network.enable") {
149
+ auto& inspector = getInspectorInstance();
150
+ if (inspector.getSystemState().registeredPagesCount > 1) {
151
+ frontendChannel_(
152
+ cdp::jsonError(
153
+ req.id,
154
+ cdp::ErrorCode::InternalError,
155
+ "The Network domain is unavailable when multiple React Native hosts are registered."));
156
+ return {
157
+ .isFinishedHandlingRequest = true,
158
+ .shouldSendOKResponse = false,
159
+ };
160
+ }
161
+
148
162
  sessionState_.isNetworkDomainEnabled = true;
149
163
 
150
164
  return {
@@ -216,6 +230,11 @@ class HostAgent::Impl final {
216
230
  cdp::jsonNotification(
217
231
  "ReactNativeApplication.metadataUpdated",
218
232
  createHostMetadataPayload(hostMetadata_)));
233
+ auto& inspector = getInspectorInstance();
234
+ bool isSingleHost = inspector.getSystemState().registeredPagesCount <= 1;
235
+ if (!isSingleHost) {
236
+ emitSystemStateChanged(isSingleHost);
237
+ }
219
238
 
220
239
  auto stashedTraceRecording =
221
240
  targetController_.getDelegate()
@@ -374,6 +393,15 @@ class HostAgent::Impl final {
374
393
  tracingAgent_.emitExternalTraceRecording(std::move(traceRecording));
375
394
  }
376
395
 
396
+ void emitSystemStateChanged(bool isSingleHost) {
397
+ frontendChannel_(
398
+ cdp::jsonNotification(
399
+ "ReactNativeApplication.systemStateChanged",
400
+ folly::dynamic::object("isSingleHost", isSingleHost)));
401
+
402
+ frontendChannel_(cdp::jsonNotification("Network.disable"));
403
+ }
404
+
377
405
  private:
378
406
  enum class FuseboxClientType { Unknown, Fusebox, NonFusebox };
379
407
 
@@ -480,6 +508,7 @@ class HostAgent::Impl final {
480
508
  }
481
509
  void emitExternalTraceRecording(tracing::TraceRecordingState traceRecording) {
482
510
  }
511
+ void emitSystemStateChanged(bool isSingleHost) {}
483
512
  };
484
513
 
485
514
  #endif // REACT_NATIVE_DEBUGGER_ENABLED
@@ -519,6 +548,10 @@ void HostAgent::emitExternalTraceRecording(
519
548
  impl_->emitExternalTraceRecording(std::move(traceRecording));
520
549
  }
521
550
 
551
+ void HostAgent::emitSystemStateChanged(bool isSingleHost) const {
552
+ impl_->emitSystemStateChanged(isSingleHost);
553
+ }
554
+
522
555
  #pragma mark - Tracing
523
556
 
524
557
  HostTracingAgent::HostTracingAgent(tracing::TraceRecordingState& state)
@@ -79,6 +79,12 @@ class HostAgent final {
79
79
  */
80
80
  void emitExternalTraceRecording(tracing::TraceRecordingState traceRecording) const;
81
81
 
82
+ /**
83
+ * Emits a system state changed event when the number of ReactHost instances
84
+ * changes.
85
+ */
86
+ void emitSystemStateChanged(bool isSingleHost) const;
87
+
82
88
  private:
83
89
  // We use the private implementation idiom to ensure this class has the same
84
90
  // layout regardless of whether REACT_NATIVE_DEBUGGER_ENABLED is defined. The
@@ -320,6 +320,11 @@ class JSINSPECTOR_EXPORT HostTarget : public EnableExecutorFromThis<HostTarget>
320
320
  */
321
321
  void emitTraceRecordingForFirstFuseboxClient(tracing::TraceRecordingState traceRecording) const;
322
322
 
323
+ /**
324
+ * Emits a system state changed event to all active sessions.
325
+ */
326
+ void emitSystemStateChanged(bool isSingleHost) const;
327
+
323
328
  private:
324
329
  /**
325
330
  * Constructs a new HostTarget.
@@ -17,6 +17,10 @@ InspectorFlags& InspectorFlags::getInstance() {
17
17
  return instance;
18
18
  }
19
19
 
20
+ bool InspectorFlags::getAssertSingleHostState() const {
21
+ return loadFlagsAndAssertUnchanged().assertSingleHostState;
22
+ }
23
+
20
24
  bool InspectorFlags::getFuseboxEnabled() const {
21
25
  if (fuseboxDisabledForTest_) {
22
26
  return false;
@@ -48,6 +52,8 @@ void InspectorFlags::dangerouslyDisableFuseboxForTest() {
48
52
  const InspectorFlags::Values& InspectorFlags::loadFlagsAndAssertUnchanged()
49
53
  const {
50
54
  InspectorFlags::Values newValues = {
55
+ .assertSingleHostState =
56
+ ReactNativeFeatureFlags::fuseboxAssertSingleHostState(),
51
57
  .fuseboxEnabled =
52
58
  #if defined(REACT_NATIVE_DEBUGGER_ENABLED)
53
59
  true,
@@ -19,6 +19,12 @@ class InspectorFlags {
19
19
  public:
20
20
  static InspectorFlags &getInstance();
21
21
 
22
+ /**
23
+ * Flag determining if the inspector backend should strictly assert that only
24
+ * a single host is registered.
25
+ */
26
+ bool getAssertSingleHostState() const;
27
+
22
28
  /**
23
29
  * Flag determining if the modern CDP backend should be enabled.
24
30
  */
@@ -54,6 +60,7 @@ class InspectorFlags {
54
60
 
55
61
  private:
56
62
  struct Values {
63
+ bool assertSingleHostState;
57
64
  bool fuseboxEnabled;
58
65
  bool isProfilingBuild;
59
66
  bool networkInspectionEnabled;
@@ -7,6 +7,8 @@
7
7
 
8
8
  #include "InspectorInterfaces.h"
9
9
 
10
+ #include "InspectorFlags.h"
11
+
10
12
  #include <cassert>
11
13
  #include <list>
12
14
  #include <mutex>
@@ -35,6 +37,14 @@ namespace {
35
37
 
36
38
  class InspectorImpl : public IInspector {
37
39
  public:
40
+ InspectorImpl() {
41
+ systemStateListener_ = std::make_shared<SystemStateListener>(systemState_);
42
+ auto& inspectorFlags = InspectorFlags::getInstance();
43
+ if (inspectorFlags.getAssertSingleHostState()) {
44
+ registerPageStatusListener(systemStateListener_);
45
+ }
46
+ }
47
+
38
48
  int addPage(
39
49
  const std::string& description,
40
50
  const std::string& vm,
@@ -50,7 +60,21 @@ class InspectorImpl : public IInspector {
50
60
  void registerPageStatusListener(
51
61
  std::weak_ptr<IPageStatusListener> listener) override;
52
62
 
63
+ InspectorSystemState getSystemState() const override;
64
+
53
65
  private:
66
+ class SystemStateListener : public IPageStatusListener {
67
+ public:
68
+ explicit SystemStateListener(InspectorSystemState& state) : state_(state) {}
69
+
70
+ void onPageAdded(int /*pageId*/) override {
71
+ state_.registeredPagesCount++;
72
+ }
73
+
74
+ private:
75
+ InspectorSystemState& state_;
76
+ };
77
+
54
78
  class Page {
55
79
  public:
56
80
  Page(
@@ -74,6 +98,8 @@ class InspectorImpl : public IInspector {
74
98
  int nextPageId_{1};
75
99
  std::map<int, Page> pages_;
76
100
  std::list<std::weak_ptr<IPageStatusListener>> listeners_;
101
+ InspectorSystemState systemState_{0};
102
+ std::shared_ptr<SystemStateListener> systemStateListener_;
77
103
  };
78
104
 
79
105
  InspectorImpl::Page::Page(
@@ -116,6 +142,12 @@ int InspectorImpl::addPage(
116
142
  pageId,
117
143
  Page{pageId, description, vm, std::move(connectFunc), capabilities});
118
144
 
145
+ for (const auto& listenerWeak : listeners_) {
146
+ if (auto listener = listenerWeak.lock()) {
147
+ listener->onPageAdded(pageId);
148
+ }
149
+ }
150
+
119
151
  return pageId;
120
152
  }
121
153
 
@@ -175,6 +207,11 @@ void InspectorImpl::registerPageStatusListener(
175
207
  }
176
208
  listeners_.push_back(listener);
177
209
  }
210
+
211
+ InspectorSystemState InspectorImpl::getSystemState() const {
212
+ std::scoped_lock lock(mutex_);
213
+ return systemState_;
214
+ }
178
215
  } // namespace
179
216
 
180
217
  IInspector& getInspectorInstance() {
@@ -51,6 +51,11 @@ struct InspectorPageDescription {
51
51
  // Alias for backwards compatibility.
52
52
  using InspectorPage = InspectorPageDescription;
53
53
 
54
+ struct InspectorSystemState {
55
+ /** The total count of pages registered during the app lifetime. */
56
+ int registeredPagesCount;
57
+ };
58
+
54
59
  /// IRemoteConnection allows the VM to send debugger messages to the client.
55
60
  /// IRemoteConnection's methods are safe to call from any thread *if*
56
61
  /// InspectorPackagerConnection.cpp is in use.
@@ -78,7 +83,8 @@ class JSINSPECTOR_EXPORT ILocalConnection : public IDestructible {
78
83
  class JSINSPECTOR_EXPORT IPageStatusListener : public IDestructible {
79
84
  public:
80
85
  virtual ~IPageStatusListener() = 0;
81
- virtual void onPageRemoved(int pageId) = 0;
86
+ virtual void onPageAdded(int /*pageId*/) {}
87
+ virtual void onPageRemoved(int /*pageId*/) {}
82
88
  };
83
89
 
84
90
  /// IInspector tracks debuggable JavaScript targets (pages).
@@ -127,6 +133,11 @@ class JSINSPECTOR_EXPORT IInspector : public IDestructible {
127
133
  * when pages are removed.
128
134
  */
129
135
  virtual void registerPageStatusListener(std::weak_ptr<IPageStatusListener> listener) = 0;
136
+
137
+ /**
138
+ * Get the current \c InspectorSystemState object.
139
+ */
140
+ virtual InspectorSystemState getSystemState() const = 0;
130
141
  };
131
142
 
132
143
  class NotImplementedException : public std::exception {
@@ -53,7 +53,17 @@ TracingAgent::~TracingAgent() {
53
53
 
54
54
  bool TracingAgent::handleRequest(const cdp::PreparsedRequest& req) {
55
55
  if (req.method == "Tracing.start") {
56
- // @cdp Tracing.start support is experimental.
56
+ auto& inspector = getInspectorInstance();
57
+ if (inspector.getSystemState().registeredPagesCount > 1) {
58
+ frontendChannel_(
59
+ cdp::jsonError(
60
+ req.id,
61
+ cdp::ErrorCode::InternalError,
62
+ "The Tracing domain is unavailable when multiple React Native hosts are registered."));
63
+
64
+ return true;
65
+ }
66
+
57
67
  if (sessionState_.isDebuggerDomainEnabled) {
58
68
  frontendChannel_(
59
69
  cdp::jsonError(
@@ -48,6 +48,10 @@ Pod::Spec.new do |s|
48
48
  s.dependency "React-oscompat"
49
49
  s.dependency "React-timing"
50
50
 
51
+ if use_hermes()
52
+ s.dependency "hermes-engine"
53
+ end
54
+
51
55
  add_rn_third_party_dependencies(s)
52
56
  add_rncore_dependency(s)
53
57
  end
@@ -42,6 +42,7 @@ Pod::Spec.new do |s|
42
42
  add_dependency(s, "React-jsinspector", :framework_name => 'jsinspector_modern')
43
43
  add_dependency(s, "React-jsinspectorcdp", :framework_name => 'jsinspector_moderncdp')
44
44
  add_dependency(s, "React-jsinspectortracing", :framework_name => 'jsinspector_moderntracing')
45
+ add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
45
46
 
46
47
  add_rn_third_party_dependencies(s)
47
48
  add_rncore_dependency(s)
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<5d596cc470e66861d7c1b2ffbb15b268>>
7
+ * @generated SignedSource<<efd875dca79abd383d527b063063051f>>
8
8
  */
9
9
 
10
10
  /**
@@ -242,6 +242,10 @@ bool ReactNativeFeatureFlags::fixMappingOfEventPrioritiesBetweenFabricAndReact()
242
242
  return getAccessor().fixMappingOfEventPrioritiesBetweenFabricAndReact();
243
243
  }
244
244
 
245
+ bool ReactNativeFeatureFlags::fuseboxAssertSingleHostState() {
246
+ return getAccessor().fuseboxAssertSingleHostState();
247
+ }
248
+
245
249
  bool ReactNativeFeatureFlags::fuseboxEnabledRelease() {
246
250
  return getAccessor().fuseboxEnabledRelease();
247
251
  }
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<41492e85e1feeb20d2e3e60b6cc6cbe7>>
7
+ * @generated SignedSource<<95ab3eb7a8aab0a72095cc9ad7c583ce>>
8
8
  */
9
9
 
10
10
  /**
@@ -309,6 +309,11 @@ class ReactNativeFeatureFlags {
309
309
  */
310
310
  RN_EXPORT static bool fixMappingOfEventPrioritiesBetweenFabricAndReact();
311
311
 
312
+ /**
313
+ * Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`.
314
+ */
315
+ RN_EXPORT static bool fuseboxAssertSingleHostState();
316
+
312
317
  /**
313
318
  * Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in release builds. This flag is global and should not be changed across React Host lifetimes.
314
319
  */
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<cf152ea3a4e9635a71d2794a3139dadb>>
7
+ * @generated SignedSource<<0985314bcdfe904d33ea0685b4008087>>
8
8
  */
9
9
 
10
10
  /**
@@ -1001,6 +1001,24 @@ bool ReactNativeFeatureFlagsAccessor::fixMappingOfEventPrioritiesBetweenFabricAn
1001
1001
  return flagValue.value();
1002
1002
  }
1003
1003
 
1004
+ bool ReactNativeFeatureFlagsAccessor::fuseboxAssertSingleHostState() {
1005
+ auto flagValue = fuseboxAssertSingleHostState_.load();
1006
+
1007
+ if (!flagValue.has_value()) {
1008
+ // This block is not exclusive but it is not necessary.
1009
+ // If multiple threads try to initialize the feature flag, we would only
1010
+ // be accessing the provider multiple times but the end state of this
1011
+ // instance and the returned flag value would be the same.
1012
+
1013
+ markFlagAsAccessed(54, "fuseboxAssertSingleHostState");
1014
+
1015
+ flagValue = currentProvider_->fuseboxAssertSingleHostState();
1016
+ fuseboxAssertSingleHostState_ = flagValue;
1017
+ }
1018
+
1019
+ return flagValue.value();
1020
+ }
1021
+
1004
1022
  bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledRelease() {
1005
1023
  auto flagValue = fuseboxEnabledRelease_.load();
1006
1024
 
@@ -1010,7 +1028,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledRelease() {
1010
1028
  // be accessing the provider multiple times but the end state of this
1011
1029
  // instance and the returned flag value would be the same.
1012
1030
 
1013
- markFlagAsAccessed(54, "fuseboxEnabledRelease");
1031
+ markFlagAsAccessed(55, "fuseboxEnabledRelease");
1014
1032
 
1015
1033
  flagValue = currentProvider_->fuseboxEnabledRelease();
1016
1034
  fuseboxEnabledRelease_ = flagValue;
@@ -1028,7 +1046,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxNetworkInspectionEnabled() {
1028
1046
  // be accessing the provider multiple times but the end state of this
1029
1047
  // instance and the returned flag value would be the same.
1030
1048
 
1031
- markFlagAsAccessed(55, "fuseboxNetworkInspectionEnabled");
1049
+ markFlagAsAccessed(56, "fuseboxNetworkInspectionEnabled");
1032
1050
 
1033
1051
  flagValue = currentProvider_->fuseboxNetworkInspectionEnabled();
1034
1052
  fuseboxNetworkInspectionEnabled_ = flagValue;
@@ -1046,7 +1064,7 @@ bool ReactNativeFeatureFlagsAccessor::hideOffscreenVirtualViewsOnIOS() {
1046
1064
  // be accessing the provider multiple times but the end state of this
1047
1065
  // instance and the returned flag value would be the same.
1048
1066
 
1049
- markFlagAsAccessed(56, "hideOffscreenVirtualViewsOnIOS");
1067
+ markFlagAsAccessed(57, "hideOffscreenVirtualViewsOnIOS");
1050
1068
 
1051
1069
  flagValue = currentProvider_->hideOffscreenVirtualViewsOnIOS();
1052
1070
  hideOffscreenVirtualViewsOnIOS_ = flagValue;
@@ -1064,7 +1082,7 @@ bool ReactNativeFeatureFlagsAccessor::overrideBySynchronousMountPropsAtMountingA
1064
1082
  // be accessing the provider multiple times but the end state of this
1065
1083
  // instance and the returned flag value would be the same.
1066
1084
 
1067
- markFlagAsAccessed(57, "overrideBySynchronousMountPropsAtMountingAndroid");
1085
+ markFlagAsAccessed(58, "overrideBySynchronousMountPropsAtMountingAndroid");
1068
1086
 
1069
1087
  flagValue = currentProvider_->overrideBySynchronousMountPropsAtMountingAndroid();
1070
1088
  overrideBySynchronousMountPropsAtMountingAndroid_ = flagValue;
@@ -1082,7 +1100,7 @@ bool ReactNativeFeatureFlagsAccessor::perfIssuesEnabled() {
1082
1100
  // be accessing the provider multiple times but the end state of this
1083
1101
  // instance and the returned flag value would be the same.
1084
1102
 
1085
- markFlagAsAccessed(58, "perfIssuesEnabled");
1103
+ markFlagAsAccessed(59, "perfIssuesEnabled");
1086
1104
 
1087
1105
  flagValue = currentProvider_->perfIssuesEnabled();
1088
1106
  perfIssuesEnabled_ = flagValue;
@@ -1100,7 +1118,7 @@ bool ReactNativeFeatureFlagsAccessor::perfMonitorV2Enabled() {
1100
1118
  // be accessing the provider multiple times but the end state of this
1101
1119
  // instance and the returned flag value would be the same.
1102
1120
 
1103
- markFlagAsAccessed(59, "perfMonitorV2Enabled");
1121
+ markFlagAsAccessed(60, "perfMonitorV2Enabled");
1104
1122
 
1105
1123
  flagValue = currentProvider_->perfMonitorV2Enabled();
1106
1124
  perfMonitorV2Enabled_ = flagValue;
@@ -1118,7 +1136,7 @@ double ReactNativeFeatureFlagsAccessor::preparedTextCacheSize() {
1118
1136
  // be accessing the provider multiple times but the end state of this
1119
1137
  // instance and the returned flag value would be the same.
1120
1138
 
1121
- markFlagAsAccessed(60, "preparedTextCacheSize");
1139
+ markFlagAsAccessed(61, "preparedTextCacheSize");
1122
1140
 
1123
1141
  flagValue = currentProvider_->preparedTextCacheSize();
1124
1142
  preparedTextCacheSize_ = flagValue;
@@ -1136,7 +1154,7 @@ bool ReactNativeFeatureFlagsAccessor::preventShadowTreeCommitExhaustion() {
1136
1154
  // be accessing the provider multiple times but the end state of this
1137
1155
  // instance and the returned flag value would be the same.
1138
1156
 
1139
- markFlagAsAccessed(61, "preventShadowTreeCommitExhaustion");
1157
+ markFlagAsAccessed(62, "preventShadowTreeCommitExhaustion");
1140
1158
 
1141
1159
  flagValue = currentProvider_->preventShadowTreeCommitExhaustion();
1142
1160
  preventShadowTreeCommitExhaustion_ = flagValue;
@@ -1154,7 +1172,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldPressibilityUseW3CPointerEventsForHo
1154
1172
  // be accessing the provider multiple times but the end state of this
1155
1173
  // instance and the returned flag value would be the same.
1156
1174
 
1157
- markFlagAsAccessed(62, "shouldPressibilityUseW3CPointerEventsForHover");
1175
+ markFlagAsAccessed(63, "shouldPressibilityUseW3CPointerEventsForHover");
1158
1176
 
1159
1177
  flagValue = currentProvider_->shouldPressibilityUseW3CPointerEventsForHover();
1160
1178
  shouldPressibilityUseW3CPointerEventsForHover_ = flagValue;
@@ -1172,7 +1190,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldTriggerResponderTransferOnScrollAndr
1172
1190
  // be accessing the provider multiple times but the end state of this
1173
1191
  // instance and the returned flag value would be the same.
1174
1192
 
1175
- markFlagAsAccessed(63, "shouldTriggerResponderTransferOnScrollAndroid");
1193
+ markFlagAsAccessed(64, "shouldTriggerResponderTransferOnScrollAndroid");
1176
1194
 
1177
1195
  flagValue = currentProvider_->shouldTriggerResponderTransferOnScrollAndroid();
1178
1196
  shouldTriggerResponderTransferOnScrollAndroid_ = flagValue;
@@ -1190,7 +1208,7 @@ bool ReactNativeFeatureFlagsAccessor::skipActivityIdentityAssertionOnHostPause()
1190
1208
  // be accessing the provider multiple times but the end state of this
1191
1209
  // instance and the returned flag value would be the same.
1192
1210
 
1193
- markFlagAsAccessed(64, "skipActivityIdentityAssertionOnHostPause");
1211
+ markFlagAsAccessed(65, "skipActivityIdentityAssertionOnHostPause");
1194
1212
 
1195
1213
  flagValue = currentProvider_->skipActivityIdentityAssertionOnHostPause();
1196
1214
  skipActivityIdentityAssertionOnHostPause_ = flagValue;
@@ -1208,7 +1226,7 @@ bool ReactNativeFeatureFlagsAccessor::sweepActiveTouchOnChildNativeGesturesAndro
1208
1226
  // be accessing the provider multiple times but the end state of this
1209
1227
  // instance and the returned flag value would be the same.
1210
1228
 
1211
- markFlagAsAccessed(65, "sweepActiveTouchOnChildNativeGesturesAndroid");
1229
+ markFlagAsAccessed(66, "sweepActiveTouchOnChildNativeGesturesAndroid");
1212
1230
 
1213
1231
  flagValue = currentProvider_->sweepActiveTouchOnChildNativeGesturesAndroid();
1214
1232
  sweepActiveTouchOnChildNativeGesturesAndroid_ = flagValue;
@@ -1226,7 +1244,7 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid
1226
1244
  // be accessing the provider multiple times but the end state of this
1227
1245
  // instance and the returned flag value would be the same.
1228
1246
 
1229
- markFlagAsAccessed(66, "traceTurboModulePromiseRejectionsOnAndroid");
1247
+ markFlagAsAccessed(67, "traceTurboModulePromiseRejectionsOnAndroid");
1230
1248
 
1231
1249
  flagValue = currentProvider_->traceTurboModulePromiseRejectionsOnAndroid();
1232
1250
  traceTurboModulePromiseRejectionsOnAndroid_ = flagValue;
@@ -1244,7 +1262,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommit(
1244
1262
  // be accessing the provider multiple times but the end state of this
1245
1263
  // instance and the returned flag value would be the same.
1246
1264
 
1247
- markFlagAsAccessed(67, "updateRuntimeShadowNodeReferencesOnCommit");
1265
+ markFlagAsAccessed(68, "updateRuntimeShadowNodeReferencesOnCommit");
1248
1266
 
1249
1267
  flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommit();
1250
1268
  updateRuntimeShadowNodeReferencesOnCommit_ = flagValue;
@@ -1262,7 +1280,7 @@ bool ReactNativeFeatureFlagsAccessor::useAlwaysAvailableJSErrorHandling() {
1262
1280
  // be accessing the provider multiple times but the end state of this
1263
1281
  // instance and the returned flag value would be the same.
1264
1282
 
1265
- markFlagAsAccessed(68, "useAlwaysAvailableJSErrorHandling");
1283
+ markFlagAsAccessed(69, "useAlwaysAvailableJSErrorHandling");
1266
1284
 
1267
1285
  flagValue = currentProvider_->useAlwaysAvailableJSErrorHandling();
1268
1286
  useAlwaysAvailableJSErrorHandling_ = flagValue;
@@ -1280,7 +1298,7 @@ bool ReactNativeFeatureFlagsAccessor::useFabricInterop() {
1280
1298
  // be accessing the provider multiple times but the end state of this
1281
1299
  // instance and the returned flag value would be the same.
1282
1300
 
1283
- markFlagAsAccessed(69, "useFabricInterop");
1301
+ markFlagAsAccessed(70, "useFabricInterop");
1284
1302
 
1285
1303
  flagValue = currentProvider_->useFabricInterop();
1286
1304
  useFabricInterop_ = flagValue;
@@ -1298,7 +1316,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeEqualsInNativeReadableArrayAndroi
1298
1316
  // be accessing the provider multiple times but the end state of this
1299
1317
  // instance and the returned flag value would be the same.
1300
1318
 
1301
- markFlagAsAccessed(70, "useNativeEqualsInNativeReadableArrayAndroid");
1319
+ markFlagAsAccessed(71, "useNativeEqualsInNativeReadableArrayAndroid");
1302
1320
 
1303
1321
  flagValue = currentProvider_->useNativeEqualsInNativeReadableArrayAndroid();
1304
1322
  useNativeEqualsInNativeReadableArrayAndroid_ = flagValue;
@@ -1316,7 +1334,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeTransformHelperAndroid() {
1316
1334
  // be accessing the provider multiple times but the end state of this
1317
1335
  // instance and the returned flag value would be the same.
1318
1336
 
1319
- markFlagAsAccessed(71, "useNativeTransformHelperAndroid");
1337
+ markFlagAsAccessed(72, "useNativeTransformHelperAndroid");
1320
1338
 
1321
1339
  flagValue = currentProvider_->useNativeTransformHelperAndroid();
1322
1340
  useNativeTransformHelperAndroid_ = flagValue;
@@ -1334,7 +1352,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeViewConfigsInBridgelessMode() {
1334
1352
  // be accessing the provider multiple times but the end state of this
1335
1353
  // instance and the returned flag value would be the same.
1336
1354
 
1337
- markFlagAsAccessed(72, "useNativeViewConfigsInBridgelessMode");
1355
+ markFlagAsAccessed(73, "useNativeViewConfigsInBridgelessMode");
1338
1356
 
1339
1357
  flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode();
1340
1358
  useNativeViewConfigsInBridgelessMode_ = flagValue;
@@ -1352,7 +1370,7 @@ bool ReactNativeFeatureFlagsAccessor::useOptimizedEventBatchingOnAndroid() {
1352
1370
  // be accessing the provider multiple times but the end state of this
1353
1371
  // instance and the returned flag value would be the same.
1354
1372
 
1355
- markFlagAsAccessed(73, "useOptimizedEventBatchingOnAndroid");
1373
+ markFlagAsAccessed(74, "useOptimizedEventBatchingOnAndroid");
1356
1374
 
1357
1375
  flagValue = currentProvider_->useOptimizedEventBatchingOnAndroid();
1358
1376
  useOptimizedEventBatchingOnAndroid_ = flagValue;
@@ -1370,7 +1388,7 @@ bool ReactNativeFeatureFlagsAccessor::useRawPropsJsiValue() {
1370
1388
  // be accessing the provider multiple times but the end state of this
1371
1389
  // instance and the returned flag value would be the same.
1372
1390
 
1373
- markFlagAsAccessed(74, "useRawPropsJsiValue");
1391
+ markFlagAsAccessed(75, "useRawPropsJsiValue");
1374
1392
 
1375
1393
  flagValue = currentProvider_->useRawPropsJsiValue();
1376
1394
  useRawPropsJsiValue_ = flagValue;
@@ -1388,7 +1406,7 @@ bool ReactNativeFeatureFlagsAccessor::useShadowNodeStateOnClone() {
1388
1406
  // be accessing the provider multiple times but the end state of this
1389
1407
  // instance and the returned flag value would be the same.
1390
1408
 
1391
- markFlagAsAccessed(75, "useShadowNodeStateOnClone");
1409
+ markFlagAsAccessed(76, "useShadowNodeStateOnClone");
1392
1410
 
1393
1411
  flagValue = currentProvider_->useShadowNodeStateOnClone();
1394
1412
  useShadowNodeStateOnClone_ = flagValue;
@@ -1406,7 +1424,7 @@ bool ReactNativeFeatureFlagsAccessor::useSharedAnimatedBackend() {
1406
1424
  // be accessing the provider multiple times but the end state of this
1407
1425
  // instance and the returned flag value would be the same.
1408
1426
 
1409
- markFlagAsAccessed(76, "useSharedAnimatedBackend");
1427
+ markFlagAsAccessed(77, "useSharedAnimatedBackend");
1410
1428
 
1411
1429
  flagValue = currentProvider_->useSharedAnimatedBackend();
1412
1430
  useSharedAnimatedBackend_ = flagValue;
@@ -1424,7 +1442,7 @@ bool ReactNativeFeatureFlagsAccessor::useTraitHiddenOnAndroid() {
1424
1442
  // be accessing the provider multiple times but the end state of this
1425
1443
  // instance and the returned flag value would be the same.
1426
1444
 
1427
- markFlagAsAccessed(77, "useTraitHiddenOnAndroid");
1445
+ markFlagAsAccessed(78, "useTraitHiddenOnAndroid");
1428
1446
 
1429
1447
  flagValue = currentProvider_->useTraitHiddenOnAndroid();
1430
1448
  useTraitHiddenOnAndroid_ = flagValue;
@@ -1442,7 +1460,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() {
1442
1460
  // be accessing the provider multiple times but the end state of this
1443
1461
  // instance and the returned flag value would be the same.
1444
1462
 
1445
- markFlagAsAccessed(78, "useTurboModuleInterop");
1463
+ markFlagAsAccessed(79, "useTurboModuleInterop");
1446
1464
 
1447
1465
  flagValue = currentProvider_->useTurboModuleInterop();
1448
1466
  useTurboModuleInterop_ = flagValue;
@@ -1460,7 +1478,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModules() {
1460
1478
  // be accessing the provider multiple times but the end state of this
1461
1479
  // instance and the returned flag value would be the same.
1462
1480
 
1463
- markFlagAsAccessed(79, "useTurboModules");
1481
+ markFlagAsAccessed(80, "useTurboModules");
1464
1482
 
1465
1483
  flagValue = currentProvider_->useTurboModules();
1466
1484
  useTurboModules_ = flagValue;
@@ -1478,7 +1496,7 @@ double ReactNativeFeatureFlagsAccessor::viewCullingOutsetRatio() {
1478
1496
  // be accessing the provider multiple times but the end state of this
1479
1497
  // instance and the returned flag value would be the same.
1480
1498
 
1481
- markFlagAsAccessed(80, "viewCullingOutsetRatio");
1499
+ markFlagAsAccessed(81, "viewCullingOutsetRatio");
1482
1500
 
1483
1501
  flagValue = currentProvider_->viewCullingOutsetRatio();
1484
1502
  viewCullingOutsetRatio_ = flagValue;
@@ -1496,7 +1514,7 @@ double ReactNativeFeatureFlagsAccessor::virtualViewHysteresisRatio() {
1496
1514
  // be accessing the provider multiple times but the end state of this
1497
1515
  // instance and the returned flag value would be the same.
1498
1516
 
1499
- markFlagAsAccessed(81, "virtualViewHysteresisRatio");
1517
+ markFlagAsAccessed(82, "virtualViewHysteresisRatio");
1500
1518
 
1501
1519
  flagValue = currentProvider_->virtualViewHysteresisRatio();
1502
1520
  virtualViewHysteresisRatio_ = flagValue;
@@ -1514,7 +1532,7 @@ double ReactNativeFeatureFlagsAccessor::virtualViewPrerenderRatio() {
1514
1532
  // be accessing the provider multiple times but the end state of this
1515
1533
  // instance and the returned flag value would be the same.
1516
1534
 
1517
- markFlagAsAccessed(82, "virtualViewPrerenderRatio");
1535
+ markFlagAsAccessed(83, "virtualViewPrerenderRatio");
1518
1536
 
1519
1537
  flagValue = currentProvider_->virtualViewPrerenderRatio();
1520
1538
  virtualViewPrerenderRatio_ = flagValue;
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<e7e8d311c0d1cca4e28bee7ddcf5065c>>
7
+ * @generated SignedSource<<5864ef780bdc795d47c096b16bf248b5>>
8
8
  */
9
9
 
10
10
  /**
@@ -86,6 +86,7 @@ class ReactNativeFeatureFlagsAccessor {
86
86
  bool enableVirtualViewWindowFocusDetection();
87
87
  bool enableWebPerformanceAPIsByDefault();
88
88
  bool fixMappingOfEventPrioritiesBetweenFabricAndReact();
89
+ bool fuseboxAssertSingleHostState();
89
90
  bool fuseboxEnabledRelease();
90
91
  bool fuseboxNetworkInspectionEnabled();
91
92
  bool hideOffscreenVirtualViewsOnIOS();
@@ -126,7 +127,7 @@ class ReactNativeFeatureFlagsAccessor {
126
127
  std::unique_ptr<ReactNativeFeatureFlagsProvider> currentProvider_;
127
128
  bool wasOverridden_;
128
129
 
129
- std::array<std::atomic<const char*>, 83> accessedFeatureFlags_;
130
+ std::array<std::atomic<const char*>, 84> accessedFeatureFlags_;
130
131
 
131
132
  std::atomic<std::optional<bool>> commonTestFlag_;
132
133
  std::atomic<std::optional<bool>> cdpInteractionMetricsEnabled_;
@@ -182,6 +183,7 @@ class ReactNativeFeatureFlagsAccessor {
182
183
  std::atomic<std::optional<bool>> enableVirtualViewWindowFocusDetection_;
183
184
  std::atomic<std::optional<bool>> enableWebPerformanceAPIsByDefault_;
184
185
  std::atomic<std::optional<bool>> fixMappingOfEventPrioritiesBetweenFabricAndReact_;
186
+ std::atomic<std::optional<bool>> fuseboxAssertSingleHostState_;
185
187
  std::atomic<std::optional<bool>> fuseboxEnabledRelease_;
186
188
  std::atomic<std::optional<bool>> fuseboxNetworkInspectionEnabled_;
187
189
  std::atomic<std::optional<bool>> hideOffscreenVirtualViewsOnIOS_;
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<a0a1898f3a4c14179bd03d5dbe97adfa>>
7
+ * @generated SignedSource<<84f99a0fde50ce70a8da2762dbb1a7af>>
8
8
  */
9
9
 
10
10
  /**
@@ -243,6 +243,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider {
243
243
  return false;
244
244
  }
245
245
 
246
+ bool fuseboxAssertSingleHostState() override {
247
+ return true;
248
+ }
249
+
246
250
  bool fuseboxEnabledRelease() override {
247
251
  return false;
248
252
  }
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<fc8f8541827a039fa5bc4a113e75fdf6>>
7
+ * @generated SignedSource<<394e4281884f0d2519d680974d2ebfe5>>
8
8
  */
9
9
 
10
10
  /**
@@ -531,6 +531,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef
531
531
  return ReactNativeFeatureFlagsDefaults::fixMappingOfEventPrioritiesBetweenFabricAndReact();
532
532
  }
533
533
 
534
+ bool fuseboxAssertSingleHostState() override {
535
+ auto value = values_["fuseboxAssertSingleHostState"];
536
+ if (!value.isNull()) {
537
+ return value.getBool();
538
+ }
539
+
540
+ return ReactNativeFeatureFlagsDefaults::fuseboxAssertSingleHostState();
541
+ }
542
+
534
543
  bool fuseboxEnabledRelease() override {
535
544
  auto value = values_["fuseboxEnabledRelease"];
536
545
  if (!value.isNull()) {
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<5dcaab263795b1605da54dbbb617264f>>
7
+ * @generated SignedSource<<045cc4e4390d6ddf2ca252ff4c8f399d>>
8
8
  */
9
9
 
10
10
  /**
@@ -79,6 +79,7 @@ class ReactNativeFeatureFlagsProvider {
79
79
  virtual bool enableVirtualViewWindowFocusDetection() = 0;
80
80
  virtual bool enableWebPerformanceAPIsByDefault() = 0;
81
81
  virtual bool fixMappingOfEventPrioritiesBetweenFabricAndReact() = 0;
82
+ virtual bool fuseboxAssertSingleHostState() = 0;
82
83
  virtual bool fuseboxEnabledRelease() = 0;
83
84
  virtual bool fuseboxNetworkInspectionEnabled() = 0;
84
85
  virtual bool hideOffscreenVirtualViewsOnIOS() = 0;
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<6bd64914d0e2f0c727490a420496fbb0>>
7
+ * @generated SignedSource<<368a69d36f8c7aef0103deb940751012>>
8
8
  */
9
9
 
10
10
  /**
@@ -314,6 +314,11 @@ bool NativeReactNativeFeatureFlags::fixMappingOfEventPrioritiesBetweenFabricAndR
314
314
  return ReactNativeFeatureFlags::fixMappingOfEventPrioritiesBetweenFabricAndReact();
315
315
  }
316
316
 
317
+ bool NativeReactNativeFeatureFlags::fuseboxAssertSingleHostState(
318
+ jsi::Runtime& /*runtime*/) {
319
+ return ReactNativeFeatureFlags::fuseboxAssertSingleHostState();
320
+ }
321
+
317
322
  bool NativeReactNativeFeatureFlags::fuseboxEnabledRelease(
318
323
  jsi::Runtime& /*runtime*/) {
319
324
  return ReactNativeFeatureFlags::fuseboxEnabledRelease();
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<99624bd7682ad34476ac395e8acc43c7>>
7
+ * @generated SignedSource<<5b7229fbb99de21237fa8d69da46a057>>
8
8
  */
9
9
 
10
10
  /**
@@ -144,6 +144,8 @@ class NativeReactNativeFeatureFlags
144
144
 
145
145
  bool fixMappingOfEventPrioritiesBetweenFabricAndReact(jsi::Runtime& runtime);
146
146
 
147
+ bool fuseboxAssertSingleHostState(jsi::Runtime& runtime);
148
+
147
149
  bool fuseboxEnabledRelease(jsi::Runtime& runtime);
148
150
 
149
151
  bool fuseboxNetworkInspectionEnabled(jsi::Runtime& runtime);
@@ -47,7 +47,9 @@ Pod::Spec.new do |s|
47
47
 
48
48
  s.dependency "React-jsi", version
49
49
 
50
- depend_on_js_engine(s)
50
+ if use_hermes()
51
+ s.dependency "hermes-engine"
52
+ end
51
53
  add_rn_third_party_dependencies(s)
52
54
  add_rncore_dependency(s)
53
55
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native",
3
- "version": "0.83.0-rc.0",
3
+ "version": "0.83.0-rc.1",
4
4
  "description": "A framework for building native apps using React",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -129,6 +129,7 @@
129
129
  "scripts/xcode/ccache.conf",
130
130
  "scripts/xcode/with-environment.sh",
131
131
  "sdks/.hermesversion",
132
+ "sdks/.hermesv1version",
132
133
  "sdks/hermes-engine",
133
134
  "sdks/hermesc",
134
135
  "settings.gradle.kts",
@@ -159,13 +160,13 @@
159
160
  },
160
161
  "dependencies": {
161
162
  "@jest/create-cache-key-function": "^29.7.0",
162
- "@react-native/assets-registry": "0.83.0-rc.0",
163
- "@react-native/codegen": "0.83.0-rc.0",
164
- "@react-native/community-cli-plugin": "0.83.0-rc.0",
165
- "@react-native/gradle-plugin": "0.83.0-rc.0",
166
- "@react-native/js-polyfills": "0.83.0-rc.0",
167
- "@react-native/normalize-colors": "0.83.0-rc.0",
168
- "@react-native/virtualized-lists": "0.83.0-rc.0",
163
+ "@react-native/assets-registry": "0.83.0-rc.1",
164
+ "@react-native/codegen": "0.83.0-rc.1",
165
+ "@react-native/community-cli-plugin": "0.83.0-rc.1",
166
+ "@react-native/gradle-plugin": "0.83.0-rc.1",
167
+ "@react-native/js-polyfills": "0.83.0-rc.1",
168
+ "@react-native/normalize-colors": "0.83.0-rc.1",
169
+ "@react-native/virtualized-lists": "0.83.0-rc.1",
169
170
  "abort-controller": "^3.0.0",
170
171
  "anser": "^1.4.9",
171
172
  "ansi-regex": "^5.0.0",
@@ -271,9 +271,10 @@ class ReactNativeCoreUtils
271
271
  return if dsym_bundles.empty?
272
272
 
273
273
  # Define source path mappings - from absolute build paths to relative framework paths
274
+ # Expand the path relative to the installation root (project root, parent of ios/)
275
+ react_native_absolute_path = File.expand_path(@@react_native_path, Pod::Config.instance.installation_root)
274
276
  mappings = [
275
- # Make sure to make react_native_path absolute
276
- ["/Users/runner/work/react-native/react-native/packages/react-native", "#{File.expand_path(@@react_native_path)}"],
277
+ ["/Users/runner/work/react-native/react-native/packages/react-native", react_native_absolute_path],
277
278
  ]
278
279
 
279
280
  dsym_bundles.each do |dsym_path| begin
@@ -0,0 +1 @@
1
+ hermes-v250829098.0.3
@@ -1,2 +1,2 @@
1
1
  HERMES_VERSION_NAME=0.14.0
2
- HERMES_V1_VERSION_NAME=250829098.0.2
2
+ HERMES_V1_VERSION_NAME=250829098.0.3
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<6bc2fbc946e21d0b51dd9bc71ac041e7>>
7
+ * @generated SignedSource<<472646b95362ace71083c0a471aa8878>>
8
8
  * @flow strict
9
9
  * @noformat
10
10
  */
@@ -104,6 +104,7 @@ export type ReactNativeFeatureFlags = $ReadOnly<{
104
104
  enableVirtualViewWindowFocusDetection: Getter<boolean>,
105
105
  enableWebPerformanceAPIsByDefault: Getter<boolean>,
106
106
  fixMappingOfEventPrioritiesBetweenFabricAndReact: Getter<boolean>,
107
+ fuseboxAssertSingleHostState: Getter<boolean>,
107
108
  fuseboxEnabledRelease: Getter<boolean>,
108
109
  fuseboxNetworkInspectionEnabled: Getter<boolean>,
109
110
  hideOffscreenVirtualViewsOnIOS: Getter<boolean>,
@@ -430,6 +431,10 @@ export const enableWebPerformanceAPIsByDefault: Getter<boolean> = createNativeFl
430
431
  * Uses the default event priority instead of the discreet event priority by default when dispatching events from Fabric to React.
431
432
  */
432
433
  export const fixMappingOfEventPrioritiesBetweenFabricAndReact: Getter<boolean> = createNativeFlagGetter('fixMappingOfEventPrioritiesBetweenFabricAndReact', false);
434
+ /**
435
+ * Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`.
436
+ */
437
+ export const fuseboxAssertSingleHostState: Getter<boolean> = createNativeFlagGetter('fuseboxAssertSingleHostState', true);
433
438
  /**
434
439
  * Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in release builds. This flag is global and should not be changed across React Host lifetimes.
435
440
  */
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<0b1f3b307c28d6798d4c15029ad5bc58>>
7
+ * @generated SignedSource<<d51c41724cd4d10eb227f96847277e99>>
8
8
  * @flow strict
9
9
  * @noformat
10
10
  */
@@ -79,6 +79,7 @@ export interface Spec extends TurboModule {
79
79
  +enableVirtualViewWindowFocusDetection?: () => boolean;
80
80
  +enableWebPerformanceAPIsByDefault?: () => boolean;
81
81
  +fixMappingOfEventPrioritiesBetweenFabricAndReact?: () => boolean;
82
+ +fuseboxAssertSingleHostState?: () => boolean;
82
83
  +fuseboxEnabledRelease?: () => boolean;
83
84
  +fuseboxNetworkInspectionEnabled?: () => boolean;
84
85
  +hideOffscreenVirtualViewsOnIOS?: () => boolean;