expo-modules-core 1.11.13 → 1.12.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.
- package/CHANGELOG.md +77 -13
- package/ExpoModulesCore.podspec +7 -4
- package/android/ExpoModulesCorePlugin.gradle +40 -28
- package/android/build.gradle +12 -93
- package/android/proguard-rules.pro +0 -8
- package/android/src/main/cpp/Exceptions.cpp +1 -1
- package/android/src/main/cpp/Exceptions.h +1 -1
- package/android/src/main/cpp/ExpoModulesHostObject.cpp +7 -6
- package/android/src/main/cpp/ExpoModulesHostObject.h +3 -3
- package/android/src/main/cpp/JNIInjector.cpp +4 -2
- package/android/src/main/cpp/JSIContext.cpp +354 -0
- package/android/src/main/cpp/{JSIInteropModuleRegistry.h → JSIContext.h} +90 -9
- package/android/src/main/cpp/JavaCallback.cpp +210 -24
- package/android/src/main/cpp/JavaCallback.h +42 -7
- package/android/src/main/cpp/JavaScriptFunction.cpp +20 -6
- package/android/src/main/cpp/JavaScriptFunction.h +4 -1
- package/android/src/main/cpp/JavaScriptModuleObject.cpp +118 -82
- package/android/src/main/cpp/JavaScriptModuleObject.h +21 -18
- package/android/src/main/cpp/JavaScriptObject.cpp +7 -8
- package/android/src/main/cpp/JavaScriptObject.h +4 -2
- package/android/src/main/cpp/JavaScriptRuntime.cpp +18 -41
- package/android/src/main/cpp/JavaScriptRuntime.h +2 -8
- package/android/src/main/cpp/JavaScriptTypedArray.cpp +3 -3
- package/android/src/main/cpp/JavaScriptTypedArray.h +1 -1
- package/android/src/main/cpp/JavaScriptValue.cpp +7 -7
- package/android/src/main/cpp/JavaScriptValue.h +1 -1
- package/android/src/main/cpp/JavaScriptWeakObject.cpp +4 -4
- package/android/src/main/cpp/JavaScriptWeakObject.h +1 -1
- package/android/src/main/cpp/MethodMetadata.cpp +44 -120
- package/android/src/main/cpp/MethodMetadata.h +5 -11
- package/android/src/main/cpp/WeakRuntimeHolder.cpp +3 -3
- package/android/src/main/cpp/WeakRuntimeHolder.h +2 -2
- package/android/src/main/cpp/types/AnyType.cpp +1 -1
- package/android/src/main/cpp/types/AnyType.h +1 -1
- package/android/src/main/cpp/types/FrontendConverter.cpp +32 -43
- package/android/src/main/cpp/types/FrontendConverter.h +1 -23
- package/android/src/main/cpp/types/JNIToJSIConverter.cpp +5 -10
- package/android/src/main/cpp/types/JNIToJSIConverter.h +6 -2
- package/android/src/main/java/expo/modules/adapters/react/ModuleRegistryAdapter.java +3 -0
- package/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +14 -100
- package/android/src/main/java/expo/modules/adapters/react/ReactAdapterPackage.java +3 -5
- package/android/src/main/java/expo/modules/adapters/react/ReactModuleRegistryProvider.java +6 -22
- package/android/src/main/java/expo/modules/adapters/react/apploader/RNHeadlessAppLoader.kt +8 -4
- package/android/src/main/java/expo/modules/adapters/react/services/EventEmitterModule.java +0 -1
- package/android/src/main/java/expo/modules/adapters/react/services/UIManagerModuleWrapper.java +23 -8
- package/android/src/main/java/expo/modules/core/BasePackage.java +0 -10
- package/android/src/main/java/expo/modules/core/ModulePriorities.kt +1 -0
- package/android/src/main/java/expo/modules/core/ModuleRegistry.java +2 -32
- package/android/src/main/java/expo/modules/core/ModuleRegistryProvider.java +0 -18
- package/android/src/main/java/expo/modules/core/Promise.java +2 -0
- package/android/src/main/java/expo/modules/core/interfaces/Package.java +0 -17
- package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +0 -9
- package/android/src/main/java/expo/modules/core/interfaces/ReactNativeHostHandler.java +24 -31
- package/android/src/main/java/expo/modules/core/logging/LogHandler.kt +1 -7
- package/android/src/main/java/expo/modules/core/logging/LogHandlers.kt +11 -0
- package/android/src/main/java/expo/modules/core/logging/Logger.kt +18 -29
- package/android/src/main/java/expo/modules/core/logging/LoggerTimer.kt +11 -0
- package/android/src/main/java/expo/modules/core/logging/OSLogHandler.kt +2 -4
- package/android/src/main/java/expo/modules/core/logging/PersistentFileLogHandler.kt +1 -3
- package/android/src/main/java/expo/modules/interfaces/constants/ConstantsInterface.java +0 -2
- package/android/src/main/java/expo/modules/interfaces/permissions/PermissionsStatus.java +1 -1
- package/android/src/main/java/expo/modules/kotlin/AppContext.kt +44 -24
- package/android/src/main/java/expo/modules/kotlin/ArrayExtenstions.kt +15 -0
- package/android/src/main/java/expo/modules/kotlin/CoreLogger.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/DynamicExtenstions.kt +0 -3
- package/android/src/main/java/expo/modules/kotlin/ExpoBridgeModule.kt +41 -0
- package/android/src/main/java/expo/modules/kotlin/ExpoModulesHelper.kt +1 -2
- package/android/src/main/java/expo/modules/kotlin/KPromiseWrapper.kt +1 -2
- package/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt +1 -33
- package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +7 -6
- package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +12 -12
- package/android/src/main/java/expo/modules/kotlin/Promise.kt +10 -0
- package/android/src/main/java/expo/modules/kotlin/ReactExtensions.kt +14 -0
- package/android/src/main/java/expo/modules/kotlin/Utils.kt +4 -1
- package/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAwareHelper.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultCaller.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultRegistry.kt +6 -6
- package/android/src/main/java/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +44 -15
- package/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt +31 -1
- package/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt +2 -4
- package/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt +11 -4
- package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +2 -3
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt +136 -43
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionComponent.kt +71 -2
- package/android/src/main/java/expo/modules/kotlin/functions/FunctionBuilder.kt +39 -12
- package/android/src/main/java/expo/modules/kotlin/jni/ExpectedType.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/jni/{JSIInteropModuleRegistry.kt → JSIContext.kt} +90 -14
- package/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt +51 -24
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt +3 -3
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +4 -1
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +1 -0
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +1 -0
- package/android/src/main/java/expo/modules/kotlin/jni/PromiseImpl.kt +20 -0
- package/android/src/main/java/expo/modules/kotlin/modules/Module.kt +0 -1
- package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +164 -65
- package/android/src/main/java/expo/modules/kotlin/objects/PropertyComponentBuilder.kt +3 -4
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/ClassRegistry.kt +21 -0
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObject.kt +34 -1
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +23 -8
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedRef.kt +7 -1
- package/android/src/main/java/expo/modules/kotlin/tracing/ExpoTrace.kt +4 -0
- package/android/src/main/java/expo/modules/kotlin/types/AnyType.kt +134 -2
- package/android/src/main/java/expo/modules/kotlin/types/EnforceType.kt +60 -0
- package/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt +0 -2
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +3 -27
- package/android/src/main/java/expo/modules/kotlin/types/UnitTypeConverter.kt +3 -7
- package/android/src/main/java/expo/modules/kotlin/types/io/PathTypeConverter.kt +3 -0
- package/android/src/main/java/expo/modules/kotlin/viewevent/ViewEvent.kt +2 -5
- package/android/src/main/java/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +137 -48
- package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinition.kt +2 -5
- package/build/EventEmitter.d.ts +2 -2
- package/build/EventEmitter.d.ts.map +1 -1
- package/build/EventEmitter.js +8 -8
- package/build/EventEmitter.js.map +1 -1
- package/build/NativeModule.d.ts +4 -0
- package/build/NativeModule.d.ts.map +1 -0
- package/build/NativeModule.js +4 -0
- package/build/NativeModule.js.map +1 -0
- package/build/NativeModulesProxy.native.d.ts.map +1 -1
- package/build/NativeModulesProxy.native.js +4 -0
- package/build/NativeModulesProxy.native.js.map +1 -1
- package/build/NativeModulesProxy.types.d.ts +2 -2
- package/build/NativeModulesProxy.types.d.ts.map +1 -1
- package/build/NativeModulesProxy.types.js.map +1 -1
- package/build/NativeViewManagerAdapter.native.d.ts.map +1 -1
- package/build/NativeViewManagerAdapter.native.js +20 -1
- package/build/NativeViewManagerAdapter.native.js.map +1 -1
- package/build/PermissionsHook.d.ts.map +1 -1
- package/build/PermissionsHook.js +2 -0
- package/build/PermissionsHook.js.map +1 -1
- package/build/Refs.d.ts +8 -0
- package/build/Refs.d.ts.map +1 -0
- package/build/Refs.js +10 -0
- package/build/Refs.js.map +1 -0
- package/build/SharedObject.d.ts +4 -0
- package/build/SharedObject.d.ts.map +1 -0
- package/build/SharedObject.js +4 -0
- package/build/SharedObject.js.map +1 -0
- package/build/createWebModule.d.ts +2 -0
- package/build/createWebModule.d.ts.map +1 -0
- package/build/createWebModule.js +6 -0
- package/build/createWebModule.js.map +1 -0
- package/build/createWebModule.web.d.ts +2 -0
- package/build/createWebModule.web.d.ts.map +1 -0
- package/build/createWebModule.web.js +6 -0
- package/build/createWebModule.web.js.map +1 -0
- package/build/ensureNativeModulesAreInstalled.d.ts +6 -0
- package/build/ensureNativeModulesAreInstalled.d.ts.map +1 -0
- package/build/ensureNativeModulesAreInstalled.js +26 -0
- package/build/ensureNativeModulesAreInstalled.js.map +1 -0
- package/build/hooks/useReleasingSharedObject.d.ts +7 -0
- package/build/hooks/useReleasingSharedObject.d.ts.map +1 -0
- package/build/hooks/useReleasingSharedObject.js +40 -0
- package/build/hooks/useReleasingSharedObject.js.map +1 -0
- package/build/index.d.ts +8 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +8 -0
- package/build/index.js.map +1 -1
- package/build/requireNativeModule.d.ts +0 -17
- package/build/requireNativeModule.d.ts.map +1 -1
- package/build/requireNativeModule.js +2 -23
- package/build/requireNativeModule.js.map +1 -1
- package/build/ts-declarations/EventEmitter.d.ts +50 -0
- package/build/ts-declarations/EventEmitter.d.ts.map +1 -0
- package/build/ts-declarations/EventEmitter.js +2 -0
- package/build/ts-declarations/EventEmitter.js.map +1 -0
- package/build/ts-declarations/NativeModule.d.ts +14 -0
- package/build/ts-declarations/NativeModule.d.ts.map +1 -0
- package/build/ts-declarations/NativeModule.js +2 -0
- package/build/ts-declarations/NativeModule.js.map +1 -0
- package/build/ts-declarations/SharedObject.d.ts +14 -0
- package/build/ts-declarations/SharedObject.d.ts.map +1 -0
- package/build/ts-declarations/SharedObject.js +2 -0
- package/build/ts-declarations/SharedObject.js.map +1 -0
- package/build/ts-declarations/global.d.ts +49 -0
- package/build/ts-declarations/global.d.ts.map +1 -0
- package/build/ts-declarations/global.js +2 -0
- package/build/ts-declarations/global.js.map +1 -0
- package/build/web/CoreModule.d.ts +17 -0
- package/build/web/CoreModule.d.ts.map +1 -0
- package/build/web/CoreModule.js +51 -0
- package/build/web/CoreModule.js.map +1 -0
- package/build/web/index.d.ts +1 -0
- package/build/web/index.d.ts.map +1 -0
- package/build/web/index.js +1 -0
- package/build/web/index.js.map +1 -0
- package/build/web/index.web.d.ts +2 -0
- package/build/web/index.web.d.ts.map +1 -0
- package/build/web/index.web.js +2 -0
- package/build/web/index.web.js.map +1 -0
- package/common/cpp/BridgelessJSCallInvoker.h +41 -0
- package/common/cpp/EventEmitter.cpp +299 -0
- package/common/cpp/EventEmitter.h +111 -0
- package/common/cpp/JSIUtils.cpp +116 -11
- package/common/cpp/JSIUtils.h +54 -7
- package/common/cpp/LazyObject.cpp +15 -3
- package/common/cpp/LazyObject.h +13 -0
- package/common/cpp/NativeModule.cpp +16 -0
- package/common/cpp/NativeModule.h +34 -0
- package/common/cpp/ObjectDeallocator.cpp +3 -5
- package/common/cpp/ObjectDeallocator.h +2 -3
- package/common/cpp/SharedObject.cpp +69 -0
- package/common/cpp/SharedObject.h +59 -0
- package/common/cpp/TestingSyncJSCallInvoker.h +44 -0
- package/ios/Api/Builders/ClassComponentBuilder.swift +34 -0
- package/ios/{Objects → Api/Builders}/ObjectDefinitionBuilder.swift +3 -3
- package/ios/Api/Builders/ViewDefinitionBuilder.swift +53 -0
- package/ios/Api/Factories/AsyncFunctionFactories.swift +173 -0
- package/ios/{Classes/ClassComponentFactories.swift → Api/Factories/ClassFactories.swift} +19 -19
- package/ios/{Functions/ConcurrentFunctionDefinition.swift → Api/Factories/ConcurrentFunctionFactories.swift} +0 -113
- package/ios/{Modules/ModuleDefinitionComponents.swift → Api/Factories/EventListenersFactories.swift} +0 -20
- package/ios/Api/Factories/ModuleFactories.swift +6 -0
- package/ios/{Objects/ObjectDefinitionComponents.swift → Api/Factories/ObjectFactories.swift} +5 -5
- package/ios/Api/Factories/PropertyFactories.swift +50 -0
- package/ios/Api/Factories/SyncFunctionFactories.swift +173 -0
- package/ios/{Views/ViewManagerDefinitionComponents.swift → Api/Factories/ViewFactories.swift} +7 -6
- package/ios/AppDelegates/EXAppDelegateWrapper.h +0 -21
- package/ios/AppDelegates/EXAppDelegateWrapper.mm +37 -29
- package/ios/{AppContext.swift → Core/AppContext.swift} +34 -11
- package/ios/Core/Classes/AnyClassDefinitionElement.swift +37 -0
- package/ios/{Classes/ClassComponent.swift → Core/Classes/ClassDefinition.swift} +10 -10
- package/ios/{Conversions.swift → Core/Conversions.swift} +1 -1
- package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicSharedObjectType.swift +3 -3
- package/ios/Core/Events/EventObservingDefinition.swift +79 -0
- package/ios/Core/Events/LegacyEventEmitterCompat.swift +32 -0
- package/ios/Core/ExpoBridgeModule.h +18 -0
- package/ios/Core/ExpoBridgeModule.mm +88 -0
- package/ios/Core/ExpoRuntime.swift +6 -0
- package/ios/{Functions/AnyFunction.swift → Core/Functions/AnyFunctionDefinition.swift} +9 -2
- package/ios/Core/Functions/AsyncFunctionDefinition.swift +150 -0
- package/ios/Core/Functions/ConcurrentFunctionDefinition.swift +112 -0
- package/ios/Core/Functions/SyncFunctionDefinition.swift +108 -0
- package/ios/{JavaScriptUtils.swift → Core/JavaScriptUtils.swift} +4 -4
- package/ios/{Logging → Core/Logging}/LogHandlers.swift +12 -5
- package/ios/{Logging → Core/Logging}/Logger.swift +14 -92
- package/ios/Core/Logging/LoggerTimer.swift +22 -0
- package/ios/{ModuleHolder.swift → Core/ModuleHolder.swift} +2 -10
- package/ios/Core/Modules/CoreModule.swift +43 -0
- package/ios/{Modules → Core/Modules}/ModuleDefinition.swift +20 -12
- package/ios/{Modules → Core/Modules}/ModuleDefinitionBuilder.swift +1 -3
- package/ios/{Objects → Core/Objects}/ObjectDefinition.swift +9 -9
- package/ios/{Objects/PropertyComponent.swift → Core/Objects/PropertyDefinition.swift} +11 -64
- package/ios/Core/Protocols/AnyDefinition.swift +4 -0
- package/ios/Core/Protocols/AnyExpoView.swift +7 -0
- package/ios/Core/Protocols/AnyModule.swift +17 -0
- package/ios/Core/Protocols/AnyViewDefinition.swift +34 -0
- package/ios/Core/SharedObjects/SharedObject.swift +80 -0
- package/ios/{SharedObjects → Core/SharedObjects}/SharedObjectRegistry.swift +45 -19
- package/ios/{Views → Core/Views}/AnyViewProp.swift +1 -1
- package/ios/{Views → Core/Views}/ComponentData.swift +7 -7
- package/ios/{Views → Core/Views}/ExpoView.swift +1 -1
- package/ios/Core/Views/ViewDefinition.swift +97 -0
- package/ios/{Views → Core/Views}/ViewLifecycleMethod.swift +1 -1
- package/ios/{Views → Core/Views}/ViewModuleWrapper.swift +1 -1
- package/ios/Fabric/ExpoFabricView.swift +5 -6
- package/ios/FileSystemUtilities/FileSystemLegacyUtilities.swift +111 -0
- package/ios/JSI/EXJSIInstaller.h +28 -0
- package/ios/JSI/EXJSIInstaller.mm +54 -10
- package/ios/JSI/EXJSIUtils.h +15 -11
- package/ios/JSI/EXJSIUtils.mm +21 -49
- package/ios/JSI/EXJavaScriptObject.mm +2 -2
- package/ios/JSI/EXJavaScriptRuntime.h +15 -0
- package/ios/JSI/EXJavaScriptRuntime.mm +53 -26
- package/ios/JSI/EXSharedObjectUtils.h +15 -0
- package/ios/JSI/EXSharedObjectUtils.mm +18 -0
- package/ios/JSI/JavaScriptRuntime.swift +16 -0
- package/ios/Legacy/ModuleRegistry/EXModuleRegistry.m +1 -0
- package/ios/Legacy/ModuleRegistryProvider/EXModuleRegistryProvider.m +5 -0
- package/ios/Legacy/NativeModulesProxy/EXNativeModulesProxy.mm +5 -4
- package/ios/Legacy/Services/EXReactNativeAdapter.mm +34 -28
- package/ios/ReactDelegates/EXReactDelegateWrapper.h +4 -12
- package/ios/ReactDelegates/EXReactDelegateWrapper.mm +41 -0
- package/ios/ReactDelegates/EXReactRootViewFactory.h +38 -0
- package/ios/ReactDelegates/EXReactRootViewFactory.mm +54 -0
- package/ios/ReactDelegates/ExpoReactDelegate.swift +22 -15
- package/ios/ReactDelegates/ExpoReactDelegateHandler.swift +10 -21
- package/ios/ReactDelegates/RCTAppDelegate+Recreate.h +28 -0
- package/ios/ReactDelegates/RCTAppDelegate+Recreate.mm +47 -0
- package/ios/Tests/{ClassComponentSpec.swift → ClassDefinitionSpec.swift} +6 -6
- package/ios/Tests/ConvertiblesSpec.swift +6 -1
- package/ios/Tests/CoreModuleSpec.swift +0 -4
- package/ios/Tests/DynamicTypeSpec.swift +1 -1
- package/ios/Tests/EventEmitterSpec.swift +274 -0
- package/ios/Tests/ExceptionsSpec.swift +114 -54
- package/ios/Tests/ExpoModulesSpec.swift +4 -3
- package/ios/Tests/LoggerSpec.swift +80 -0
- package/ios/Tests/{PropertyComponentSpec.swift → PropertyDefinitionSpec.swift} +1 -1
- package/ios/Tests/SharedObjectRegistrySpec.swift +34 -28
- package/ios/Tests/SharedObjectSpec.swift +141 -0
- package/ios/Tests/ViewDefinitionSpec.swift +1 -1
- package/package.json +2 -2
- package/src/EventEmitter.ts +15 -18
- package/src/NativeModule.ts +6 -0
- package/src/NativeModulesProxy.native.ts +5 -0
- package/src/NativeModulesProxy.types.ts +2 -2
- package/src/NativeViewManagerAdapter.native.tsx +25 -1
- package/src/PermissionsHook.ts +4 -0
- package/src/Refs.ts +10 -0
- package/src/SharedObject.ts +6 -0
- package/src/createWebModule.ts +5 -0
- package/src/createWebModule.web.ts +6 -0
- package/src/ensureNativeModulesAreInstalled.ts +24 -0
- package/src/hooks/useReleasingSharedObject.ts +51 -0
- package/src/index.ts +13 -0
- package/src/requireNativeModule.ts +2 -51
- package/src/ts-declarations/EventEmitter.ts +65 -0
- package/src/ts-declarations/ExpoModules.d.ts +0 -5
- package/src/ts-declarations/NativeModule.ts +18 -0
- package/src/ts-declarations/SharedObject.ts +16 -0
- package/src/ts-declarations/global.ts +60 -0
- package/src/web/CoreModule.ts +83 -0
- package/src/web/index.ts +0 -0
- package/src/web/index.web.ts +1 -0
- package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +0 -196
- package/android/src/main/java/expo/modules/adapters/react/ArgumentsHelper.java +0 -48
- package/android/src/main/java/expo/modules/adapters/react/PromiseWrapper.java +0 -38
- package/android/src/main/java/expo/modules/adapters/react/services/CookieManagerModule.java +0 -53
- package/android/src/main/java/expo/modules/core/ArgumentsHelper.java +0 -44
- package/android/src/main/java/expo/modules/core/ExportedModule.java +0 -173
- package/android/src/main/java/expo/modules/core/ModuleRegistryDelegate.kt +0 -12
- package/android/src/main/java/expo/modules/core/ViewManager.java +0 -9
- package/android/src/main/java/expo/modules/core/interfaces/ExpoMethod.java +0 -12
- package/android/src/main/java/expo/modules/core/interfaces/ExpoProp.java +0 -10
- package/android/src/main/java/expo/modules/core/logging/LoggerOptions.kt +0 -29
- package/android-annotation/build.gradle +0 -48
- package/android-annotation/src/main/java/expo/modules/annotation/Config.kt +0 -7
- package/android-annotation/src/main/java/expo/modules/annotation/ConverterBinder.kt +0 -7
- package/android-annotation-processor/build.gradle +0 -54
- package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessor.kt +0 -175
- package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessorProvider.kt +0 -10
- package/android-annotation-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider +0 -1
- package/ios/Classes/ClassComponentElement.swift +0 -37
- package/ios/Classes/ClassComponentElementsBuilder.swift +0 -34
- package/ios/ExpoBridgeModule.m +0 -7
- package/ios/ExpoBridgeModule.swift +0 -108
- package/ios/ExpoRuntime.swift +0 -28
- package/ios/Functions/AsyncFunctionComponent.swift +0 -327
- package/ios/Functions/SyncFunctionComponent.swift +0 -282
- package/ios/Interfaces/Font/EXFontManagerInterface.h +0 -9
- package/ios/Interfaces/Font/EXFontProcessorInterface.h +0 -15
- package/ios/Interfaces/Font/EXFontScalerInterface.h +0 -9
- package/ios/Interfaces/Font/EXFontScalersManagerInterface.h +0 -9
- package/ios/Legacy/Services/EXReactFontManager.h +0 -6
- package/ios/Legacy/Services/EXReactFontManager.m +0 -130
- package/ios/Modules/AnyModule.swift +0 -53
- package/ios/Modules/CoreModule.swift +0 -17
- package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.h +0 -16
- package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.m +0 -49
- package/ios/ReactDelegates/EXReactCompatibleHelpers.h +0 -15
- package/ios/ReactDelegates/EXReactCompatibleHelpers.m +0 -25
- package/ios/ReactDelegates/EXReactDelegateWrapper.m +0 -53
- package/ios/SharedObjects/SharedObject.swift +0 -31
- package/ios/Views/ViewDefinition.swift +0 -114
- package/ios/Views/ViewFactory.swift +0 -16
- package/ios/Views/ViewManagerDefinition.swift +0 -77
- package/ios/Views/ViewManagerDefinitionBuilder.swift +0 -11
- /package/ios/{AppContextConfig.swift → Core/AppContextConfig.swift} +0 -0
- /package/ios/{Arguments → Core/Arguments}/AnyArgument.swift +0 -0
- /package/ios/{Arguments → Core/Arguments}/Convertible.swift +0 -0
- /package/ios/{Arguments → Core/Arguments}/Convertibles.swift +0 -0
- /package/ios/{Arguments → Core/Arguments}/Enumerable.swift +0 -0
- /package/ios/{Classes → Core/Classes}/ClassRegistry.swift +0 -0
- /package/ios/{Convertibles → Core/Convertibles}/Convertibles+Color.swift +0 -0
- /package/ios/{Convertibles → Core/Convertibles}/Either.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/AnyDynamicType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicArrayType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicConvertibleType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDataType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDictionaryType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicEnumType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicJavaScriptType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicOptionalType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicRawType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicTypedArrayType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicViewType.swift +0 -0
- /package/ios/{EventListener.swift → Core/EventListener.swift} +0 -0
- /package/ios/{Events → Core/Events}/Callback.swift +0 -0
- /package/ios/{Events → Core/Events}/EventDispatcher.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/ChainableException.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/CodedError.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/CommonExceptions.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/Exception.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/ExceptionOrigin.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/GenericException.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/UnexpectedException.swift +0 -0
- /package/ios/{JavaScriptFunction.swift → Core/JavaScriptFunction.swift} +0 -0
- /package/ios/{Logging → Core/Logging}/LogType.swift +0 -0
- /package/ios/{Logging → Core/Logging}/PersistentFileLog.swift +0 -0
- /package/ios/{ModuleRegistry.swift → Core/ModuleRegistry.swift} +0 -0
- /package/ios/{Modules → Core/Modules}/Module.swift +0 -0
- /package/ios/{ModulesProvider.swift → Core/ModulesProvider.swift} +0 -0
- /package/ios/{Objects → Core/Objects}/JavaScriptObjectBuilder.swift +0 -0
- /package/ios/{Promise.swift → Core/Promise.swift} +0 -0
- /package/ios/{Records → Core/Records}/AnyField.swift +0 -0
- /package/ios/{Records → Core/Records}/Field.swift +0 -0
- /package/ios/{Records → Core/Records}/FieldExtensions.swift +0 -0
- /package/ios/{Records → Core/Records}/FieldOption.swift +0 -0
- /package/ios/{Records → Core/Records}/Record.swift +0 -0
- /package/ios/{SharedObjects → Core/SharedObjects}/SharedRef.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/AnyTypedArray.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/ConcreteTypedArrays.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/GenericTypedArray.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/TypedArray.swift +0 -0
- /package/ios/{Views → Core/Views}/ConcreteViewProp.swift +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
// Copyright © 2021-present 650 Industries, Inc. (aka Expo)
|
|
2
|
+
|
|
3
|
+
#include "JSIContext.h"
|
|
4
|
+
#include "ExpoModulesHostObject.h"
|
|
5
|
+
#include "JavaReferencesCache.h"
|
|
6
|
+
#include "JSReferencesCache.h"
|
|
7
|
+
#include "SharedObject.h"
|
|
8
|
+
#include "NativeModule.h"
|
|
9
|
+
|
|
10
|
+
#include <fbjni/detail/Meta.h>
|
|
11
|
+
#include <fbjni/fbjni.h>
|
|
12
|
+
|
|
13
|
+
#include <memory>
|
|
14
|
+
|
|
15
|
+
#if IS_NEW_ARCHITECTURE_ENABLED
|
|
16
|
+
|
|
17
|
+
#include "BridgelessJSCallInvoker.h"
|
|
18
|
+
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
namespace jni = facebook::jni;
|
|
22
|
+
namespace jsi = facebook::jsi;
|
|
23
|
+
|
|
24
|
+
namespace expo {
|
|
25
|
+
|
|
26
|
+
#if IS_NEW_ARCHITECTURE_ENABLED
|
|
27
|
+
|
|
28
|
+
#include "BridgelessJSCallInvoker.h"
|
|
29
|
+
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
jni::local_ref<JSIContext::jhybriddata>
|
|
33
|
+
JSIContext::initHybrid(jni::alias_ref<jhybridobject> jThis) {
|
|
34
|
+
return makeCxxInstance(jThis);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void JSIContext::registerNatives() {
|
|
38
|
+
registerHybrid({
|
|
39
|
+
makeNativeMethod("initHybrid", JSIContext::initHybrid),
|
|
40
|
+
makeNativeMethod("installJSI", JSIContext::installJSI),
|
|
41
|
+
#if IS_NEW_ARCHITECTURE_ENABLED
|
|
42
|
+
makeNativeMethod("installJSIForBridgeless",
|
|
43
|
+
JSIContext::installJSIForBridgeless),
|
|
44
|
+
#endif
|
|
45
|
+
makeNativeMethod("installJSIForTests",
|
|
46
|
+
JSIContext::installJSIForTests),
|
|
47
|
+
makeNativeMethod("evaluateScript", JSIContext::evaluateScript),
|
|
48
|
+
makeNativeMethod("global", JSIContext::global),
|
|
49
|
+
makeNativeMethod("createObject", JSIContext::createObject),
|
|
50
|
+
makeNativeMethod("drainJSEventLoop", JSIContext::drainJSEventLoop),
|
|
51
|
+
makeNativeMethod("setNativeStateForSharedObject",
|
|
52
|
+
JSIContext::jniSetNativeStateForSharedObject),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
JSIContext::JSIContext(jni::alias_ref<jhybridobject> jThis)
|
|
57
|
+
: javaPart_(jni::make_global(jThis)) {}
|
|
58
|
+
|
|
59
|
+
JSIContext::~JSIContext() {
|
|
60
|
+
unbindJSIContext(runtimeHolder->get());
|
|
61
|
+
// The runtime would be deallocated automatically.
|
|
62
|
+
// However, we need to enforce the order of deallocations.
|
|
63
|
+
// The runtime has to be deallocated before the JNI part.
|
|
64
|
+
runtimeHolder.reset();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void JSIContext::installJSI(
|
|
68
|
+
jlong jsRuntimePointer,
|
|
69
|
+
jni::alias_ref<JNIDeallocator::javaobject> jniDeallocator,
|
|
70
|
+
jni::alias_ref<react::CallInvokerHolder::javaobject> jsInvokerHolder
|
|
71
|
+
) {
|
|
72
|
+
prepareJSIContext(
|
|
73
|
+
jsRuntimePointer,
|
|
74
|
+
jniDeallocator,
|
|
75
|
+
jsInvokerHolder->cthis()->getCallInvoker()
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
prepareRuntime();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#if IS_NEW_ARCHITECTURE_ENABLED
|
|
82
|
+
|
|
83
|
+
void JSIContext::installJSIForBridgeless(
|
|
84
|
+
jlong jsRuntimePointer,
|
|
85
|
+
jni::alias_ref<JNIDeallocator::javaobject> jniDeallocator,
|
|
86
|
+
jni::alias_ref<react::JRuntimeExecutor::javaobject> runtimeExecutor
|
|
87
|
+
) {
|
|
88
|
+
prepareJSIContext(
|
|
89
|
+
jsRuntimePointer,
|
|
90
|
+
jniDeallocator,
|
|
91
|
+
std::make_shared<BridgelessJSCallInvoker>(runtimeExecutor->cthis()->get())
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
prepareRuntime();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#endif
|
|
98
|
+
|
|
99
|
+
void JSIContext::installJSIForTests(
|
|
100
|
+
jni::alias_ref<JNIDeallocator::javaobject> jniDeallocator
|
|
101
|
+
) {
|
|
102
|
+
#if !UNIT_TEST
|
|
103
|
+
throw std::logic_error("The function is only available when UNIT_TEST is defined.");
|
|
104
|
+
#else
|
|
105
|
+
this->jniDeallocator = jni::make_global(jniDeallocator);
|
|
106
|
+
|
|
107
|
+
runtimeHolder = std::make_shared<JavaScriptRuntime>();
|
|
108
|
+
jsi::Runtime &jsiRuntime = runtimeHolder->get();
|
|
109
|
+
|
|
110
|
+
jsRegistry = std::make_unique<JSReferencesCache>(jsiRuntime);
|
|
111
|
+
|
|
112
|
+
prepareRuntime();
|
|
113
|
+
#endif // !UNIT_TEST
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
void JSIContext::prepareJSIContext(
|
|
117
|
+
jlong jsRuntimePointer,
|
|
118
|
+
jni::alias_ref<JNIDeallocator::javaobject> jniDeallocator,
|
|
119
|
+
std::shared_ptr<react::CallInvoker> callInvoker
|
|
120
|
+
) {
|
|
121
|
+
this->jniDeallocator = jni::make_global(jniDeallocator);
|
|
122
|
+
auto runtime = reinterpret_cast<jsi::Runtime *>(jsRuntimePointer);
|
|
123
|
+
jsRegistry = std::make_unique<JSReferencesCache>(*runtime);
|
|
124
|
+
|
|
125
|
+
runtimeHolder = std::make_shared<JavaScriptRuntime>(
|
|
126
|
+
runtime,
|
|
127
|
+
std::move(callInvoker)
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void JSIContext::prepareRuntime() {
|
|
132
|
+
jsi::Runtime &runtime = runtimeHolder->get();
|
|
133
|
+
|
|
134
|
+
bindJSIContext(runtime, this);
|
|
135
|
+
|
|
136
|
+
runtimeHolder->installMainObject();
|
|
137
|
+
|
|
138
|
+
EventEmitter::installClass(runtime);
|
|
139
|
+
|
|
140
|
+
SharedObject::installBaseClass(
|
|
141
|
+
runtime,
|
|
142
|
+
// We can't predict the order of deallocation of the JSIContext and the SharedObject.
|
|
143
|
+
// So we need to pass a new ref to retain the JSIContext to make sure it's not deallocated before the SharedObject.
|
|
144
|
+
[javaObject = javaPart_](const SharedObject::ObjectId objectId) {
|
|
145
|
+
jni::ThreadScope::WithClassLoader([objectId = objectId, javaObject = std::move(javaObject)] {
|
|
146
|
+
JSIContext::deleteSharedObject(javaObject, objectId);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
NativeModule::installClass(runtime);
|
|
152
|
+
|
|
153
|
+
auto expoModules = std::make_shared<ExpoModulesHostObject>(this);
|
|
154
|
+
auto expoModulesObject = jsi::Object::createFromHostObject(
|
|
155
|
+
runtime,
|
|
156
|
+
expoModules
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
// Define the `global.expo.modules` object.
|
|
160
|
+
runtimeHolder
|
|
161
|
+
->getMainObject()
|
|
162
|
+
->setProperty(
|
|
163
|
+
runtime,
|
|
164
|
+
"modules",
|
|
165
|
+
expoModulesObject
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
jni::local_ref<JavaScriptModuleObject::javaobject>
|
|
170
|
+
JSIContext::callGetJavaScriptModuleObjectMethod(const std::string &moduleName) const {
|
|
171
|
+
if (javaPart_ == nullptr) {
|
|
172
|
+
throw std::runtime_error("getJavaScriptModuleObject: JSIContext was prepared to be deallocated.");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
176
|
+
->getMethod<jni::local_ref<JavaScriptModuleObject::javaobject>(
|
|
177
|
+
std::string)>(
|
|
178
|
+
"getJavaScriptModuleObject"
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
return method(javaPart_, moduleName);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
jni::local_ref<JavaScriptModuleObject::javaobject>
|
|
185
|
+
JSIContext::callGetCoreModuleObject() const {
|
|
186
|
+
if (javaPart_ == nullptr) {
|
|
187
|
+
throw std::runtime_error("getCoreModule: JSIContext was prepared to be deallocated.");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
191
|
+
->getMethod<jni::local_ref<JavaScriptModuleObject::javaobject>()>(
|
|
192
|
+
"getCoreModuleObject"
|
|
193
|
+
);
|
|
194
|
+
return method(javaPart_);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
jni::local_ref<jni::JArrayClass<jni::JString>>
|
|
198
|
+
JSIContext::callGetJavaScriptModulesNames() const {
|
|
199
|
+
if (javaPart_ == nullptr) {
|
|
200
|
+
throw std::runtime_error("getJavaScriptModules: JSIContext was prepared to be deallocated.");
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
204
|
+
->getMethod<jni::local_ref<jni::JArrayClass<jni::JString>>()>(
|
|
205
|
+
"getJavaScriptModulesName"
|
|
206
|
+
);
|
|
207
|
+
return method(javaPart_);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
bool JSIContext::callHasModule(const std::string &moduleName) const {
|
|
211
|
+
if (javaPart_ == nullptr) {
|
|
212
|
+
throw std::runtime_error("hasModule: JSIContext was prepared to be deallocated.");
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
216
|
+
->getMethod<jboolean(std::string)>(
|
|
217
|
+
"hasModule"
|
|
218
|
+
);
|
|
219
|
+
return (bool) method(javaPart_, moduleName);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
jni::local_ref<JavaScriptModuleObject::javaobject>
|
|
223
|
+
JSIContext::getModule(const std::string &moduleName) const {
|
|
224
|
+
return callGetJavaScriptModuleObjectMethod(moduleName);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
jni::local_ref<JavaScriptModuleObject::javaobject> JSIContext::getCoreModule() const {
|
|
228
|
+
return callGetCoreModuleObject();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
bool JSIContext::hasModule(const std::string &moduleName) const {
|
|
232
|
+
return callHasModule(moduleName);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
jni::local_ref<jni::JArrayClass<jni::JString>> JSIContext::getModulesName() const {
|
|
236
|
+
return callGetJavaScriptModulesNames();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
jni::local_ref<JavaScriptValue::javaobject> JSIContext::evaluateScript(
|
|
240
|
+
jni::JString script
|
|
241
|
+
) {
|
|
242
|
+
return runtimeHolder->evaluateScript(script.toStdString());
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
jni::local_ref<JavaScriptObject::javaobject> JSIContext::global() {
|
|
246
|
+
return runtimeHolder->global();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
jni::local_ref<JavaScriptObject::javaobject> JSIContext::createObject() {
|
|
250
|
+
return runtimeHolder->createObject();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
void JSIContext::drainJSEventLoop() {
|
|
254
|
+
runtimeHolder->drainJSEventLoop();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
void JSIContext::registerSharedObject(
|
|
258
|
+
jni::local_ref<jobject> native,
|
|
259
|
+
jni::local_ref<JavaScriptObject::javaobject> js
|
|
260
|
+
) {
|
|
261
|
+
if (javaPart_ == nullptr) {
|
|
262
|
+
throw std::runtime_error("registerSharedObject: JSIContext was prepared to be deallocated.");
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
266
|
+
->getMethod<void(jni::local_ref<jobject>, jni::local_ref<JavaScriptObject::javaobject>)>(
|
|
267
|
+
"registerSharedObject"
|
|
268
|
+
);
|
|
269
|
+
method(javaPart_, std::move(native), std::move(js));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
void JSIContext::deleteSharedObject(
|
|
273
|
+
jni::global_ref<JSIContext::javaobject> javaObject,
|
|
274
|
+
int objectId
|
|
275
|
+
) {
|
|
276
|
+
if (javaObject == nullptr) {
|
|
277
|
+
throw std::runtime_error("deleteSharedObject: JSIContext is invalid.");
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
281
|
+
->getMethod<void(int)>(
|
|
282
|
+
"deleteSharedObject"
|
|
283
|
+
);
|
|
284
|
+
method(javaObject, objectId);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
void JSIContext::registerClass(
|
|
288
|
+
jni::local_ref<jclass> native,
|
|
289
|
+
jni::local_ref<JavaScriptObject::javaobject> jsClass
|
|
290
|
+
) {
|
|
291
|
+
if (javaPart_ == nullptr) {
|
|
292
|
+
throw std::runtime_error("registerClass: JSIContext was prepared to be deallocated.");
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
296
|
+
->getMethod<void(jni::local_ref<jclass>, jni::local_ref<JavaScriptObject::javaobject>)>(
|
|
297
|
+
"registerClass"
|
|
298
|
+
);
|
|
299
|
+
method(javaPart_, std::move(native), std::move(jsClass));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
jni::local_ref<JavaScriptObject::javaobject> JSIContext::getJavascriptClass(
|
|
303
|
+
jni::local_ref<jclass> native
|
|
304
|
+
) {
|
|
305
|
+
if (javaPart_ == nullptr) {
|
|
306
|
+
throw std::runtime_error("getJavascriptClass: JSIContext was prepared to be deallocated.");
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const static auto method = expo::JSIContext::javaClassLocal()
|
|
310
|
+
->getMethod<jni::local_ref<JavaScriptObject::javaobject>(jni::local_ref<jclass>)>(
|
|
311
|
+
"getJavascriptClass"
|
|
312
|
+
);
|
|
313
|
+
return method(javaPart_, std::move(native));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
void JSIContext::prepareForDeallocation() {
|
|
317
|
+
jsRegistry.reset();
|
|
318
|
+
runtimeHolder.reset();
|
|
319
|
+
jniDeallocator.reset();
|
|
320
|
+
javaPart_.reset();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
void JSIContext::jniSetNativeStateForSharedObject(
|
|
324
|
+
int id,
|
|
325
|
+
jni::alias_ref<JavaScriptObject::javaobject> jsObject
|
|
326
|
+
) {
|
|
327
|
+
auto nativeState = std::make_shared<expo::SharedObject::NativeState>(
|
|
328
|
+
id,
|
|
329
|
+
// We can't predict the order of deallocation of the JSIContext and the SharedObject.
|
|
330
|
+
// So we need to pass a new ref to retain the JSIContext to make sure it's not deallocated before the SharedObject.
|
|
331
|
+
[javaObject = javaPart_](const SharedObject::ObjectId objectId) {
|
|
332
|
+
jni::ThreadScope::WithClassLoader([objectId = objectId, javaObject = std::move(javaObject)] {
|
|
333
|
+
JSIContext::deleteSharedObject(javaObject, objectId);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
jsObject
|
|
339
|
+
->cthis()
|
|
340
|
+
->get()
|
|
341
|
+
->setNativeState(runtimeHolder->get(), std::move(nativeState));
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
thread_local std::unordered_map<uintptr_t, JSIContext *> jsiContexts;
|
|
345
|
+
|
|
346
|
+
void bindJSIContext(const jsi::Runtime &runtime, JSIContext *jsiContext) {
|
|
347
|
+
jsiContexts[reinterpret_cast<uintptr_t>(&runtime)] = jsiContext;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
void unbindJSIContext(const jsi::Runtime &runtime) {
|
|
351
|
+
jsiContexts.erase(reinterpret_cast<uintptr_t>(&runtime));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
} // namespace expo
|
|
@@ -14,8 +14,18 @@
|
|
|
14
14
|
#include <jsi/jsi.h>
|
|
15
15
|
#include <ReactCommon/CallInvokerHolder.h>
|
|
16
16
|
#include <ReactCommon/CallInvoker.h>
|
|
17
|
+
|
|
18
|
+
#if IS_NEW_ARCHITECTURE_ENABLED
|
|
19
|
+
|
|
20
|
+
#include <ReactCommon/RuntimeExecutor.h>
|
|
21
|
+
#include <react/jni/JRuntimeExecutor.h>
|
|
22
|
+
|
|
23
|
+
#endif
|
|
24
|
+
|
|
17
25
|
#if REACT_NATIVE_TARGET_VERSION >= 73
|
|
26
|
+
|
|
18
27
|
#include <ReactCommon/NativeMethodCallInvokerHolder.h>
|
|
28
|
+
|
|
19
29
|
#endif
|
|
20
30
|
|
|
21
31
|
#include <memory>
|
|
@@ -29,11 +39,10 @@ namespace expo {
|
|
|
29
39
|
/**
|
|
30
40
|
* A JNI wrapper to initialize CPP part of modules and access all data from the module registry.
|
|
31
41
|
*/
|
|
32
|
-
class
|
|
42
|
+
class JSIContext : public jni::HybridClass<JSIContext> {
|
|
33
43
|
public:
|
|
34
|
-
static auto constexpr
|
|
35
|
-
|
|
36
|
-
static auto constexpr TAG = "JSIInteropModuleRegistry";
|
|
44
|
+
static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JSIContext;";
|
|
45
|
+
static auto constexpr TAG = "JSIContext";
|
|
37
46
|
|
|
38
47
|
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
|
|
39
48
|
|
|
@@ -48,6 +57,19 @@ public:
|
|
|
48
57
|
jni::alias_ref<react::CallInvokerHolder::javaobject> jsInvokerHolder
|
|
49
58
|
);
|
|
50
59
|
|
|
60
|
+
#if IS_NEW_ARCHITECTURE_ENABLED
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Initializes the `ExpoModulesHostObject` and adds it to the global object.
|
|
64
|
+
*/
|
|
65
|
+
void installJSIForBridgeless(
|
|
66
|
+
jlong jsRuntimePointer,
|
|
67
|
+
jni::alias_ref<JNIDeallocator::javaobject> jniDeallocator,
|
|
68
|
+
jni::alias_ref<react::JRuntimeExecutor::javaobject> runtimeExecutor
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
#endif
|
|
72
|
+
|
|
51
73
|
/**
|
|
52
74
|
* Initializes the test runtime. Shouldn't be used in the production.
|
|
53
75
|
*/
|
|
@@ -100,22 +122,34 @@ public:
|
|
|
100
122
|
jni::local_ref<JavaScriptObject::javaobject> js
|
|
101
123
|
);
|
|
102
124
|
|
|
125
|
+
static void deleteSharedObject(
|
|
126
|
+
jni::global_ref<JSIContext::javaobject> javaObject,
|
|
127
|
+
int objectId
|
|
128
|
+
);
|
|
129
|
+
|
|
103
130
|
/**
|
|
104
131
|
* Exposes a `JavaScriptRuntime::drainJSEventLoop` function to Kotlin
|
|
105
132
|
*/
|
|
106
133
|
void drainJSEventLoop();
|
|
107
134
|
|
|
108
|
-
std::shared_ptr<react::CallInvoker> jsInvoker;
|
|
109
135
|
std::shared_ptr<JavaScriptRuntime> runtimeHolder;
|
|
110
136
|
std::unique_ptr<JSReferencesCache> jsRegistry;
|
|
111
137
|
jni::global_ref<JNIDeallocator::javaobject> jniDeallocator;
|
|
112
138
|
|
|
113
|
-
|
|
139
|
+
void registerClass(jni::local_ref<jclass> native,
|
|
140
|
+
jni::local_ref<JavaScriptObject::javaobject> jsClass);
|
|
141
|
+
|
|
142
|
+
jni::local_ref<JavaScriptObject::javaobject> getJavascriptClass(jni::local_ref<jclass> native);
|
|
143
|
+
|
|
144
|
+
~JSIContext();
|
|
145
|
+
|
|
146
|
+
void prepareForDeallocation();
|
|
147
|
+
|
|
114
148
|
private:
|
|
115
149
|
friend HybridBase;
|
|
116
|
-
jni::global_ref<
|
|
150
|
+
jni::global_ref<JSIContext::javaobject> javaPart_;
|
|
117
151
|
|
|
118
|
-
explicit
|
|
152
|
+
explicit JSIContext(jni::alias_ref<jhybridobject> jThis);
|
|
119
153
|
|
|
120
154
|
inline jni::local_ref<JavaScriptModuleObject::javaobject>
|
|
121
155
|
callGetJavaScriptModuleObjectMethod(const std::string &moduleName) const;
|
|
@@ -126,6 +160,53 @@ private:
|
|
|
126
160
|
|
|
127
161
|
inline bool callHasModule(const std::string &moduleName) const;
|
|
128
162
|
|
|
129
|
-
void
|
|
163
|
+
void prepareJSIContext(
|
|
164
|
+
jlong jsRuntimePointer,
|
|
165
|
+
jni::alias_ref<JNIDeallocator::javaobject> jniDeallocator,
|
|
166
|
+
std::shared_ptr<react::CallInvoker> callInvoker
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
void prepareRuntime();
|
|
170
|
+
|
|
171
|
+
void jniSetNativeStateForSharedObject(
|
|
172
|
+
int id,
|
|
173
|
+
jni::alias_ref<JavaScriptObject::javaobject> jsObject
|
|
174
|
+
);
|
|
130
175
|
};
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* We are binding the JSIContext to the runtime using a thread-local map.
|
|
179
|
+
* This is a simplification of how we're accessing the JSIContext from different places.
|
|
180
|
+
* We're using a thread-local map to prevent from accessing the wrong JSIContext from a different thread.
|
|
181
|
+
* It's much safer than passing around the JSIContext as a parameter.
|
|
182
|
+
*/
|
|
183
|
+
extern thread_local std::unordered_map<uintptr_t, JSIContext *> jsiContexts;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Binds the JSIContext to the runtime.
|
|
187
|
+
* @param runtime
|
|
188
|
+
* @param jsiContext
|
|
189
|
+
*/
|
|
190
|
+
void bindJSIContext(const jsi::Runtime &runtime, JSIContext *jsiContext);
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Unbinds the JSIContext from the runtime.
|
|
194
|
+
* @param runtime
|
|
195
|
+
*/
|
|
196
|
+
void unbindJSIContext(const jsi::Runtime &runtime);
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Gets the JSIContext for the given runtime.
|
|
200
|
+
* @param runtime
|
|
201
|
+
* @return JSIContext * - it should never be stored when received from this function.
|
|
202
|
+
* It might throw an exception if the JSIContext for the given runtime doesn't exist.
|
|
203
|
+
*/
|
|
204
|
+
inline JSIContext *getJSIContext(const jsi::Runtime &runtime) {
|
|
205
|
+
const auto iterator = jsiContexts.find(reinterpret_cast<uintptr_t>(&runtime));
|
|
206
|
+
if (iterator == jsiContexts.end()) {
|
|
207
|
+
throw std::invalid_argument("JSIContext for the given runtime doesn't exist");
|
|
208
|
+
}
|
|
209
|
+
return iterator->second;
|
|
210
|
+
}
|
|
211
|
+
|
|
131
212
|
} // namespace expo
|