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.
Files changed (408) hide show
  1. package/CHANGELOG.md +77 -13
  2. package/ExpoModulesCore.podspec +7 -4
  3. package/android/ExpoModulesCorePlugin.gradle +40 -28
  4. package/android/build.gradle +12 -93
  5. package/android/proguard-rules.pro +0 -8
  6. package/android/src/main/cpp/Exceptions.cpp +1 -1
  7. package/android/src/main/cpp/Exceptions.h +1 -1
  8. package/android/src/main/cpp/ExpoModulesHostObject.cpp +7 -6
  9. package/android/src/main/cpp/ExpoModulesHostObject.h +3 -3
  10. package/android/src/main/cpp/JNIInjector.cpp +4 -2
  11. package/android/src/main/cpp/JSIContext.cpp +354 -0
  12. package/android/src/main/cpp/{JSIInteropModuleRegistry.h → JSIContext.h} +90 -9
  13. package/android/src/main/cpp/JavaCallback.cpp +210 -24
  14. package/android/src/main/cpp/JavaCallback.h +42 -7
  15. package/android/src/main/cpp/JavaScriptFunction.cpp +20 -6
  16. package/android/src/main/cpp/JavaScriptFunction.h +4 -1
  17. package/android/src/main/cpp/JavaScriptModuleObject.cpp +118 -82
  18. package/android/src/main/cpp/JavaScriptModuleObject.h +21 -18
  19. package/android/src/main/cpp/JavaScriptObject.cpp +7 -8
  20. package/android/src/main/cpp/JavaScriptObject.h +4 -2
  21. package/android/src/main/cpp/JavaScriptRuntime.cpp +18 -41
  22. package/android/src/main/cpp/JavaScriptRuntime.h +2 -8
  23. package/android/src/main/cpp/JavaScriptTypedArray.cpp +3 -3
  24. package/android/src/main/cpp/JavaScriptTypedArray.h +1 -1
  25. package/android/src/main/cpp/JavaScriptValue.cpp +7 -7
  26. package/android/src/main/cpp/JavaScriptValue.h +1 -1
  27. package/android/src/main/cpp/JavaScriptWeakObject.cpp +4 -4
  28. package/android/src/main/cpp/JavaScriptWeakObject.h +1 -1
  29. package/android/src/main/cpp/MethodMetadata.cpp +44 -120
  30. package/android/src/main/cpp/MethodMetadata.h +5 -11
  31. package/android/src/main/cpp/WeakRuntimeHolder.cpp +3 -3
  32. package/android/src/main/cpp/WeakRuntimeHolder.h +2 -2
  33. package/android/src/main/cpp/types/AnyType.cpp +1 -1
  34. package/android/src/main/cpp/types/AnyType.h +1 -1
  35. package/android/src/main/cpp/types/FrontendConverter.cpp +32 -43
  36. package/android/src/main/cpp/types/FrontendConverter.h +1 -23
  37. package/android/src/main/cpp/types/JNIToJSIConverter.cpp +5 -10
  38. package/android/src/main/cpp/types/JNIToJSIConverter.h +6 -2
  39. package/android/src/main/java/expo/modules/adapters/react/ModuleRegistryAdapter.java +3 -0
  40. package/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +14 -100
  41. package/android/src/main/java/expo/modules/adapters/react/ReactAdapterPackage.java +3 -5
  42. package/android/src/main/java/expo/modules/adapters/react/ReactModuleRegistryProvider.java +6 -22
  43. package/android/src/main/java/expo/modules/adapters/react/apploader/RNHeadlessAppLoader.kt +8 -4
  44. package/android/src/main/java/expo/modules/adapters/react/services/EventEmitterModule.java +0 -1
  45. package/android/src/main/java/expo/modules/adapters/react/services/UIManagerModuleWrapper.java +23 -8
  46. package/android/src/main/java/expo/modules/core/BasePackage.java +0 -10
  47. package/android/src/main/java/expo/modules/core/ModulePriorities.kt +1 -0
  48. package/android/src/main/java/expo/modules/core/ModuleRegistry.java +2 -32
  49. package/android/src/main/java/expo/modules/core/ModuleRegistryProvider.java +0 -18
  50. package/android/src/main/java/expo/modules/core/Promise.java +2 -0
  51. package/android/src/main/java/expo/modules/core/interfaces/Package.java +0 -17
  52. package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +0 -9
  53. package/android/src/main/java/expo/modules/core/interfaces/ReactNativeHostHandler.java +24 -31
  54. package/android/src/main/java/expo/modules/core/logging/LogHandler.kt +1 -7
  55. package/android/src/main/java/expo/modules/core/logging/LogHandlers.kt +11 -0
  56. package/android/src/main/java/expo/modules/core/logging/Logger.kt +18 -29
  57. package/android/src/main/java/expo/modules/core/logging/LoggerTimer.kt +11 -0
  58. package/android/src/main/java/expo/modules/core/logging/OSLogHandler.kt +2 -4
  59. package/android/src/main/java/expo/modules/core/logging/PersistentFileLogHandler.kt +1 -3
  60. package/android/src/main/java/expo/modules/interfaces/constants/ConstantsInterface.java +0 -2
  61. package/android/src/main/java/expo/modules/interfaces/permissions/PermissionsStatus.java +1 -1
  62. package/android/src/main/java/expo/modules/kotlin/AppContext.kt +44 -24
  63. package/android/src/main/java/expo/modules/kotlin/ArrayExtenstions.kt +15 -0
  64. package/android/src/main/java/expo/modules/kotlin/CoreLogger.kt +2 -2
  65. package/android/src/main/java/expo/modules/kotlin/DynamicExtenstions.kt +0 -3
  66. package/android/src/main/java/expo/modules/kotlin/ExpoBridgeModule.kt +41 -0
  67. package/android/src/main/java/expo/modules/kotlin/ExpoModulesHelper.kt +1 -2
  68. package/android/src/main/java/expo/modules/kotlin/KPromiseWrapper.kt +1 -2
  69. package/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt +1 -33
  70. package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +7 -6
  71. package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +12 -12
  72. package/android/src/main/java/expo/modules/kotlin/Promise.kt +10 -0
  73. package/android/src/main/java/expo/modules/kotlin/ReactExtensions.kt +14 -0
  74. package/android/src/main/java/expo/modules/kotlin/Utils.kt +4 -1
  75. package/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAwareHelper.kt +1 -1
  76. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultCaller.kt +1 -1
  77. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultRegistry.kt +6 -6
  78. package/android/src/main/java/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +44 -15
  79. package/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt +31 -1
  80. package/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt +2 -4
  81. package/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt +11 -4
  82. package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +2 -3
  83. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt +136 -43
  84. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionComponent.kt +71 -2
  85. package/android/src/main/java/expo/modules/kotlin/functions/FunctionBuilder.kt +39 -12
  86. package/android/src/main/java/expo/modules/kotlin/jni/ExpectedType.kt +2 -2
  87. package/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt +1 -1
  88. package/android/src/main/java/expo/modules/kotlin/jni/{JSIInteropModuleRegistry.kt → JSIContext.kt} +90 -14
  89. package/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt +51 -24
  90. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt +3 -3
  91. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +4 -1
  92. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +1 -0
  93. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +1 -0
  94. package/android/src/main/java/expo/modules/kotlin/jni/PromiseImpl.kt +20 -0
  95. package/android/src/main/java/expo/modules/kotlin/modules/Module.kt +0 -1
  96. package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt +1 -1
  97. package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +164 -65
  98. package/android/src/main/java/expo/modules/kotlin/objects/PropertyComponentBuilder.kt +3 -4
  99. package/android/src/main/java/expo/modules/kotlin/sharedobjects/ClassRegistry.kt +21 -0
  100. package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObject.kt +34 -1
  101. package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +23 -8
  102. package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedRef.kt +7 -1
  103. package/android/src/main/java/expo/modules/kotlin/tracing/ExpoTrace.kt +4 -0
  104. package/android/src/main/java/expo/modules/kotlin/types/AnyType.kt +134 -2
  105. package/android/src/main/java/expo/modules/kotlin/types/EnforceType.kt +60 -0
  106. package/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt +2 -2
  107. package/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt +0 -2
  108. package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +3 -27
  109. package/android/src/main/java/expo/modules/kotlin/types/UnitTypeConverter.kt +3 -7
  110. package/android/src/main/java/expo/modules/kotlin/types/io/PathTypeConverter.kt +3 -0
  111. package/android/src/main/java/expo/modules/kotlin/viewevent/ViewEvent.kt +2 -5
  112. package/android/src/main/java/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +137 -48
  113. package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinition.kt +2 -5
  114. package/build/EventEmitter.d.ts +2 -2
  115. package/build/EventEmitter.d.ts.map +1 -1
  116. package/build/EventEmitter.js +8 -8
  117. package/build/EventEmitter.js.map +1 -1
  118. package/build/NativeModule.d.ts +4 -0
  119. package/build/NativeModule.d.ts.map +1 -0
  120. package/build/NativeModule.js +4 -0
  121. package/build/NativeModule.js.map +1 -0
  122. package/build/NativeModulesProxy.native.d.ts.map +1 -1
  123. package/build/NativeModulesProxy.native.js +4 -0
  124. package/build/NativeModulesProxy.native.js.map +1 -1
  125. package/build/NativeModulesProxy.types.d.ts +2 -2
  126. package/build/NativeModulesProxy.types.d.ts.map +1 -1
  127. package/build/NativeModulesProxy.types.js.map +1 -1
  128. package/build/NativeViewManagerAdapter.native.d.ts.map +1 -1
  129. package/build/NativeViewManagerAdapter.native.js +20 -1
  130. package/build/NativeViewManagerAdapter.native.js.map +1 -1
  131. package/build/PermissionsHook.d.ts.map +1 -1
  132. package/build/PermissionsHook.js +2 -0
  133. package/build/PermissionsHook.js.map +1 -1
  134. package/build/Refs.d.ts +8 -0
  135. package/build/Refs.d.ts.map +1 -0
  136. package/build/Refs.js +10 -0
  137. package/build/Refs.js.map +1 -0
  138. package/build/SharedObject.d.ts +4 -0
  139. package/build/SharedObject.d.ts.map +1 -0
  140. package/build/SharedObject.js +4 -0
  141. package/build/SharedObject.js.map +1 -0
  142. package/build/createWebModule.d.ts +2 -0
  143. package/build/createWebModule.d.ts.map +1 -0
  144. package/build/createWebModule.js +6 -0
  145. package/build/createWebModule.js.map +1 -0
  146. package/build/createWebModule.web.d.ts +2 -0
  147. package/build/createWebModule.web.d.ts.map +1 -0
  148. package/build/createWebModule.web.js +6 -0
  149. package/build/createWebModule.web.js.map +1 -0
  150. package/build/ensureNativeModulesAreInstalled.d.ts +6 -0
  151. package/build/ensureNativeModulesAreInstalled.d.ts.map +1 -0
  152. package/build/ensureNativeModulesAreInstalled.js +26 -0
  153. package/build/ensureNativeModulesAreInstalled.js.map +1 -0
  154. package/build/hooks/useReleasingSharedObject.d.ts +7 -0
  155. package/build/hooks/useReleasingSharedObject.d.ts.map +1 -0
  156. package/build/hooks/useReleasingSharedObject.js +40 -0
  157. package/build/hooks/useReleasingSharedObject.js.map +1 -0
  158. package/build/index.d.ts +8 -1
  159. package/build/index.d.ts.map +1 -1
  160. package/build/index.js +8 -0
  161. package/build/index.js.map +1 -1
  162. package/build/requireNativeModule.d.ts +0 -17
  163. package/build/requireNativeModule.d.ts.map +1 -1
  164. package/build/requireNativeModule.js +2 -23
  165. package/build/requireNativeModule.js.map +1 -1
  166. package/build/ts-declarations/EventEmitter.d.ts +50 -0
  167. package/build/ts-declarations/EventEmitter.d.ts.map +1 -0
  168. package/build/ts-declarations/EventEmitter.js +2 -0
  169. package/build/ts-declarations/EventEmitter.js.map +1 -0
  170. package/build/ts-declarations/NativeModule.d.ts +14 -0
  171. package/build/ts-declarations/NativeModule.d.ts.map +1 -0
  172. package/build/ts-declarations/NativeModule.js +2 -0
  173. package/build/ts-declarations/NativeModule.js.map +1 -0
  174. package/build/ts-declarations/SharedObject.d.ts +14 -0
  175. package/build/ts-declarations/SharedObject.d.ts.map +1 -0
  176. package/build/ts-declarations/SharedObject.js +2 -0
  177. package/build/ts-declarations/SharedObject.js.map +1 -0
  178. package/build/ts-declarations/global.d.ts +49 -0
  179. package/build/ts-declarations/global.d.ts.map +1 -0
  180. package/build/ts-declarations/global.js +2 -0
  181. package/build/ts-declarations/global.js.map +1 -0
  182. package/build/web/CoreModule.d.ts +17 -0
  183. package/build/web/CoreModule.d.ts.map +1 -0
  184. package/build/web/CoreModule.js +51 -0
  185. package/build/web/CoreModule.js.map +1 -0
  186. package/build/web/index.d.ts +1 -0
  187. package/build/web/index.d.ts.map +1 -0
  188. package/build/web/index.js +1 -0
  189. package/build/web/index.js.map +1 -0
  190. package/build/web/index.web.d.ts +2 -0
  191. package/build/web/index.web.d.ts.map +1 -0
  192. package/build/web/index.web.js +2 -0
  193. package/build/web/index.web.js.map +1 -0
  194. package/common/cpp/BridgelessJSCallInvoker.h +41 -0
  195. package/common/cpp/EventEmitter.cpp +299 -0
  196. package/common/cpp/EventEmitter.h +111 -0
  197. package/common/cpp/JSIUtils.cpp +116 -11
  198. package/common/cpp/JSIUtils.h +54 -7
  199. package/common/cpp/LazyObject.cpp +15 -3
  200. package/common/cpp/LazyObject.h +13 -0
  201. package/common/cpp/NativeModule.cpp +16 -0
  202. package/common/cpp/NativeModule.h +34 -0
  203. package/common/cpp/ObjectDeallocator.cpp +3 -5
  204. package/common/cpp/ObjectDeallocator.h +2 -3
  205. package/common/cpp/SharedObject.cpp +69 -0
  206. package/common/cpp/SharedObject.h +59 -0
  207. package/common/cpp/TestingSyncJSCallInvoker.h +44 -0
  208. package/ios/Api/Builders/ClassComponentBuilder.swift +34 -0
  209. package/ios/{Objects → Api/Builders}/ObjectDefinitionBuilder.swift +3 -3
  210. package/ios/Api/Builders/ViewDefinitionBuilder.swift +53 -0
  211. package/ios/Api/Factories/AsyncFunctionFactories.swift +173 -0
  212. package/ios/{Classes/ClassComponentFactories.swift → Api/Factories/ClassFactories.swift} +19 -19
  213. package/ios/{Functions/ConcurrentFunctionDefinition.swift → Api/Factories/ConcurrentFunctionFactories.swift} +0 -113
  214. package/ios/{Modules/ModuleDefinitionComponents.swift → Api/Factories/EventListenersFactories.swift} +0 -20
  215. package/ios/Api/Factories/ModuleFactories.swift +6 -0
  216. package/ios/{Objects/ObjectDefinitionComponents.swift → Api/Factories/ObjectFactories.swift} +5 -5
  217. package/ios/Api/Factories/PropertyFactories.swift +50 -0
  218. package/ios/Api/Factories/SyncFunctionFactories.swift +173 -0
  219. package/ios/{Views/ViewManagerDefinitionComponents.swift → Api/Factories/ViewFactories.swift} +7 -6
  220. package/ios/AppDelegates/EXAppDelegateWrapper.h +0 -21
  221. package/ios/AppDelegates/EXAppDelegateWrapper.mm +37 -29
  222. package/ios/{AppContext.swift → Core/AppContext.swift} +34 -11
  223. package/ios/Core/Classes/AnyClassDefinitionElement.swift +37 -0
  224. package/ios/{Classes/ClassComponent.swift → Core/Classes/ClassDefinition.swift} +10 -10
  225. package/ios/{Conversions.swift → Core/Conversions.swift} +1 -1
  226. package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicSharedObjectType.swift +3 -3
  227. package/ios/Core/Events/EventObservingDefinition.swift +79 -0
  228. package/ios/Core/Events/LegacyEventEmitterCompat.swift +32 -0
  229. package/ios/Core/ExpoBridgeModule.h +18 -0
  230. package/ios/Core/ExpoBridgeModule.mm +88 -0
  231. package/ios/Core/ExpoRuntime.swift +6 -0
  232. package/ios/{Functions/AnyFunction.swift → Core/Functions/AnyFunctionDefinition.swift} +9 -2
  233. package/ios/Core/Functions/AsyncFunctionDefinition.swift +150 -0
  234. package/ios/Core/Functions/ConcurrentFunctionDefinition.swift +112 -0
  235. package/ios/Core/Functions/SyncFunctionDefinition.swift +108 -0
  236. package/ios/{JavaScriptUtils.swift → Core/JavaScriptUtils.swift} +4 -4
  237. package/ios/{Logging → Core/Logging}/LogHandlers.swift +12 -5
  238. package/ios/{Logging → Core/Logging}/Logger.swift +14 -92
  239. package/ios/Core/Logging/LoggerTimer.swift +22 -0
  240. package/ios/{ModuleHolder.swift → Core/ModuleHolder.swift} +2 -10
  241. package/ios/Core/Modules/CoreModule.swift +43 -0
  242. package/ios/{Modules → Core/Modules}/ModuleDefinition.swift +20 -12
  243. package/ios/{Modules → Core/Modules}/ModuleDefinitionBuilder.swift +1 -3
  244. package/ios/{Objects → Core/Objects}/ObjectDefinition.swift +9 -9
  245. package/ios/{Objects/PropertyComponent.swift → Core/Objects/PropertyDefinition.swift} +11 -64
  246. package/ios/Core/Protocols/AnyDefinition.swift +4 -0
  247. package/ios/Core/Protocols/AnyExpoView.swift +7 -0
  248. package/ios/Core/Protocols/AnyModule.swift +17 -0
  249. package/ios/Core/Protocols/AnyViewDefinition.swift +34 -0
  250. package/ios/Core/SharedObjects/SharedObject.swift +80 -0
  251. package/ios/{SharedObjects → Core/SharedObjects}/SharedObjectRegistry.swift +45 -19
  252. package/ios/{Views → Core/Views}/AnyViewProp.swift +1 -1
  253. package/ios/{Views → Core/Views}/ComponentData.swift +7 -7
  254. package/ios/{Views → Core/Views}/ExpoView.swift +1 -1
  255. package/ios/Core/Views/ViewDefinition.swift +97 -0
  256. package/ios/{Views → Core/Views}/ViewLifecycleMethod.swift +1 -1
  257. package/ios/{Views → Core/Views}/ViewModuleWrapper.swift +1 -1
  258. package/ios/Fabric/ExpoFabricView.swift +5 -6
  259. package/ios/FileSystemUtilities/FileSystemLegacyUtilities.swift +111 -0
  260. package/ios/JSI/EXJSIInstaller.h +28 -0
  261. package/ios/JSI/EXJSIInstaller.mm +54 -10
  262. package/ios/JSI/EXJSIUtils.h +15 -11
  263. package/ios/JSI/EXJSIUtils.mm +21 -49
  264. package/ios/JSI/EXJavaScriptObject.mm +2 -2
  265. package/ios/JSI/EXJavaScriptRuntime.h +15 -0
  266. package/ios/JSI/EXJavaScriptRuntime.mm +53 -26
  267. package/ios/JSI/EXSharedObjectUtils.h +15 -0
  268. package/ios/JSI/EXSharedObjectUtils.mm +18 -0
  269. package/ios/JSI/JavaScriptRuntime.swift +16 -0
  270. package/ios/Legacy/ModuleRegistry/EXModuleRegistry.m +1 -0
  271. package/ios/Legacy/ModuleRegistryProvider/EXModuleRegistryProvider.m +5 -0
  272. package/ios/Legacy/NativeModulesProxy/EXNativeModulesProxy.mm +5 -4
  273. package/ios/Legacy/Services/EXReactNativeAdapter.mm +34 -28
  274. package/ios/ReactDelegates/EXReactDelegateWrapper.h +4 -12
  275. package/ios/ReactDelegates/EXReactDelegateWrapper.mm +41 -0
  276. package/ios/ReactDelegates/EXReactRootViewFactory.h +38 -0
  277. package/ios/ReactDelegates/EXReactRootViewFactory.mm +54 -0
  278. package/ios/ReactDelegates/ExpoReactDelegate.swift +22 -15
  279. package/ios/ReactDelegates/ExpoReactDelegateHandler.swift +10 -21
  280. package/ios/ReactDelegates/RCTAppDelegate+Recreate.h +28 -0
  281. package/ios/ReactDelegates/RCTAppDelegate+Recreate.mm +47 -0
  282. package/ios/Tests/{ClassComponentSpec.swift → ClassDefinitionSpec.swift} +6 -6
  283. package/ios/Tests/ConvertiblesSpec.swift +6 -1
  284. package/ios/Tests/CoreModuleSpec.swift +0 -4
  285. package/ios/Tests/DynamicTypeSpec.swift +1 -1
  286. package/ios/Tests/EventEmitterSpec.swift +274 -0
  287. package/ios/Tests/ExceptionsSpec.swift +114 -54
  288. package/ios/Tests/ExpoModulesSpec.swift +4 -3
  289. package/ios/Tests/LoggerSpec.swift +80 -0
  290. package/ios/Tests/{PropertyComponentSpec.swift → PropertyDefinitionSpec.swift} +1 -1
  291. package/ios/Tests/SharedObjectRegistrySpec.swift +34 -28
  292. package/ios/Tests/SharedObjectSpec.swift +141 -0
  293. package/ios/Tests/ViewDefinitionSpec.swift +1 -1
  294. package/package.json +2 -2
  295. package/src/EventEmitter.ts +15 -18
  296. package/src/NativeModule.ts +6 -0
  297. package/src/NativeModulesProxy.native.ts +5 -0
  298. package/src/NativeModulesProxy.types.ts +2 -2
  299. package/src/NativeViewManagerAdapter.native.tsx +25 -1
  300. package/src/PermissionsHook.ts +4 -0
  301. package/src/Refs.ts +10 -0
  302. package/src/SharedObject.ts +6 -0
  303. package/src/createWebModule.ts +5 -0
  304. package/src/createWebModule.web.ts +6 -0
  305. package/src/ensureNativeModulesAreInstalled.ts +24 -0
  306. package/src/hooks/useReleasingSharedObject.ts +51 -0
  307. package/src/index.ts +13 -0
  308. package/src/requireNativeModule.ts +2 -51
  309. package/src/ts-declarations/EventEmitter.ts +65 -0
  310. package/src/ts-declarations/ExpoModules.d.ts +0 -5
  311. package/src/ts-declarations/NativeModule.ts +18 -0
  312. package/src/ts-declarations/SharedObject.ts +16 -0
  313. package/src/ts-declarations/global.ts +60 -0
  314. package/src/web/CoreModule.ts +83 -0
  315. package/src/web/index.ts +0 -0
  316. package/src/web/index.web.ts +1 -0
  317. package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +0 -196
  318. package/android/src/main/java/expo/modules/adapters/react/ArgumentsHelper.java +0 -48
  319. package/android/src/main/java/expo/modules/adapters/react/PromiseWrapper.java +0 -38
  320. package/android/src/main/java/expo/modules/adapters/react/services/CookieManagerModule.java +0 -53
  321. package/android/src/main/java/expo/modules/core/ArgumentsHelper.java +0 -44
  322. package/android/src/main/java/expo/modules/core/ExportedModule.java +0 -173
  323. package/android/src/main/java/expo/modules/core/ModuleRegistryDelegate.kt +0 -12
  324. package/android/src/main/java/expo/modules/core/ViewManager.java +0 -9
  325. package/android/src/main/java/expo/modules/core/interfaces/ExpoMethod.java +0 -12
  326. package/android/src/main/java/expo/modules/core/interfaces/ExpoProp.java +0 -10
  327. package/android/src/main/java/expo/modules/core/logging/LoggerOptions.kt +0 -29
  328. package/android-annotation/build.gradle +0 -48
  329. package/android-annotation/src/main/java/expo/modules/annotation/Config.kt +0 -7
  330. package/android-annotation/src/main/java/expo/modules/annotation/ConverterBinder.kt +0 -7
  331. package/android-annotation-processor/build.gradle +0 -54
  332. package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessor.kt +0 -175
  333. package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessorProvider.kt +0 -10
  334. package/android-annotation-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider +0 -1
  335. package/ios/Classes/ClassComponentElement.swift +0 -37
  336. package/ios/Classes/ClassComponentElementsBuilder.swift +0 -34
  337. package/ios/ExpoBridgeModule.m +0 -7
  338. package/ios/ExpoBridgeModule.swift +0 -108
  339. package/ios/ExpoRuntime.swift +0 -28
  340. package/ios/Functions/AsyncFunctionComponent.swift +0 -327
  341. package/ios/Functions/SyncFunctionComponent.swift +0 -282
  342. package/ios/Interfaces/Font/EXFontManagerInterface.h +0 -9
  343. package/ios/Interfaces/Font/EXFontProcessorInterface.h +0 -15
  344. package/ios/Interfaces/Font/EXFontScalerInterface.h +0 -9
  345. package/ios/Interfaces/Font/EXFontScalersManagerInterface.h +0 -9
  346. package/ios/Legacy/Services/EXReactFontManager.h +0 -6
  347. package/ios/Legacy/Services/EXReactFontManager.m +0 -130
  348. package/ios/Modules/AnyModule.swift +0 -53
  349. package/ios/Modules/CoreModule.swift +0 -17
  350. package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.h +0 -16
  351. package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.m +0 -49
  352. package/ios/ReactDelegates/EXReactCompatibleHelpers.h +0 -15
  353. package/ios/ReactDelegates/EXReactCompatibleHelpers.m +0 -25
  354. package/ios/ReactDelegates/EXReactDelegateWrapper.m +0 -53
  355. package/ios/SharedObjects/SharedObject.swift +0 -31
  356. package/ios/Views/ViewDefinition.swift +0 -114
  357. package/ios/Views/ViewFactory.swift +0 -16
  358. package/ios/Views/ViewManagerDefinition.swift +0 -77
  359. package/ios/Views/ViewManagerDefinitionBuilder.swift +0 -11
  360. /package/ios/{AppContextConfig.swift → Core/AppContextConfig.swift} +0 -0
  361. /package/ios/{Arguments → Core/Arguments}/AnyArgument.swift +0 -0
  362. /package/ios/{Arguments → Core/Arguments}/Convertible.swift +0 -0
  363. /package/ios/{Arguments → Core/Arguments}/Convertibles.swift +0 -0
  364. /package/ios/{Arguments → Core/Arguments}/Enumerable.swift +0 -0
  365. /package/ios/{Classes → Core/Classes}/ClassRegistry.swift +0 -0
  366. /package/ios/{Convertibles → Core/Convertibles}/Convertibles+Color.swift +0 -0
  367. /package/ios/{Convertibles → Core/Convertibles}/Either.swift +0 -0
  368. /package/ios/{DynamicTypes → Core/DynamicTypes}/AnyDynamicType.swift +0 -0
  369. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicArrayType.swift +0 -0
  370. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicConvertibleType.swift +0 -0
  371. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDataType.swift +0 -0
  372. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDictionaryType.swift +0 -0
  373. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicEnumType.swift +0 -0
  374. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicJavaScriptType.swift +0 -0
  375. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicOptionalType.swift +0 -0
  376. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicRawType.swift +0 -0
  377. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicType.swift +0 -0
  378. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicTypedArrayType.swift +0 -0
  379. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicViewType.swift +0 -0
  380. /package/ios/{EventListener.swift → Core/EventListener.swift} +0 -0
  381. /package/ios/{Events → Core/Events}/Callback.swift +0 -0
  382. /package/ios/{Events → Core/Events}/EventDispatcher.swift +0 -0
  383. /package/ios/{Exceptions → Core/Exceptions}/ChainableException.swift +0 -0
  384. /package/ios/{Exceptions → Core/Exceptions}/CodedError.swift +0 -0
  385. /package/ios/{Exceptions → Core/Exceptions}/CommonExceptions.swift +0 -0
  386. /package/ios/{Exceptions → Core/Exceptions}/Exception.swift +0 -0
  387. /package/ios/{Exceptions → Core/Exceptions}/ExceptionOrigin.swift +0 -0
  388. /package/ios/{Exceptions → Core/Exceptions}/GenericException.swift +0 -0
  389. /package/ios/{Exceptions → Core/Exceptions}/UnexpectedException.swift +0 -0
  390. /package/ios/{JavaScriptFunction.swift → Core/JavaScriptFunction.swift} +0 -0
  391. /package/ios/{Logging → Core/Logging}/LogType.swift +0 -0
  392. /package/ios/{Logging → Core/Logging}/PersistentFileLog.swift +0 -0
  393. /package/ios/{ModuleRegistry.swift → Core/ModuleRegistry.swift} +0 -0
  394. /package/ios/{Modules → Core/Modules}/Module.swift +0 -0
  395. /package/ios/{ModulesProvider.swift → Core/ModulesProvider.swift} +0 -0
  396. /package/ios/{Objects → Core/Objects}/JavaScriptObjectBuilder.swift +0 -0
  397. /package/ios/{Promise.swift → Core/Promise.swift} +0 -0
  398. /package/ios/{Records → Core/Records}/AnyField.swift +0 -0
  399. /package/ios/{Records → Core/Records}/Field.swift +0 -0
  400. /package/ios/{Records → Core/Records}/FieldExtensions.swift +0 -0
  401. /package/ios/{Records → Core/Records}/FieldOption.swift +0 -0
  402. /package/ios/{Records → Core/Records}/Record.swift +0 -0
  403. /package/ios/{SharedObjects → Core/SharedObjects}/SharedRef.swift +0 -0
  404. /package/ios/{TypedArrays → Core/TypedArrays}/AnyTypedArray.swift +0 -0
  405. /package/ios/{TypedArrays → Core/TypedArrays}/ConcreteTypedArrays.swift +0 -0
  406. /package/ios/{TypedArrays → Core/TypedArrays}/GenericTypedArray.swift +0 -0
  407. /package/ios/{TypedArrays → Core/TypedArrays}/TypedArray.swift +0 -0
  408. /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 JSIInteropModuleRegistry : public jni::HybridClass<JSIInteropModuleRegistry> {
42
+ class JSIContext : public jni::HybridClass<JSIContext> {
33
43
  public:
34
- static auto constexpr
35
- kJavaDescriptor = "Lexpo/modules/kotlin/jni/JSIInteropModuleRegistry;";
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
- bool wasDeallocated = false;
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<JSIInteropModuleRegistry::javaobject> javaPart_;
150
+ jni::global_ref<JSIContext::javaobject> javaPart_;
117
151
 
118
- explicit JSIInteropModuleRegistry(jni::alias_ref<jhybridobject> jThis);
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 jniWasDeallocated();
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