expo-modules-core 56.0.4 → 56.0.6

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 (84) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/android/build.gradle +39 -40
  3. package/android/src/main/cpp/Exceptions.cpp +0 -3
  4. package/android/src/main/cpp/Exceptions.h +1 -4
  5. package/android/src/main/cpp/ExpoHeader.pch +0 -2
  6. package/android/src/main/cpp/ExpoModulesHostObject.cpp +1 -2
  7. package/android/src/main/cpp/ExpoModulesHostObject.h +1 -3
  8. package/android/src/main/cpp/JNIDeallocator.h +1 -1
  9. package/android/src/main/cpp/JNIFunctionBody.cpp +0 -1
  10. package/android/src/main/cpp/JNIFunctionBody.h +1 -2
  11. package/android/src/main/cpp/JNIInjector.cpp +1 -1
  12. package/android/src/main/cpp/JNIUtils.cpp +1 -1
  13. package/android/src/main/cpp/JNIUtils.h +1 -6
  14. package/android/src/main/cpp/JSIContext.cpp +1 -5
  15. package/android/src/main/cpp/JSIContext.h +1 -6
  16. package/android/src/main/cpp/JSITypeConverter.h +1 -5
  17. package/android/src/main/cpp/JSharedObject.h +1 -1
  18. package/android/src/main/cpp/JavaCallback.cpp +8 -13
  19. package/android/src/main/cpp/JavaCallback.h +1 -7
  20. package/android/src/main/cpp/JavaReferencesCache.cpp +1 -2
  21. package/android/src/main/cpp/JavaReferencesCache.h +1 -4
  22. package/android/src/main/cpp/JavaScriptArrayBuffer.h +1 -4
  23. package/android/src/main/cpp/JavaScriptFunction.h +1 -4
  24. package/android/src/main/cpp/JavaScriptModuleObject.h +1 -5
  25. package/android/src/main/cpp/JavaScriptObject.h +1 -5
  26. package/android/src/main/cpp/JavaScriptRuntime.cpp +0 -1
  27. package/android/src/main/cpp/JavaScriptRuntime.h +1 -2
  28. package/android/src/main/cpp/JavaScriptTypedArray.h +1 -4
  29. package/android/src/main/cpp/JavaScriptValue.h +1 -5
  30. package/android/src/main/cpp/JavaScriptWeakObject.h +1 -5
  31. package/android/src/main/cpp/MethodMetadata.cpp +1 -6
  32. package/android/src/main/cpp/MethodMetadata.h +1 -9
  33. package/android/src/main/cpp/NativeArrayBuffer.h +1 -4
  34. package/android/src/main/cpp/RuntimeHolder.h +1 -2
  35. package/android/src/main/cpp/ThreadSafeJNIGlobalRef.h +1 -1
  36. package/android/src/main/cpp/concepts/jni.h +4 -4
  37. package/android/src/main/cpp/concepts/jni_deref.h +1 -1
  38. package/android/src/main/cpp/concepts/jsi.h +1 -1
  39. package/android/src/main/cpp/decorators/JSClassesDecorator.h +1 -3
  40. package/android/src/main/cpp/decorators/JSConstantsDecorator.cpp +1 -4
  41. package/android/src/main/cpp/decorators/JSConstantsDecorator.h +1 -3
  42. package/android/src/main/cpp/decorators/JSDecorator.h +1 -2
  43. package/android/src/main/cpp/decorators/JSDecoratorsBridgingObject.h +1 -4
  44. package/android/src/main/cpp/decorators/JSFunctionsDecorator.cpp +1 -2
  45. package/android/src/main/cpp/decorators/JSFunctionsDecorator.h +1 -5
  46. package/android/src/main/cpp/decorators/JSObjectDecorator.h +1 -1
  47. package/android/src/main/cpp/decorators/JSPropertiesDecorator.cpp +1 -2
  48. package/android/src/main/cpp/decorators/JSPropertiesDecorator.h +1 -3
  49. package/android/src/main/cpp/fabric/AndroidExpoViewProps.h +1 -1
  50. package/android/src/main/cpp/fabric/AndroidExpoViewState.h +1 -3
  51. package/android/src/main/cpp/fabric/FabricComponentsRegistry.h +1 -1
  52. package/android/src/main/cpp/fabric/NativeStatePropsGetter.h +1 -2
  53. package/android/src/main/cpp/installers/MainRuntimeInstaller.h +1 -2
  54. package/android/src/main/cpp/installers/WorkletRuntimeInstaller.h +1 -2
  55. package/android/src/main/cpp/javaclasses/Collections.h +1 -1
  56. package/android/src/main/cpp/javaclasses/JSRunnable.h +1 -1
  57. package/android/src/main/cpp/types/AnyType.cpp +0 -1
  58. package/android/src/main/cpp/types/AnyType.h +1 -2
  59. package/android/src/main/cpp/types/ExpectedType.h +1 -1
  60. package/android/src/main/cpp/types/FrontendConverter.cpp +1 -1
  61. package/android/src/main/cpp/types/FrontendConverter.h +1 -3
  62. package/android/src/main/cpp/types/FrontendConverterProvider.h +1 -5
  63. package/android/src/main/cpp/types/JNIToJSIConverter.h +13 -16
  64. package/android/src/main/cpp/worklets/Serializable.h +2 -2
  65. package/android/src/main/cpp/worklets/Worklet.h +2 -5
  66. package/android/src/main/cpp/worklets/WorkletJSCallInvoker.h +2 -4
  67. package/android/src/main/cpp/worklets/WorkletNativeRuntime.h +2 -2
  68. package/android/src/main/java/expo/modules/kotlin/views/decorators/CSSProps.kt +1 -1
  69. package/ios/Core/AppContext.swift +26 -4
  70. package/ios/Core/Conversions.swift +20 -7
  71. package/ios/Core/DynamicTypes/AnyDynamicType.swift +20 -0
  72. package/ios/Core/DynamicTypes/DynamicArrayType.swift +12 -6
  73. package/ios/Core/DynamicTypes/DynamicDictionaryType.swift +12 -6
  74. package/ios/Core/DynamicTypes/DynamicRawType.swift +6 -2
  75. package/ios/Core/DynamicTypes/DynamicStringType.swift +5 -1
  76. package/ios/Core/Functions/SyncFunctionDefinition.swift +1 -1
  77. package/ios/Core/MainValueConverter.swift +8 -0
  78. package/ios/JS/EXReactSchedulerDispatch.h +28 -0
  79. package/ios/JS/EXReactSchedulerDispatch.mm +19 -0
  80. package/package.json +3 -3
  81. package/prebuilds/output/debug/xcframeworks/ExpoModulesCore.tar.gz +0 -0
  82. package/prebuilds/output/debug/xcframeworks/ExpoModulesWorklets.tar.gz +0 -0
  83. package/prebuilds/output/release/xcframeworks/ExpoModulesCore.tar.gz +0 -0
  84. package/prebuilds/output/release/xcframeworks/ExpoModulesWorklets.tar.gz +0 -0
@@ -2,8 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
6
- #include <jsi/jsi.h>
5
+ #include "ExpoHeader.pch"
7
6
 
8
7
  #include <ReactCommon/CallInvokerHolder.h>
9
8
  #include <ReactCommon/CallInvoker.h>
@@ -2,7 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
5
+ #include "ExpoHeader.pch"
6
6
  #include <android/log.h>
7
7
 
8
8
  namespace jni = facebook::jni;
@@ -2,8 +2,8 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include <concepts>
6
- #include <fbjni/fbjni.h>
7
7
  #include "jni_deref.h"
8
8
 
9
9
  namespace jni = facebook::jni;
@@ -13,9 +13,6 @@ namespace expo {
13
13
  template<typename T>
14
14
  concept HasCthis = requires(T &t) { t->cthis(); };
15
15
 
16
- template<typename T>
17
- concept HasToStdString = requires(T &t) { t->toStdString(); };
18
-
19
16
  template<typename T>
20
17
  concept HasValue = requires(T &t) { t->value(); };
21
18
 
@@ -25,6 +22,9 @@ concept HasGetRegion = requires(T &t, jsize s) { t->getRegion(s, s); };
25
22
  template<typename T>
26
23
  concept IsJBoolean = std::is_same_v<jni_deref_t<T>, jni::JBoolean>;
27
24
 
25
+ template<typename T>
26
+ concept IsJString = std::is_same_v<jni_deref_t<T>, jni::JString>;
27
+
28
28
  template<typename T>
29
29
  concept JniRef =
30
30
  std::is_same_v<T, jni::local_ref<jni_deref_t<T>>> ||
@@ -2,8 +2,8 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include <concepts>
6
- #include <fbjni/fbjni.h>
7
7
 
8
8
  namespace jni = facebook::jni;
9
9
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include <concepts>
6
- #include <jsi/jsi.h>
7
7
 
8
8
  namespace jsi = facebook::jsi;
9
9
 
@@ -2,9 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
6
-
7
- #include <map>
5
+ #include "../ExpoHeader.pch"
8
6
 
9
7
  #include "JSDecorator.h"
10
8
  #include "../MethodMetadata.h"
@@ -1,15 +1,12 @@
1
1
  // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "JSConstantsDecorator.h"
4
5
  #include "../JavaScriptObject.h"
5
6
  #include "JSIUtils.h"
6
- #include "JSFunctionsDecorator.h"
7
7
  #include "../JSIContext.h"
8
8
  #include "../types/JNIToJSIConverter.h"
9
9
 
10
- #include <jsi/jsi.h>
11
- #include <jsi/JSIDynamic.h>
12
-
13
10
  namespace jsi = facebook::jsi;
14
11
 
15
12
  namespace expo {
@@ -2,9 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
6
- #include <react/jni/ReadableNativeMap.h>
7
- #include <folly/dynamic.h>
5
+ #include "../ExpoHeader.pch"
8
6
 
9
7
  #include "JSDecorator.h"
10
8
  #include "../JNIFunctionBody.h"
@@ -2,8 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
6
- #include <jsi/jsi.h>
5
+ #include "../ExpoHeader.pch"
7
6
 
8
7
  namespace jni = facebook::jni;
9
8
  namespace jsi = facebook::jsi;
@@ -2,12 +2,9 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
6
-
7
- #include <vector>
5
+ #include "../ExpoHeader.pch"
8
6
 
9
7
  #include "JSDecorator.h"
10
- #include "../MethodMetadata.h"
11
8
  #include "../JNIFunctionBody.h"
12
9
  #include "../types/ExpectedType.h"
13
10
 
@@ -1,10 +1,9 @@
1
1
  // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "JSFunctionsDecorator.h"
4
5
  #include "JSIUtils.h"
5
6
 
6
- #include <jsi/jsi.h>
7
-
8
7
  namespace jsi = facebook::jsi;
9
8
 
10
9
  namespace expo {
@@ -2,11 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
6
- #include <jsi/jsi.h>
7
-
8
- #include <unordered_map>
9
- #include <memory>
5
+ #include "../ExpoHeader.pch"
10
6
 
11
7
  #include "JSDecorator.h"
12
8
  #include "../MethodMetadata.h"
@@ -2,7 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
5
+ #include "../ExpoHeader.pch"
6
6
 
7
7
  #include "JSDecorator.h"
8
8
 
@@ -1,12 +1,11 @@
1
1
  // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "JSPropertiesDecorator.h"
4
5
  #include "../JavaScriptObject.h"
5
6
  #include "JSIUtils.h"
6
7
  #include "JSFunctionsDecorator.h"
7
8
 
8
- #include <jsi/jsi.h>
9
-
10
9
  namespace jsi = facebook::jsi;
11
10
 
12
11
  namespace expo {
@@ -1,8 +1,6 @@
1
1
  // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
2
 
3
- #include <fbjni/fbjni.h>
4
-
5
- #include <unordered_map>
3
+ #include "../ExpoHeader.pch"
6
4
 
7
5
  #include "../MethodMetadata.h"
8
6
  #include "../JNIFunctionBody.h"
@@ -1,8 +1,8 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "ExpoViewProps.h"
4
5
 
5
- #include <fbjni/fbjni.h>
6
6
  #include <react/renderer/core/RawValue.h>
7
7
 
8
8
  namespace react = facebook::react;
@@ -1,8 +1,6 @@
1
+ #include "../ExpoHeader.pch"
1
2
  #include "ExpoViewState.h"
2
3
 
3
- #include "AndroidExpoViewProps.h"
4
- #include <fbjni/fbjni.h>
5
- #include <folly/dynamic.h>
6
4
  #include <react/renderer/mapbuffer/MapBuffer.h>
7
5
  #include <react/renderer/mapbuffer/MapBufferBuilder.h>
8
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
5
+ #include "../ExpoHeader.pch"
6
6
  #include <CoreComponentsRegistry.h>
7
7
  #include <react/renderer/componentregistry/ComponentDescriptorProvider.h>
8
8
 
@@ -1,7 +1,6 @@
1
1
  #pragma once
2
2
 
3
- #include <fbjni/fbjni.h>
4
- #include <react/fabric/CoreComponentsRegistry.h>
3
+ #include "../ExpoHeader.pch"
5
4
  #include <react/fabric/StateWrapperImpl.h>
6
5
 
7
6
  namespace jni = facebook::jni;
@@ -1,10 +1,9 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "../JSIContext.h"
4
- #include <fbjni/fbjni.h>
5
5
  #include <ReactCommon/CallInvokerHolder.h>
6
6
  #include <ReactCommon/CallInvoker.h>
7
- #include "SharedObject.h"
8
7
 
9
8
  #if IS_NEW_ARCHITECTURE_ENABLED
10
9
 
@@ -1,9 +1,8 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "MainRuntimeInstaller.h"
4
5
 
5
- #include <fbjni/fbjni.h>
6
-
7
6
  namespace jni = facebook::jni;
8
7
 
9
8
  namespace expo {
@@ -1,6 +1,6 @@
1
1
  #pragma once
2
2
 
3
- #include <fbjni/fbjni.h>
3
+ #include "../ExpoHeader.pch"
4
4
 
5
5
  namespace jni = facebook::jni;
6
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
- #include <fbjni/fbjni.h>
5
+ #include "../ExpoHeader.pch"
6
6
 
7
7
  namespace jni = facebook::jni;
8
8
 
@@ -2,7 +2,6 @@
2
2
 
3
3
  #include "AnyType.h"
4
4
  #include "FrontendConverterProvider.h"
5
- #include "../JSIContext.h"
6
5
 
7
6
  namespace expo {
8
7
  AnyType::AnyType(
@@ -2,11 +2,10 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include "ExpectedType.h"
6
7
  #include "FrontendConverter.h"
7
8
 
8
- #include <fbjni/fbjni.h>
9
-
10
9
  namespace jni = facebook::jni;
11
10
 
12
11
  namespace expo {
@@ -2,8 +2,8 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include "CppType.h"
6
- #include <fbjni/fbjni.h>
7
7
 
8
8
  namespace jni = facebook::jni;
9
9
 
@@ -1,5 +1,6 @@
1
1
  // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
2
 
3
+ #include "../ExpoHeader.pch"
3
4
  #include "FrontendConverter.h"
4
5
  #include "ExpectedType.h"
5
6
  #include "FrontendConverterProvider.h"
@@ -17,7 +18,6 @@
17
18
 
18
19
  #include "react/jni/ReadableNativeMap.h"
19
20
  #include "react/jni/ReadableNativeArray.h"
20
- #include <jsi/JSIDynamic.h>
21
21
 
22
22
  #include <utility>
23
23
  #include <algorithm>
@@ -2,11 +2,9 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include "CppType.h"
6
7
 
7
- #include <jsi/jsi.h>
8
- #include <fbjni/fbjni.h>
9
-
10
8
  #if WORKLETS_ENABLED
11
9
 
12
10
  #include <worklets/SharedItems/Synchronizable.h>
@@ -2,15 +2,11 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include "CppType.h"
6
7
  #include "FrontendConverter.h"
7
8
  #include "ExpectedType.h"
8
9
 
9
- #include <fbjni/fbjni.h>
10
-
11
- #include <memory>
12
- #include <unordered_map>
13
-
14
10
  namespace jni = facebook::jni;
15
11
 
16
12
  namespace expo {
@@ -2,11 +2,11 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include "../ExpoHeader.pch"
5
6
  #include "../JSIContext.h"
6
7
  #include "../JSharedObject.h"
7
8
  #include "../JNIUtils.h"
8
9
  #include "ObjectDeallocator.h"
9
- #include "../javaclasses/Collections.h"
10
10
  #include "../JavaScriptArrayBuffer.h"
11
11
  #include "../NativeArrayBuffer.h"
12
12
  #include "../concepts/jni_deref.h"
@@ -14,17 +14,8 @@
14
14
  #include "../concepts/jsi.h"
15
15
  #include "ReturnType.h"
16
16
 
17
- #include <fbjni/fbjni.h>
18
- #include <jsi/jsi.h>
19
- #include <optional>
20
17
  #include <concepts>
21
18
 
22
- #include <react/jni/ReadableNativeMap.h>
23
- #include <react/jni/ReadableNativeArray.h>
24
- #include <react/jni/WritableNativeArray.h>
25
- #include <react/jni/WritableNativeMap.h>
26
- #include <jsi/JSIDynamic.h>
27
-
28
19
  namespace jni = facebook::jni;
29
20
  namespace jsi = facebook::jsi;
30
21
  namespace react = facebook::react;
@@ -63,11 +54,17 @@ struct RawArray {
63
54
  };
64
55
 
65
56
  template<typename T>
66
- inline auto unwrapJNIRef(T &&value) {
57
+ inline auto unwrapJNIRef(
58
+ JNIEnv *env,
59
+ T &&value
60
+ ) {
67
61
  if constexpr (HasCthis<T>) {
68
62
  return value->cthis();
69
- } else if constexpr (HasToStdString<T>) {
70
- return value->toStdString();
63
+ } else if constexpr (IsJString<T>) {
64
+ const char *rawValue = env->GetStringUTFChars(value.get(), nullptr);
65
+ std::string result = rawValue;
66
+ env->ReleaseStringUTFChars(value.get(), rawValue);
67
+ return result;
71
68
  } else if constexpr (IsJBoolean<T>) {
72
69
  return static_cast<bool>(value->value());
73
70
  } else if constexpr (HasValue<T>) {
@@ -287,13 +284,13 @@ concept SimpleConversion = requires(JNIEnv *env, jsi::Runtime &rt, T value) {
287
284
 
288
285
  template<typename T>
289
286
  jsi::Value convertToJS(JNIEnv *env, jsi::Runtime &rt, T &&value) {
290
- using UnwrappedType = decltype(unwrapJNIRef(std::declval<T>()));
287
+ using UnwrappedType = decltype(unwrapJNIRef(env, std::declval<T>()));
291
288
  using Converter = JNIToJSIConverter<UnwrappedType>;
292
289
 
293
290
  if constexpr (SimpleConversion<Converter, UnwrappedType>) {
294
- return Converter::convert(env, rt, unwrapJNIRef(std::forward<T>(value)));
291
+ return Converter::convert(env, rt, unwrapJNIRef(env, std::forward<T>(value)));
295
292
  } else {
296
- return Converter::convert(env, rt, unwrapJNIRef(value), value);
293
+ return Converter::convert(env, rt, unwrapJNIRef(env, value), value);
297
294
  }
298
295
  }
299
296
 
@@ -1,12 +1,12 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
4
+
3
5
  #if WORKLETS_ENABLED
4
6
 
5
7
  #include "../JSIContext.h"
6
8
  #include "../JNIDeallocator.h"
7
- #include "WorkletNativeRuntime.h"
8
9
 
9
- #include <fbjni/fbjni.h>
10
10
  #include <worklets/SharedItems/Serializable.h>
11
11
 
12
12
  namespace jni = facebook::jni;
@@ -1,15 +1,12 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
4
+
3
5
  #if WORKLETS_ENABLED
4
6
 
5
- #include "../JSIContext.h"
6
- #include "../JNIDeallocator.h"
7
7
  #include "WorkletNativeRuntime.h"
8
8
  #include "Serializable.h"
9
9
 
10
- #include <fbjni/fbjni.h>
11
- #include <worklets/SharedItems/Serializable.h>
12
-
13
10
  namespace jni = facebook::jni;
14
11
 
15
12
  namespace expo {
@@ -1,15 +1,13 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
4
+
3
5
  #if WORKLETS_ENABLED
4
6
 
5
7
  #include <ReactCommon/CallInvoker.h>
6
- #include <ReactCommon/RuntimeExecutor.h>
7
8
 
8
9
  #include <worklets/WorkletRuntime/WorkletRuntime.h>
9
10
 
10
- #include <memory>
11
-
12
-
13
11
  namespace jsi = facebook::jsi;
14
12
  namespace react = facebook::react;
15
13
 
@@ -1,13 +1,13 @@
1
1
  #pragma once
2
2
 
3
+ #include "../ExpoHeader.pch"
4
+
3
5
  #if WORKLETS_ENABLED
4
6
 
5
7
  #include <worklets/WorkletRuntime/WorkletRuntime.h>
6
8
 
7
9
  #endif
8
10
 
9
- #include <fbjni/fbjni.h>
10
-
11
11
  namespace jni = facebook::jni;
12
12
 
13
13
  namespace expo {
@@ -64,7 +64,7 @@ private fun <T : View> ViewDefinitionBuilder<T>.UseBorderWidthProps() {
64
64
  BackgroundStyleApplicator.setBorderWidth(
65
65
  view,
66
66
  edge,
67
- width ?: Float.NaN
67
+ width
68
68
  )
69
69
  }
70
70
  }
@@ -429,12 +429,34 @@ public final class AppContext: NSObject, EXAppContextProtocol, @unchecked Sendab
429
429
  // MARK: - Runtime
430
430
 
431
431
  /**
432
- Sets the JavaScript runtime from a raw pointer to a `facebook::jsi::Runtime` instance.
433
- Called from ObjC++ (e.g. `ExpoReactNativeFactory`) when React Native initializes the runtime.
432
+ Sets the JavaScript runtime from raw pointers. Called by `ExpoReactNativeFactory`
433
+ when React Native initializes the runtime. When `scheduler` and `dispatch`
434
+ are both provided, `JavaScriptRuntime.schedule(...)` / `.execute(...)` dispatch
435
+ onto the JS thread through them. When either is `nil`, the runtime falls back
436
+ to a synchronous no-op scheduler — callers can detect this via
437
+ `JavaScriptRuntime.supportsAsyncScheduling`.
438
+
439
+ `dispatch` is a raw pointer to a C function with signature
440
+ `void (*)(void *scheduler, int priority, void (^callback)())` — cast back
441
+ to the typed pointer inside `ExpoModulesJSI`. It's typed as `UnsafeRawPointer`
442
+ here rather than `@convention(c)` so the symbol can cross the Objective-C
443
+ bridge without needing a Swift-typed entry point.
434
444
  */
435
445
  @objc
436
- public func setRuntime(_ runtimePointer: UnsafeMutableRawPointer) {
437
- _runtime = ExpoRuntime(unsafePointer: runtimePointer)
446
+ public func setRuntime(
447
+ _ runtimePointer: UnsafeMutableRawPointer,
448
+ scheduler: UnsafeMutableRawPointer?,
449
+ dispatch: UnsafeRawPointer?
450
+ ) {
451
+ if let scheduler, let dispatch {
452
+ _runtime = ExpoRuntime(
453
+ unsafePointer: runtimePointer,
454
+ scheduler: scheduler,
455
+ dispatch: dispatch
456
+ )
457
+ } else {
458
+ _runtime = ExpoRuntime(unsafePointer: runtimePointer)
459
+ }
438
460
  }
439
461
 
440
462
  @JavaScriptActor
@@ -138,13 +138,20 @@ public struct Conversions {
138
138
  `unknownToJavaScriptValue` which handles type-erased values through `NSNumber`/`NSDictionary` matching.
139
139
  */
140
140
  static func anyToJavaScriptValue<ValueType>(_ value: ValueType, appContext: AppContext) throws -> JavaScriptValue {
141
+ return try anyToJavaScriptValue(value, appContext: appContext, in: appContext.runtime)
142
+ }
143
+
144
+ /**
145
+ Variant that creates JS values in the given `runtime`, used by the worklet conversion.
146
+ */
147
+ static func anyToJavaScriptValue<ValueType>(_ value: ValueType, appContext: AppContext, in runtime: JavaScriptRuntime) throws -> JavaScriptValue {
141
148
  if ValueType.self is AnyOptional.Type, Optional.isNil(value) {
142
149
  return .null
143
150
  }
144
151
  if let value = value as? AnyArgument {
145
- return try type(of: value).getDynamicType().castToJS(value, appContext: appContext)
152
+ return try type(of: value).getDynamicType().castToJS(value, appContext: appContext, in: runtime)
146
153
  }
147
- return try unknownToJavaScriptValue(value, appContext: appContext)
154
+ return try unknownToJavaScriptValue(value, appContext: appContext, in: runtime)
148
155
  }
149
156
 
150
157
  /**
@@ -153,12 +160,18 @@ public struct Conversions {
153
160
  can call this without re-entering the `AnyArgument` check and causing infinite recursion.
154
161
  */
155
162
  static func unknownToJavaScriptValue(_ value: Any, appContext: AppContext) throws -> JavaScriptValue {
163
+ return try unknownToJavaScriptValue(value, appContext: appContext, in: appContext.runtime)
164
+ }
165
+
166
+ /**
167
+ Variant that creates JS values in the given `runtime` — used by the worklet conversion
168
+ path so produced dicts/arrays live in the calling runtime, not the main runtime.
169
+ */
170
+ static func unknownToJavaScriptValue(_ value: Any, appContext: AppContext, in runtime: JavaScriptRuntime) throws -> JavaScriptValue {
156
171
  if let value = value as? JavaScriptRepresentable {
157
- return .representing(value: value, in: try appContext.runtime)
172
+ return .representing(value: value, in: runtime)
158
173
  }
159
174
 
160
- let runtime = try appContext.runtime
161
-
162
175
  switch value {
163
176
  case is Void:
164
177
  return .undefined
@@ -179,14 +192,14 @@ public struct Conversions {
179
192
  case let array as NSArray:
180
193
  let jsArray = runtime.createArray(length: array.count)
181
194
  for (index, element) in array.enumerated() {
182
- try jsArray.set(value: anyToJavaScriptValue(element, appContext: appContext), at: index)
195
+ try jsArray.set(value: anyToJavaScriptValue(element, appContext: appContext, in: runtime), at: index)
183
196
  }
184
197
  return jsArray.asValue()
185
198
  case let dict as NSDictionary:
186
199
  let jsObject = runtime.createObject()
187
200
  for (key, element) in dict {
188
201
  guard let key = key as? String else { continue }
189
- jsObject.setProperty(key, value: try anyToJavaScriptValue(element, appContext: appContext))
202
+ jsObject.setProperty(key, value: try anyToJavaScriptValue(element, appContext: appContext, in: runtime))
190
203
  }
191
204
  return jsObject.asValue()
192
205
  default: