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
@@ -1,10 +1,14 @@
1
1
  // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
2
 
3
3
  #include "JavaScriptModuleObject.h"
4
- #include "JSIInteropModuleRegistry.h"
4
+ #include "JSIContext.h"
5
5
  #include "JSIUtils.h"
6
+ #include "EventEmitter.h"
7
+ #include "SharedObject.h"
8
+ #include "NativeModule.h"
6
9
 
7
10
  #include <folly/dynamic.h>
11
+ #include <jni.h>
8
12
  #include <jsi/JSIDynamic.h>
9
13
  #include <react/jni/ReadableNativeArray.h>
10
14
  #include <fbjni/detail/Hybrid.h>
@@ -27,21 +31,19 @@ namespace expo {
27
31
 
28
32
  void decorateObjectWithFunctions(
29
33
  jsi::Runtime &runtime,
30
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
31
34
  jsi::Object *jsObject,
32
35
  JavaScriptModuleObject *objectData) {
33
36
  for (auto &[name, method]: objectData->methodsMetadata) {
34
37
  jsObject->setProperty(
35
38
  runtime,
36
39
  jsi::String::createFromUtf8(runtime, name),
37
- jsi::Value(runtime, *method.toJSFunction(runtime, jsiInteropModuleRegistry))
40
+ jsi::Value(runtime, *method->toJSFunction(runtime))
38
41
  );
39
42
  }
40
43
  }
41
44
 
42
45
  void decorateObjectWithProperties(
43
46
  jsi::Runtime &runtime,
44
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
45
47
  jsi::Object *jsObject,
46
48
  JavaScriptModuleObject *objectData) {
47
49
  for (auto &[name, property]: objectData->properties) {
@@ -52,22 +54,19 @@ void decorateObjectWithProperties(
52
54
  descriptor.setProperty(
53
55
  runtime,
54
56
  "get",
55
- jsi::Value(runtime, *getter.toJSFunction(runtime,
56
- jsiInteropModuleRegistry))
57
+ jsi::Value(runtime, *getter->toJSFunction(runtime))
57
58
  );
58
59
  descriptor.setProperty(
59
60
  runtime,
60
61
  "set",
61
- jsi::Value(runtime, *setter.toJSFunction(runtime,
62
- jsiInteropModuleRegistry))
62
+ jsi::Value(runtime, *setter->toJSFunction(runtime))
63
63
  );
64
- common::definePropertyOnJSIObject(runtime, jsObject, name.c_str(), std::move(descriptor));
64
+ common::defineProperty(runtime, jsObject, name.c_str(), std::move(descriptor));
65
65
  }
66
66
  }
67
67
 
68
68
  void decorateObjectWithConstants(
69
69
  jsi::Runtime &runtime,
70
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
71
70
  jsi::Object *jsObject,
72
71
  JavaScriptModuleObject *objectData) {
73
72
  for (const auto &[name, value]: objectData->constants) {
@@ -81,7 +80,7 @@ void decorateObjectWithConstants(
81
80
 
82
81
  jni::local_ref<jni::HybridClass<JavaScriptModuleObject>::jhybriddata>
83
82
  JavaScriptModuleObject::initHybrid(jni::alias_ref<jhybridobject> jThis) {
84
- return makeCxxInstance(jThis);
83
+ return makeCxxInstance();
85
84
  }
86
85
 
87
86
  void JavaScriptModuleObject::registerNatives() {
@@ -97,7 +96,9 @@ void JavaScriptModuleObject::registerNatives() {
97
96
  makeNativeMethod("registerClass",
98
97
  JavaScriptModuleObject::registerClass),
99
98
  makeNativeMethod("registerViewPrototype",
100
- JavaScriptModuleObject::registerViewPrototype)
99
+ JavaScriptModuleObject::registerViewPrototype),
100
+ makeNativeMethod("emitEvent",
101
+ JavaScriptModuleObject::emitEvent)
101
102
  });
102
103
  }
103
104
 
@@ -106,30 +107,33 @@ std::shared_ptr<jsi::Object> JavaScriptModuleObject::getJSIObject(jsi::Runtime &
106
107
  return object;
107
108
  }
108
109
 
109
- auto moduleObject = std::make_shared<jsi::Object>(runtime);
110
+ auto moduleObject = std::make_shared<jsi::Object>(NativeModule::createInstance(runtime));
110
111
 
112
+ decorate(runtime, moduleObject.get());
113
+
114
+ jsiObject = moduleObject;
115
+ return moduleObject;
116
+ }
117
+
118
+ void JavaScriptModuleObject::decorate(jsi::Runtime &runtime, jsi::Object *moduleObject) {
111
119
  decorateObjectWithConstants(
112
120
  runtime,
113
- jsiInteropModuleRegistry,
114
- moduleObject.get(),
121
+ moduleObject,
115
122
  this
116
123
  );
117
124
  decorateObjectWithProperties(
118
125
  runtime,
119
- jsiInteropModuleRegistry,
120
- moduleObject.get(),
126
+ moduleObject,
121
127
  this
122
128
  );
123
129
  decorateObjectWithFunctions(
124
130
  runtime,
125
- jsiInteropModuleRegistry,
126
- moduleObject.get(),
131
+ moduleObject,
127
132
  this
128
133
  );
129
134
 
130
135
  if (viewPrototype) {
131
136
  auto viewPrototypeObject = viewPrototype->cthis();
132
- viewPrototypeObject->jsiInteropModuleRegistry = jsiInteropModuleRegistry;
133
137
  auto viewPrototypeJSIObject = viewPrototypeObject->getJSIObject(runtime);
134
138
  moduleObject->setProperty(
135
139
  runtime,
@@ -139,39 +143,27 @@ std::shared_ptr<jsi::Object> JavaScriptModuleObject::getJSIObject(jsi::Runtime &
139
143
  }
140
144
 
141
145
  for (auto &[name, classInfo]: classes) {
142
- auto &[classRef, constructor] = classInfo;
146
+ auto &[classRef, constructor, ownerClass] = classInfo;
143
147
  auto classObject = classRef->cthis();
144
- classObject->jsiInteropModuleRegistry = jsiInteropModuleRegistry;
145
-
146
- std::string nativeConstructorKey("__native_constructor__");
147
-
148
- // Create a string buffer of the source code to evaluate.
149
- std::stringstream source;
150
- source << "(function " << name << "(...args) { this." << nativeConstructorKey
151
- << "(...args); return this; })";
152
- std::shared_ptr<jsi::StringBuffer> sourceBuffer = std::make_shared<jsi::StringBuffer>(
153
- source.str());
154
-
155
- // Evaluate the code and obtain returned value (the constructor function).
156
- jsi::Object klass = runtime.evaluateJavaScript(sourceBuffer, "").asObject(runtime);
157
-
158
- // Set the native constructor in the prototype.
159
- jsi::Object prototype = klass.getPropertyAsObject(runtime, "prototype");
160
- jsi::PropNameID nativeConstructorPropId = jsi::PropNameID::forAscii(runtime,
161
- nativeConstructorKey);
162
- jsi::Function nativeConstructor = jsi::Function::createFromHostFunction(
148
+ auto weakConstructor = std::weak_ptr(constructor);
149
+ auto klass = SharedObject::createClass(
163
150
  runtime,
164
- nativeConstructorPropId,
165
- // The paramCount is not obligatory to match, it only affects the `length` property of the function.
166
- 0,
167
- [classObject, &constructor = constructor, jsiInteropModuleRegistry = jsiInteropModuleRegistry](
151
+ name.c_str(),
152
+ [classObject, weakConstructor = std::move(weakConstructor)](
168
153
  jsi::Runtime &runtime,
169
154
  const jsi::Value &thisValue,
170
155
  const jsi::Value *args,
171
156
  size_t count
172
157
  ) -> jsi::Value {
158
+ // We need to check if the constructor is still alive.
159
+ // If not we can just ignore the call. We're destroying the module.
160
+ auto ctr = weakConstructor.lock();
161
+ if (ctr == nullptr) {
162
+ return jsi::Value::undefined();
163
+ }
164
+
173
165
  auto thisObject = std::make_shared<jsi::Object>(thisValue.asObject(runtime));
174
- decorateObjectWithProperties(runtime, jsiInteropModuleRegistry, thisObject.get(),
166
+ decorateObjectWithProperties(runtime, thisObject.get(),
175
167
  classObject);
176
168
  try {
177
169
  JNIEnv *env = jni::Environment::current();
@@ -181,16 +173,15 @@ std::shared_ptr<jsi::Object> JavaScriptModuleObject::getJSIObject(jsi::Runtime &
181
173
  * all LocalReferences are deleted.
182
174
  */
183
175
  jni::JniLocalScope scope(env, (int) count);
184
- auto result = constructor.callJNISync(
176
+ auto result = ctr->callJNISync(
185
177
  env,
186
178
  runtime,
187
- jsiInteropModuleRegistry,
188
179
  thisValue,
189
180
  args,
190
181
  count
191
182
  );
192
183
  if (result == nullptr) {
193
- return jsi::Value::undefined();
184
+ return jsi::Value(runtime, thisValue);
194
185
  }
195
186
  jobject unpackedResult = result.get();
196
187
  jclass resultClass = env->GetObjectClass(unpackedResult);
@@ -199,41 +190,52 @@ std::shared_ptr<jsi::Object> JavaScriptModuleObject::getJSIObject(jsi::Runtime &
199
190
  JavaReferencesCache::instance()->getJClass(
200
191
  "expo/modules/kotlin/sharedobjects/SharedObject").clazz
201
192
  )) {
193
+ JSIContext *jsiContext = getJSIContext(runtime);
202
194
  auto jsThisObject = JavaScriptObject::newInstance(
203
- jsiInteropModuleRegistry,
204
- jsiInteropModuleRegistry->runtimeHolder,
195
+ jsiContext,
196
+ jsiContext->runtimeHolder,
205
197
  thisObject
206
198
  );
207
- jsiInteropModuleRegistry->registerSharedObject(result, jsThisObject);
199
+ jsiContext->registerSharedObject(result, jsThisObject);
208
200
  }
201
+ return jsi::Value(runtime, thisValue);
209
202
  } catch (jni::JniException &jniException) {
210
203
  rethrowAsCodedError(runtime, jniException);
211
204
  }
212
- return jsi::Value::undefined();
213
- });
205
+ }
206
+ );
214
207
 
215
- auto descriptor = JavaScriptObject::preparePropertyDescriptor(runtime, 0);
216
- descriptor.setProperty(runtime, "value", jsi::Value(runtime, nativeConstructor));
208
+ auto klassSharedPtr = std::make_shared<jsi::Function>(std::move(klass));
217
209
 
218
- common::definePropertyOnJSIObject(runtime, &prototype, nativeConstructorKey.c_str(),
219
- std::move(descriptor));
210
+ JSIContext *jsiContext = getJSIContext(runtime);
211
+
212
+ auto jsThisObject = JavaScriptObject::newInstance(
213
+ jsiContext,
214
+ jsiContext->runtimeHolder,
215
+ klassSharedPtr
216
+ );
217
+
218
+ if (ownerClass != nullptr) {
219
+ jsiContext->registerClass(jni::make_local(ownerClass), jsThisObject);
220
+ }
220
221
 
221
222
  moduleObject->setProperty(
222
223
  runtime,
223
224
  jsi::String::createFromUtf8(runtime, name),
224
- jsi::Value(runtime, klass.asFunction(runtime))
225
+ jsi::Value(runtime, *klassSharedPtr.get())
225
226
  );
226
227
 
228
+ jsi::PropNameID prototypePropNameId = jsi::PropNameID::forAscii(runtime, "prototype", 9);
229
+ jsi::Object klassPrototype = klassSharedPtr
230
+ ->getProperty(runtime, prototypePropNameId)
231
+ .asObject(runtime);
232
+
227
233
  decorateObjectWithFunctions(
228
234
  runtime,
229
- jsiInteropModuleRegistry,
230
- &prototype,
235
+ &klassPrototype,
231
236
  classObject
232
237
  );
233
238
  }
234
-
235
- jsiObject = moduleObject;
236
- return moduleObject;
237
239
  }
238
240
 
239
241
  void JavaScriptModuleObject::exportConstants(
@@ -254,15 +256,14 @@ void JavaScriptModuleObject::registerSyncFunction(
254
256
  jni::alias_ref<JNIFunctionBody::javaobject> body
255
257
  ) {
256
258
  std::string cName = name->toStdString();
257
-
258
- methodsMetadata.try_emplace(
259
+ auto methodMetadata = std::make_shared<MethodMetadata>(
259
260
  cName,
260
- cName,
261
- takesOwner,
261
+ takesOwner & 0x1, // We're unsure if takesOwner can be greater than 1, so we're using bitwise AND to ensure it's 0 or 1.
262
262
  false,
263
263
  jni::make_local(expectedArgTypes),
264
264
  jni::make_global(body)
265
265
  );
266
+ methodsMetadata.insert_or_assign(cName, std::move(methodMetadata));
266
267
  }
267
268
 
268
269
  void JavaScriptModuleObject::registerAsyncFunction(
@@ -272,38 +273,42 @@ void JavaScriptModuleObject::registerAsyncFunction(
272
273
  jni::alias_ref<JNIAsyncFunctionBody::javaobject> body
273
274
  ) {
274
275
  std::string cName = name->toStdString();
275
-
276
- methodsMetadata.try_emplace(
276
+ auto methodMetadata = std::make_shared<MethodMetadata>(
277
277
  cName,
278
- cName,
279
- takesOwner,
278
+ takesOwner & 0x1, // We're unsure if takesOwner can be greater than 1, so we're using bitwise AND to ensure it's 0 or 1.
280
279
  true,
281
280
  jni::make_local(expectedArgTypes),
282
281
  jni::make_global(body)
283
282
  );
283
+ methodsMetadata.insert_or_assign(cName, std::move(methodMetadata));
284
284
  }
285
285
 
286
286
  void JavaScriptModuleObject::registerClass(
287
287
  jni::alias_ref<jstring> name,
288
288
  jni::alias_ref<JavaScriptModuleObject::javaobject> classObject,
289
289
  jboolean takesOwner,
290
+ jni::alias_ref<jclass> ownerClass,
290
291
  jni::alias_ref<jni::JArrayClass<ExpectedType>> expectedArgTypes,
291
292
  jni::alias_ref<JNIFunctionBody::javaobject> body
292
293
  ) {
293
294
  std::string cName = name->toStdString();
294
- MethodMetadata constructor(
295
+ auto constructor = std::make_shared<MethodMetadata>(
295
296
  "constructor",
296
- takesOwner,
297
+ takesOwner & 0x1, // We're unsure if takesOwner can be greater than 1, so we're using bitwise AND to ensure it's 0 or 1.
297
298
  false,
298
299
  jni::make_local(expectedArgTypes),
299
300
  jni::make_global(body)
300
301
  );
301
302
 
302
- auto pair = std::make_pair(jni::make_global(classObject), std::move(constructor));
303
+ auto classTuple = std::make_tuple(
304
+ jni::make_global(classObject),
305
+ std::move(constructor),
306
+ jni::make_global(ownerClass)
307
+ );
303
308
 
304
309
  classes.try_emplace(
305
310
  cName,
306
- std::move(pair)
311
+ std::move(classTuple)
307
312
  );
308
313
  }
309
314
 
@@ -324,17 +329,17 @@ void JavaScriptModuleObject::registerProperty(
324
329
  ) {
325
330
  auto cName = name->toStdString();
326
331
 
327
- auto getterMetadata = MethodMetadata(
332
+ auto getterMetadata = make_shared<MethodMetadata>(
328
333
  cName,
329
- getterTakesOwner,
334
+ getterTakesOwner & 0x1, // We're unsure if getterTakesOwner can be greater than 1, so we're using bitwise AND to ensure it's 0 or 1.
330
335
  false,
331
336
  jni::make_local(getterExpectedArgsTypes),
332
337
  jni::make_global(getter)
333
338
  );
334
339
 
335
- auto setterMetadata = MethodMetadata(
340
+ auto setterMetadata = make_shared<MethodMetadata>(
336
341
  cName,
337
- setterTakesOwner,
342
+ setterTakesOwner & 0x1, // We're unsure if setterTakesOwner can be greater than 1, so we're using bitwise AND to ensure it's 0 or 1.
338
343
  false,
339
344
  jni::make_local(setterExpectedArgsTypes),
340
345
  jni::make_global(setter)
@@ -345,10 +350,41 @@ void JavaScriptModuleObject::registerProperty(
345
350
  std::move(setterMetadata)
346
351
  );
347
352
 
348
- properties.insert({cName, std::move(functions)});
353
+ properties.insert_or_assign(cName, std::move(functions));
349
354
  }
350
355
 
351
- JavaScriptModuleObject::JavaScriptModuleObject(jni::alias_ref<jhybridobject> jThis)
352
- : javaPart_(jni::make_global(jThis)) {
356
+ void JavaScriptModuleObject::emitEvent(
357
+ jni::alias_ref<jni::HybridClass<JSIContext>::javaobject> jsiContextRef,
358
+ jni::alias_ref<jstring> eventName,
359
+ jni::alias_ref<react::ReadableNativeMap::javaobject> eventBody
360
+ ) {
361
+ const std::string name = eventName->toStdString();
362
+ folly::dynamic body;
363
+ if (eventBody) {
364
+ body = eventBody->cthis()->consume();
365
+ }
366
+
367
+ const JSIContext *jsiContext = jsiContextRef->cthis();
368
+
369
+ jsiContext->runtimeHolder->jsInvoker->invokeAsync([
370
+ jsiContext,
371
+ name = std::move(name),
372
+ body = std::move(body),
373
+ weakThis = jsiObject
374
+ ]() {
375
+ std::shared_ptr<jsi::Object> jsThis = weakThis.lock();
376
+ if (!jsThis) {
377
+ return;
378
+ }
379
+
380
+ // TODO(@lukmccall): refactor when jsInvoker recieves a runtime as a parameter
381
+ jsi::Runtime &rt = jsiContext->runtimeHolder->get();
382
+
383
+ jsi::Value convertedBody = jsi::valueFromDynamic(rt, body);
384
+ std::vector<jsi::Value> args;
385
+ args.emplace_back(std::move(convertedBody));
386
+
387
+ EventEmitter::emitEvent(rt, *jsThis, name, args);
388
+ });
353
389
  }
354
390
  } // namespace expo
@@ -5,6 +5,7 @@
5
5
  #include <fbjni/fbjni.h>
6
6
  #include <jsi/jsi.h>
7
7
  #include <react/jni/ReadableNativeArray.h>
8
+ #include <react/jni/ReadableNativeMap.h>
8
9
  #include <jni/JCallback.h>
9
10
 
10
11
  #include <unordered_map>
@@ -18,27 +19,24 @@ namespace jsi = facebook::jsi;
18
19
  namespace react = facebook::react;
19
20
 
20
21
  namespace expo {
21
- class JSIInteropModuleRegistry;
22
+ class JSIContext;
22
23
 
23
24
  class JavaScriptModuleObject;
24
25
 
25
26
  void decorateObjectWithFunctions(
26
27
  jsi::Runtime &runtime,
27
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
28
28
  jsi::Object *jsObject,
29
29
  JavaScriptModuleObject *objectData
30
30
  );
31
31
 
32
32
  void decorateObjectWithProperties(
33
33
  jsi::Runtime &runtime,
34
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
35
34
  jsi::Object *jsObject,
36
35
  JavaScriptModuleObject *objectData
37
36
  );
38
37
 
39
38
  void decorateObjectWithConstants(
40
39
  jsi::Runtime &runtime,
41
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
42
40
  jsi::Object *jsObject,
43
41
  JavaScriptModuleObject *objectData
44
42
  );
@@ -59,11 +57,6 @@ public:
59
57
 
60
58
  static void registerNatives();
61
59
 
62
- /**
63
- * Pointer to the module registry interop.
64
- */
65
- JSIInteropModuleRegistry *jsiInteropModuleRegistry;
66
-
67
60
  /**
68
61
  * Returns a cached instance of jsi::Object representing this module.
69
62
  * @param runtime
@@ -71,6 +64,11 @@ public:
71
64
  */
72
65
  std::shared_ptr<jsi::Object> getJSIObject(jsi::Runtime &runtime);
73
66
 
67
+ /**
68
+ * Decorates the given object with properties and functions provided in the module definition.
69
+ */
70
+ void decorate(jsi::Runtime &runtime, jsi::Object *moduleObject);
71
+
74
72
  /**
75
73
  * Exports constants that will be assigned to the underlying HostObject.
76
74
  */
@@ -102,6 +100,7 @@ public:
102
100
  jni::alias_ref<jstring> name,
103
101
  jni::alias_ref<JavaScriptModuleObject::javaobject> classObject,
104
102
  jboolean takesOwner,
103
+ jni::alias_ref<jclass> ownerClass,
105
104
  jni::alias_ref<jni::JArrayClass<ExpectedType>> expectedArgTypes,
106
105
  jni::alias_ref<JNIFunctionBody::javaobject> body
107
106
  );
@@ -127,29 +126,34 @@ public:
127
126
  jni::alias_ref<JNIFunctionBody::javaobject> setter
128
127
  );
129
128
 
130
- private:
131
- explicit JavaScriptModuleObject(jni::alias_ref<jhybridobject> jThis);
129
+ /**
130
+ * Emits an event using cached jsi::Object with the given name and body.
131
+ * @param eventName
132
+ * @param eventBody
133
+ */
134
+ void emitEvent(
135
+ jni::alias_ref<jni::HybridClass<JSIContext>::javaobject> jsiContextRef,
136
+ jni::alias_ref<jstring> eventName,
137
+ jni::alias_ref<react::ReadableNativeMap::javaobject> eventBody
138
+ );
132
139
 
133
140
  private:
134
141
  friend HybridBase;
135
142
 
136
143
  friend void decorateObjectWithFunctions(
137
144
  jsi::Runtime &runtime,
138
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
139
145
  jsi::Object *jsObject,
140
146
  JavaScriptModuleObject *objectData
141
147
  );
142
148
 
143
149
  friend void decorateObjectWithProperties(
144
150
  jsi::Runtime &runtime,
145
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
146
151
  jsi::Object *jsObject,
147
152
  JavaScriptModuleObject *objectData
148
153
  );
149
154
 
150
155
  friend void decorateObjectWithConstants(
151
156
  jsi::Runtime &runtime,
152
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
153
157
  jsi::Object *jsObject,
154
158
  JavaScriptModuleObject *objectData
155
159
  );
@@ -161,12 +165,11 @@ private:
161
165
  * Doing that allows the runtime to deallocate jsi::Object if it's not needed anymore.
162
166
  */
163
167
  std::weak_ptr<jsi::Object> jsiObject;
164
- jni::global_ref<JavaScriptModuleObject::javaobject> javaPart_;
165
168
 
166
169
  /**
167
170
  * Metadata map that stores information about all available methods on this module.
168
171
  */
169
- std::unordered_map<std::string, MethodMetadata> methodsMetadata;
172
+ std::unordered_map<std::string, std::shared_ptr<MethodMetadata>> methodsMetadata;
170
173
 
171
174
  /**
172
175
  * A constants map.
@@ -177,11 +180,11 @@ private:
177
180
  * A registry of properties
178
181
  * The first MethodMetadata points to the getter and the second one to the setter.
179
182
  */
180
- std::map<std::string, std::pair<MethodMetadata, MethodMetadata>> properties;
183
+ std::map<std::string, std::pair<std::shared_ptr<MethodMetadata>, std::shared_ptr<MethodMetadata>>> properties;
181
184
 
182
185
  std::map<
183
186
  std::string,
184
- std::pair<jni::global_ref<JavaScriptModuleObject::javaobject>, MethodMetadata>
187
+ std::tuple<jni::global_ref<JavaScriptModuleObject::javaobject>, std::shared_ptr<MethodMetadata>, jni::global_ref<jclass>>
185
188
  > classes;
186
189
 
187
190
  jni::global_ref<JavaScriptModuleObject::javaobject> viewPrototype;
@@ -8,7 +8,7 @@
8
8
  #include "JSITypeConverter.h"
9
9
  #include "ObjectDeallocator.h"
10
10
  #include "JavaReferencesCache.h"
11
- #include "JSIInteropModuleRegistry.h"
11
+ #include "JSIContext.h"
12
12
 
13
13
  namespace expo {
14
14
  void JavaScriptObject::registerNatives() {
@@ -77,7 +77,7 @@ jni::local_ref<JavaScriptValue::javaobject> JavaScriptObject::jniGetProperty(
77
77
  ) {
78
78
  auto result = std::make_shared<jsi::Value>(getProperty(name->toStdString()));
79
79
  return JavaScriptValue::newInstance(
80
- runtimeHolder.getModuleRegistry(),
80
+ runtimeHolder.getJSIContext(),
81
81
  runtimeHolder,
82
82
  result
83
83
  );
@@ -113,7 +113,7 @@ jni::local_ref<jni::JArrayClass<jstring>> JavaScriptObject::jniGetPropertyNames(
113
113
 
114
114
  jni::local_ref<jni::HybridClass<JavaScriptWeakObject, Destructible>::javaobject> JavaScriptObject::createWeak() {
115
115
  return JavaScriptWeakObject::newInstance(
116
- runtimeHolder.getModuleRegistry(),
116
+ runtimeHolder.getJSIContext(),
117
117
  runtimeHolder,
118
118
  get()
119
119
  );
@@ -123,7 +123,7 @@ jni::local_ref<JavaScriptFunction::javaobject> JavaScriptObject::jniAsFunction()
123
123
  auto &jsRuntime = runtimeHolder.getJSRuntime();
124
124
  auto jsFuncion = std::make_shared<jsi::Function>(jsObject->asFunction(jsRuntime));
125
125
  return JavaScriptFunction::newInstance(
126
- runtimeHolder.getModuleRegistry(),
126
+ runtimeHolder.getJSIContext(),
127
127
  runtimeHolder,
128
128
  jsFuncion
129
129
  );
@@ -158,12 +158,12 @@ jsi::Object JavaScriptObject::preparePropertyDescriptor(
158
158
  }
159
159
 
160
160
  jni::local_ref<JavaScriptObject::javaobject> JavaScriptObject::newInstance(
161
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
161
+ JSIContext *jsiContext,
162
162
  std::weak_ptr<JavaScriptRuntime> runtime,
163
163
  std::shared_ptr<jsi::Object> jsObject
164
164
  ) {
165
165
  auto object = JavaScriptObject::newObjectCxxArgs(std::move(runtime), std::move(jsObject));
166
- jsiInteropModuleRegistry->jniDeallocator->addReference(object);
166
+ jsiContext->jniDeallocator->addReference(object);
167
167
  return object;
168
168
  }
169
169
 
@@ -184,8 +184,7 @@ void JavaScriptObject::defineNativeDeallocator(
184
184
  );
185
185
  globalRef->invoke(args);
186
186
  globalRef.reset();
187
- },
188
- "__expo_shared_object_deallocator__"
187
+ }
189
188
  );
190
189
  }
191
190
  } // namespace expo
@@ -37,7 +37,7 @@ public:
37
37
  static void registerNatives();
38
38
 
39
39
  static jni::local_ref<JavaScriptObject::javaobject> newInstance(
40
- JSIInteropModuleRegistry *jsiInteropModuleRegistry,
40
+ JSIContext *jsiContext,
41
41
  std::weak_ptr<JavaScriptRuntime> runtime,
42
42
  std::shared_ptr<jsi::Object> jsObject
43
43
  );
@@ -52,6 +52,8 @@ public:
52
52
  std::shared_ptr<jsi::Object> jsObject
53
53
  );
54
54
 
55
+ virtual ~JavaScriptObject() = default;
56
+
55
57
  std::shared_ptr<jsi::Object> get() override;
56
58
 
57
59
  /**
@@ -137,7 +139,7 @@ private:
137
139
  auto cName = name->toStdString();
138
140
  jsi::Object descriptor = preparePropertyDescriptor(jsRuntime, options);
139
141
  descriptor.setProperty(jsRuntime, "value", jsi_type_converter<T>::convert(jsRuntime, value));
140
- common::definePropertyOnJSIObject(jsRuntime, jsObject.get(), cName.c_str(), std::move(descriptor));
142
+ common::defineProperty(jsRuntime, jsObject.get(), cName.c_str(), std::move(descriptor));
141
143
  }
142
144
  };
143
145
  } // namespace expo