expo-modules-core 0.9.2 → 0.11.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 (193) hide show
  1. package/CHANGELOG.md +33 -3
  2. package/README.md +3 -3
  3. package/android/CMakeLists.txt +163 -0
  4. package/android/build.gradle +343 -5
  5. package/android/src/main/cpp/CachedReferencesRegistry.cpp +65 -0
  6. package/android/src/main/cpp/CachedReferencesRegistry.h +80 -0
  7. package/android/src/main/cpp/Exceptions.cpp +22 -0
  8. package/android/src/main/cpp/Exceptions.h +38 -0
  9. package/android/src/main/cpp/ExpoModulesHostObject.cpp +47 -0
  10. package/android/src/main/cpp/ExpoModulesHostObject.h +32 -0
  11. package/android/src/main/cpp/JNIFunctionBody.cpp +44 -0
  12. package/android/src/main/cpp/JNIFunctionBody.h +50 -0
  13. package/android/src/main/cpp/JNIInjector.cpp +23 -0
  14. package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +122 -0
  15. package/android/src/main/cpp/JSIInteropModuleRegistry.h +96 -0
  16. package/android/src/main/cpp/JSIObjectWrapper.h +33 -0
  17. package/android/src/main/cpp/JSITypeConverter.h +84 -0
  18. package/android/src/main/cpp/JavaScriptModuleObject.cpp +219 -0
  19. package/android/src/main/cpp/JavaScriptModuleObject.h +144 -0
  20. package/android/src/main/cpp/JavaScriptObject.cpp +125 -0
  21. package/android/src/main/cpp/JavaScriptObject.h +131 -0
  22. package/android/src/main/cpp/JavaScriptRuntime.cpp +127 -0
  23. package/android/src/main/cpp/JavaScriptRuntime.h +87 -0
  24. package/android/src/main/cpp/JavaScriptValue.cpp +172 -0
  25. package/android/src/main/cpp/JavaScriptValue.h +78 -0
  26. package/android/src/main/cpp/MethodMetadata.cpp +340 -0
  27. package/android/src/main/cpp/MethodMetadata.h +131 -0
  28. package/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +2 -0
  29. package/android/src/main/java/expo/modules/core/errors/ContextDestroyedException.kt +7 -0
  30. package/android/src/main/java/expo/modules/interfaces/permissions/Permissions.java +30 -0
  31. package/android/src/main/java/expo/modules/kotlin/AppContext.kt +98 -3
  32. package/android/src/main/java/expo/modules/kotlin/ConcatIterator.kt +18 -0
  33. package/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt +15 -12
  34. package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +45 -3
  35. package/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAware.kt +49 -0
  36. package/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAwareHelper.kt +43 -0
  37. package/android/src/main/java/expo/modules/kotlin/activityaware/OnActivityAvailableListener.kt +18 -0
  38. package/android/src/main/java/expo/modules/kotlin/activityresult/ActivityResultsManager.kt +99 -0
  39. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultCaller.kt +25 -0
  40. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultContract.kt +27 -0
  41. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultFallbackCallback.kt +17 -0
  42. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultLauncher.kt +30 -0
  43. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultRegistry.kt +358 -0
  44. package/android/src/main/java/expo/modules/kotlin/activityresult/DataPersistor.kt +135 -0
  45. package/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt +2 -2
  46. package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +13 -0
  47. package/android/src/main/java/expo/modules/kotlin/exception/ExceptionDecorator.kt +2 -0
  48. package/android/src/main/java/expo/modules/kotlin/functions/AnyFunction.kt +53 -15
  49. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunction.kt +35 -7
  50. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt +13 -121
  51. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionComponent.kt +21 -0
  52. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionWithPromiseComponent.kt +21 -0
  53. package/android/src/main/java/expo/modules/kotlin/functions/SuspendFunctionComponent.kt +63 -0
  54. package/android/src/main/java/expo/modules/kotlin/functions/SyncFunctionComponent.kt +36 -0
  55. package/android/src/main/java/expo/modules/kotlin/jni/CppType.kt +19 -0
  56. package/android/src/main/java/expo/modules/kotlin/jni/JNIFunctionBody.kt +39 -0
  57. package/android/src/main/java/expo/modules/kotlin/jni/JSIInteropModuleRegistry.kt +89 -0
  58. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +46 -0
  59. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +113 -0
  60. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +35 -0
  61. package/android/src/main/java/expo/modules/kotlin/modules/Module.kt +16 -6
  62. package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt +5 -500
  63. package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionData.kt +30 -5
  64. package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +271 -0
  65. package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionData.kt +21 -0
  66. package/android/src/main/java/expo/modules/kotlin/objects/PropertyComponent.kt +54 -0
  67. package/android/src/main/java/expo/modules/kotlin/objects/PropertyComponentBuilder.kt +32 -0
  68. package/android/src/main/java/expo/modules/kotlin/providers/AppContextProvider.kt +14 -0
  69. package/android/src/main/java/expo/modules/kotlin/providers/CurrentActivityProvider.kt +22 -0
  70. package/android/src/main/java/expo/modules/kotlin/records/RecordTypeConverter.kt +19 -2
  71. package/android/src/main/java/expo/modules/kotlin/types/AnyType.kt +3 -2
  72. package/android/src/main/java/expo/modules/kotlin/types/AnyTypeConverter.kt +36 -0
  73. package/android/src/main/java/expo/modules/kotlin/types/ArrayTypeConverter.kt +7 -2
  74. package/android/src/main/java/expo/modules/kotlin/types/BasicTypeConverters.kt +68 -20
  75. package/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt +50 -22
  76. package/android/src/main/java/expo/modules/kotlin/types/ListTypeConverter.kt +18 -2
  77. package/android/src/main/java/expo/modules/kotlin/types/MapTypeConverter.kt +18 -2
  78. package/android/src/main/java/expo/modules/kotlin/types/PairTypeConverter.kt +17 -2
  79. package/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt +43 -3
  80. package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +12 -0
  81. package/android/src/main/java/expo/modules/kotlin/views/ViewGroupDefinitionBuilder.kt +0 -41
  82. package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinitionBuilder.kt +0 -33
  83. package/build/NativeModulesProxy.native.d.ts.map +1 -1
  84. package/build/NativeModulesProxy.native.js +9 -3
  85. package/build/NativeModulesProxy.native.js.map +1 -1
  86. package/build/PermissionsInterface.d.ts +29 -0
  87. package/build/PermissionsInterface.d.ts.map +1 -1
  88. package/build/PermissionsInterface.js +9 -0
  89. package/build/PermissionsInterface.js.map +1 -1
  90. package/ios/AppDelegates/EXAppDelegatesLoader.m +1 -2
  91. package/ios/ExpoModulesCore.podspec +3 -2
  92. package/ios/JSI/EXJSIConversions.mm +6 -0
  93. package/ios/JSI/EXJSIInstaller.h +15 -21
  94. package/ios/JSI/EXJSIInstaller.mm +39 -3
  95. package/ios/JSI/EXJSIUtils.h +48 -3
  96. package/ios/JSI/EXJSIUtils.mm +88 -4
  97. package/ios/JSI/EXJavaScriptObject.h +11 -18
  98. package/ios/JSI/EXJavaScriptObject.mm +37 -18
  99. package/ios/JSI/EXJavaScriptRuntime.h +43 -9
  100. package/ios/JSI/EXJavaScriptRuntime.mm +70 -27
  101. package/ios/JSI/EXJavaScriptTypedArray.h +30 -0
  102. package/ios/JSI/EXJavaScriptTypedArray.mm +29 -0
  103. package/ios/JSI/EXJavaScriptValue.h +3 -2
  104. package/ios/JSI/EXJavaScriptValue.mm +17 -20
  105. package/ios/JSI/EXJavaScriptWeakObject.h +23 -0
  106. package/ios/JSI/EXJavaScriptWeakObject.mm +53 -0
  107. package/ios/JSI/EXObjectDeallocator.h +27 -0
  108. package/ios/JSI/ExpoModulesHostObject.h +3 -3
  109. package/ios/JSI/ExpoModulesHostObject.mm +4 -4
  110. package/ios/JSI/JavaScriptRuntime.swift +38 -1
  111. package/ios/JSI/JavaScriptValue.swift +7 -0
  112. package/ios/JSI/TypedArray.cpp +67 -0
  113. package/ios/JSI/TypedArray.h +46 -0
  114. package/ios/ModuleRegistryAdapter/EXModuleRegistryAdapter.m +0 -11
  115. package/ios/NativeModulesProxy/EXNativeModulesProxy.h +17 -10
  116. package/ios/NativeModulesProxy/EXNativeModulesProxy.mm +86 -77
  117. package/ios/NativeModulesProxy/NativeModulesProxyModule.swift +17 -0
  118. package/ios/Services/EXReactNativeEventEmitter.h +2 -2
  119. package/ios/Services/EXReactNativeEventEmitter.m +11 -6
  120. package/ios/Swift/AppContext.swift +206 -28
  121. package/ios/Swift/Arguments/AnyArgument.swift +18 -0
  122. package/ios/Swift/Arguments/{Types/EnumArgumentType.swift → EnumArgument.swift} +2 -17
  123. package/ios/Swift/Classes/ClassComponent.swift +95 -0
  124. package/ios/Swift/Classes/ClassComponentElement.swift +33 -0
  125. package/ios/Swift/Classes/ClassComponentElementsBuilder.swift +34 -0
  126. package/ios/Swift/Classes/ClassComponentFactories.swift +96 -0
  127. package/ios/Swift/DynamicTypes/AnyDynamicType.swift +44 -0
  128. package/ios/Swift/DynamicTypes/DynamicArrayType.swift +56 -0
  129. package/ios/Swift/DynamicTypes/DynamicConvertibleType.swift +27 -0
  130. package/ios/Swift/DynamicTypes/DynamicEnumType.swift +27 -0
  131. package/ios/Swift/DynamicTypes/DynamicOptionalType.swift +63 -0
  132. package/ios/Swift/DynamicTypes/DynamicRawType.swift +33 -0
  133. package/ios/Swift/DynamicTypes/DynamicSharedObjectType.swift +37 -0
  134. package/ios/Swift/DynamicTypes/DynamicType.swift +39 -0
  135. package/ios/Swift/DynamicTypes/DynamicTypedArrayType.swift +46 -0
  136. package/ios/Swift/Exceptions/ChainableException.swift +3 -3
  137. package/ios/Swift/Exceptions/CodedError.swift +1 -1
  138. package/ios/Swift/Exceptions/Exception.swift +8 -6
  139. package/ios/Swift/Exceptions/UnexpectedException.swift +2 -1
  140. package/ios/Swift/ExpoBridgeModule.m +5 -0
  141. package/ios/Swift/ExpoBridgeModule.swift +79 -0
  142. package/ios/Swift/Functions/AnyFunction.swift +33 -31
  143. package/ios/Swift/Functions/AsyncFunctionComponent.swift +196 -59
  144. package/ios/Swift/Functions/SyncFunctionComponent.swift +142 -58
  145. package/ios/Swift/JavaScriptUtils.swift +32 -57
  146. package/ios/Swift/Logging/LogHandlers.swift +39 -0
  147. package/ios/Swift/Logging/LogType.swift +62 -0
  148. package/ios/Swift/Logging/Logger.swift +201 -0
  149. package/ios/Swift/ModuleHolder.swift +19 -54
  150. package/ios/Swift/ModuleRegistry.swift +7 -1
  151. package/ios/Swift/Modules/AnyModule.swift +3 -3
  152. package/ios/Swift/ModulesProvider.swift +2 -0
  153. package/ios/Swift/Objects/JavaScriptObjectBuilder.swift +37 -0
  154. package/ios/Swift/Objects/ObjectDefinition.swift +74 -1
  155. package/ios/Swift/Objects/ObjectDefinitionComponents.swift +77 -68
  156. package/ios/Swift/Objects/PropertyComponent.swift +147 -0
  157. package/ios/Swift/Promise.swift +17 -4
  158. package/ios/Swift/Records/Field.swift +2 -2
  159. package/ios/Swift/SharedObjects/SharedObject.swift +20 -0
  160. package/ios/Swift/SharedObjects/SharedObjectRegistry.swift +129 -0
  161. package/ios/Swift/TypedArrays/AnyTypedArray.swift +11 -0
  162. package/ios/Swift/TypedArrays/ConcreteTypedArrays.swift +56 -0
  163. package/ios/Swift/TypedArrays/GenericTypedArray.swift +49 -0
  164. package/ios/Swift/TypedArrays/TypedArray.swift +80 -0
  165. package/ios/Swift/Utilities.swift +28 -0
  166. package/ios/Swift/Views/ConcreteViewProp.swift +3 -3
  167. package/ios/Swift/Views/ViewManagerDefinitionComponents.swift +2 -2
  168. package/ios/Tests/ClassComponentSpec.swift +210 -0
  169. package/ios/Tests/DynamicTypeSpec.swift +336 -0
  170. package/ios/Tests/EnumArgumentSpec.swift +48 -0
  171. package/ios/Tests/ExpoModulesSpec.swift +17 -3
  172. package/ios/Tests/FunctionSpec.swift +167 -118
  173. package/ios/Tests/Mocks/ModuleMocks.swift +1 -1
  174. package/ios/Tests/PropertyComponentSpec.swift +95 -0
  175. package/ios/Tests/SharedObjectRegistrySpec.swift +109 -0
  176. package/ios/Tests/TypedArraysSpec.swift +136 -0
  177. package/package.json +2 -2
  178. package/src/NativeModulesProxy.native.ts +13 -3
  179. package/src/PermissionsInterface.ts +29 -0
  180. package/src/ts-declarations/ExpoModules.d.ts +7 -0
  181. package/tsconfig.json +1 -1
  182. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionWithPromise.kt +0 -15
  183. package/android/src/main/java/expo/modules/kotlin/functions/AsyncSuspendFunction.kt +0 -36
  184. package/ios/Swift/Arguments/AnyArgumentType.swift +0 -13
  185. package/ios/Swift/Arguments/ArgumentType.swift +0 -28
  186. package/ios/Swift/Arguments/Types/ArrayArgumentType.swift +0 -42
  187. package/ios/Swift/Arguments/Types/ConvertibleArgumentType.swift +0 -16
  188. package/ios/Swift/Arguments/Types/OptionalArgumentType.swift +0 -49
  189. package/ios/Swift/Arguments/Types/PromiseArgumentType.swift +0 -15
  190. package/ios/Swift/Arguments/Types/RawArgumentType.swift +0 -25
  191. package/ios/Swift/Functions/ConcreteFunction.swift +0 -103
  192. package/ios/Swift/SwiftInteropBridge.swift +0 -155
  193. package/ios/Tests/ArgumentTypeSpec.swift +0 -143
@@ -0,0 +1,127 @@
1
+ // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
+
3
+ #include "JavaScriptRuntime.h"
4
+ #include "JavaScriptValue.h"
5
+ #include "JavaScriptObject.h"
6
+ #include "Exceptions.h"
7
+
8
+ #if FOR_HERMES
9
+
10
+ #include <hermes/hermes.h>
11
+
12
+ #include <utility>
13
+
14
+ #else
15
+
16
+ #include <jsi/JSCRuntime.h>
17
+
18
+ #endif
19
+
20
+ namespace jsi = facebook::jsi;
21
+
22
+ namespace expo {
23
+
24
+ void SyncCallInvoker::invokeAsync(std::function<void()> &&func) {
25
+ func();
26
+ }
27
+
28
+ void SyncCallInvoker::invokeSync(std::function<void()> &&func) {
29
+ func();
30
+ }
31
+
32
+ JavaScriptRuntime::JavaScriptRuntime()
33
+ : jsInvoker(std::make_shared<SyncCallInvoker>()),
34
+ nativeInvoker(std::make_shared<SyncCallInvoker>()) {
35
+ #if FOR_HERMES
36
+ auto config = ::hermes::vm::RuntimeConfig::Builder()
37
+ .withEnableSampleProfiling(false);
38
+ runtime = facebook::hermes::makeHermesRuntime(config.build());
39
+
40
+ // This version of the Hermes uses a Promise implementation that is provided by the RN.
41
+ // The `setImmediate` function isn't defined, but is required by the Promise implementation.
42
+ // That's why we inject it here.
43
+ auto setImmediatePropName = jsi::PropNameID::forUtf8(*runtime, "setImmediate");
44
+ runtime->global().setProperty(
45
+ *runtime,
46
+ setImmediatePropName,
47
+ jsi::Function::createFromHostFunction(
48
+ *runtime,
49
+ setImmediatePropName,
50
+ 1,
51
+ [](jsi::Runtime &rt,
52
+ const jsi::Value &thisVal,
53
+ const jsi::Value *args,
54
+ size_t count) {
55
+ args[0].asObject(rt).asFunction(rt).call(rt);
56
+ return jsi::Value::undefined();
57
+ }
58
+ )
59
+ );
60
+ #else
61
+ runtime = facebook::jsc::makeJSCRuntime();
62
+ #endif
63
+
64
+ // By default "global" property isn't set.
65
+ runtime->global().setProperty(
66
+ *runtime,
67
+ jsi::PropNameID::forUtf8(*runtime, "global"),
68
+ runtime->global()
69
+ );
70
+ }
71
+
72
+ JavaScriptRuntime::JavaScriptRuntime(
73
+ jsi::Runtime *runtime,
74
+ std::shared_ptr<react::CallInvoker> jsInvoker,
75
+ std::shared_ptr<react::CallInvoker> nativeInvoker
76
+ ) : jsInvoker(std::move(jsInvoker)), nativeInvoker(std::move(nativeInvoker)) {
77
+ // Creating a shared pointer that points to the runtime but doesn't own it, thus doesn't release it.
78
+ // In this code flow, the runtime should be owned by something else like the CatalystInstance.
79
+ // See explanation for constructor (8): https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
80
+ this->runtime = std::shared_ptr<jsi::Runtime>(std::shared_ptr<jsi::Runtime>(), runtime);
81
+ }
82
+
83
+ jsi::Runtime *JavaScriptRuntime::get() {
84
+ return runtime.get();
85
+ }
86
+
87
+ jni::local_ref<JavaScriptValue::javaobject>
88
+ JavaScriptRuntime::evaluateScript(const std::string &script) {
89
+ auto scriptBuffer = std::make_shared<jsi::StringBuffer>(script);
90
+ std::shared_ptr<jsi::Value> result;
91
+ try {
92
+ result = std::make_shared<jsi::Value>(
93
+ runtime->evaluateJavaScript(scriptBuffer, "<<evaluated>>")
94
+ );
95
+ } catch (const jsi::JSError &error) {
96
+ jni::throwNewJavaException(
97
+ JavaScriptEvaluateException::create(
98
+ error.getMessage(),
99
+ error.getStack()
100
+ ).get()
101
+ );
102
+ } catch (const jsi::JSIException &error) {
103
+ jni::throwNewJavaException(
104
+ JavaScriptEvaluateException::create(
105
+ error.what(),
106
+ ""
107
+ ).get()
108
+ );
109
+ }
110
+
111
+ return JavaScriptValue::newObjectCxxArgs(weak_from_this(), result);
112
+ }
113
+
114
+ jni::local_ref<JavaScriptObject::javaobject> JavaScriptRuntime::global() {
115
+ auto global = std::make_shared<jsi::Object>(runtime->global());
116
+ return JavaScriptObject::newObjectCxxArgs(weak_from_this(), global);
117
+ }
118
+
119
+ jni::local_ref<JavaScriptObject::javaobject> JavaScriptRuntime::createObject() {
120
+ auto newObject = std::make_shared<jsi::Object>(*runtime);
121
+ return JavaScriptObject::newObjectCxxArgs(weak_from_this(), newObject);
122
+ }
123
+
124
+ void JavaScriptRuntime::drainJSEventLoop() {
125
+ while (!runtime->drainMicrotasks()) {}
126
+ }
127
+ } // namespace expo
@@ -0,0 +1,87 @@
1
+ // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
+
3
+ #pragma once
4
+
5
+ #include <jsi/jsi.h>
6
+ #include <fbjni/fbjni.h>
7
+ #include <ReactCommon/CallInvoker.h>
8
+
9
+ namespace jsi = facebook::jsi;
10
+ namespace jni = facebook::jni;
11
+ namespace react = facebook::react;
12
+
13
+ namespace expo {
14
+ class JavaScriptValue;
15
+
16
+ class JavaScriptObject;
17
+
18
+ /**
19
+ * Dummy CallInvoker that invokes everything immediately.
20
+ * Used in the test environment to check the async flow.
21
+ */
22
+ class SyncCallInvoker : public react::CallInvoker {
23
+ public:
24
+ void invokeAsync(std::function<void()> &&func) override;
25
+
26
+ void invokeSync(std::function<void()> &&func) override;
27
+
28
+ ~SyncCallInvoker() override = default;
29
+ };
30
+
31
+ /**
32
+ * A wrapper for the jsi::Runtime.
33
+ * This class is used as a bridge between CPP and Kotlin and to encapsulate common runtime helper functions.
34
+ *
35
+ * Instances of this class should be managed using a shared smart pointer.
36
+ * To pass runtime information to all of `JavaScriptValue` and `JavaScriptObject` we use `weak_from_this()`
37
+ * that requires that the object is held via a smart pointer. Otherwise, `weak_from_this()` returns `nullptr`.
38
+ */
39
+ class JavaScriptRuntime : public std::enable_shared_from_this<JavaScriptRuntime> {
40
+ public:
41
+ /**
42
+ * Initializes a runtime that is independent from React Native and its runtime initialization.
43
+ * This flow is mostly intended for tests. The JS call invoker is set to `SyncCallInvoker`.
44
+ */
45
+ JavaScriptRuntime();
46
+
47
+ JavaScriptRuntime(
48
+ jsi::Runtime *runtime,
49
+ std::shared_ptr<react::CallInvoker> jsInvoker,
50
+ std::shared_ptr<react::CallInvoker> nativeInvoker
51
+ );
52
+
53
+ /**
54
+ * Returns the underlying runtime object.
55
+ */
56
+ jsi::Runtime *get();
57
+
58
+ /**
59
+ * Evaluates given JavaScript source code.
60
+ * @throws if the input format is unknown, or evaluation causes an error,
61
+ * a jni::JniException<JavaScriptEvaluateException> will be thrown.
62
+ */
63
+ jni::local_ref<jni::HybridClass<JavaScriptValue>::javaobject> evaluateScript(
64
+ const std::string &script
65
+ );
66
+
67
+ /**
68
+ * Returns the runtime global object for use in Kotlin.
69
+ */
70
+ jni::local_ref<jni::HybridClass<JavaScriptObject>::javaobject> global();
71
+
72
+ /**
73
+ * Creates a new object for use in Kotlin.
74
+ */
75
+ jni::local_ref<jni::HybridClass<JavaScriptObject>::javaobject> createObject();
76
+
77
+ /**
78
+ * Drains the JavaScript VM internal Microtask (a.k.a. event loop) queue.
79
+ */
80
+ void drainJSEventLoop();
81
+
82
+ std::shared_ptr<react::CallInvoker> jsInvoker;
83
+ std::shared_ptr<react::CallInvoker> nativeInvoker;
84
+ private:
85
+ std::shared_ptr<jsi::Runtime> runtime;
86
+ };
87
+ } // namespace expo
@@ -0,0 +1,172 @@
1
+ // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
+
3
+ #include "JavaScriptValue.h"
4
+
5
+ #include "JavaScriptRuntime.h"
6
+ #include "JavaScriptObject.h"
7
+
8
+ namespace expo {
9
+ void JavaScriptValue::registerNatives() {
10
+ registerHybrid({
11
+ makeNativeMethod("kind", JavaScriptValue::jniKind),
12
+ makeNativeMethod("isNull", JavaScriptValue::isNull),
13
+ makeNativeMethod("isUndefined", JavaScriptValue::isUndefined),
14
+ makeNativeMethod("isBool", JavaScriptValue::isBool),
15
+ makeNativeMethod("isNumber", JavaScriptValue::isNumber),
16
+ makeNativeMethod("isString", JavaScriptValue::isString),
17
+ makeNativeMethod("isSymbol", JavaScriptValue::isSymbol),
18
+ makeNativeMethod("isFunction", JavaScriptValue::isFunction),
19
+ makeNativeMethod("isArray", JavaScriptValue::isArray),
20
+ makeNativeMethod("isObject", JavaScriptValue::isObject),
21
+ makeNativeMethod("getBool", JavaScriptValue::getBool),
22
+ makeNativeMethod("getDouble", JavaScriptValue::getDouble),
23
+ makeNativeMethod("getString", JavaScriptValue::jniGetString),
24
+ makeNativeMethod("getObject", JavaScriptValue::getObject),
25
+ makeNativeMethod("getArray", JavaScriptValue::getArray),
26
+ });
27
+ }
28
+
29
+ JavaScriptValue::JavaScriptValue(
30
+ std::weak_ptr<JavaScriptRuntime> runtime,
31
+ std::shared_ptr<jsi::Value> jsValue
32
+ ) : runtimeHolder(std::move(runtime)), jsValue(std::move(jsValue)) {
33
+ assert(runtimeHolder.lock() != nullptr);
34
+ }
35
+
36
+ std::shared_ptr<jsi::Value> JavaScriptValue::get() {
37
+ return jsValue;
38
+ }
39
+
40
+ std::string JavaScriptValue::kind() {
41
+ if (isNull()) {
42
+ return "null";
43
+ }
44
+ if (isUndefined()) {
45
+ return "undefined";
46
+ }
47
+ if (isBool()) {
48
+ return "boolean";
49
+ }
50
+ if (isNumber()) {
51
+ return "number";
52
+ }
53
+ if (isString()) {
54
+ return "string";
55
+ }
56
+ if (isSymbol()) {
57
+ return "symbol";
58
+ }
59
+ if (isFunction()) {
60
+ return "function";
61
+ }
62
+ if (isArray()) {
63
+ return "array";
64
+ }
65
+ if (isObject()) {
66
+ return "object";
67
+ }
68
+
69
+ // TODO(@lukmccall): maybe throw exception?
70
+ return "unknown";
71
+ }
72
+
73
+ bool JavaScriptValue::isNull() {
74
+ return jsValue->isNull();
75
+ }
76
+
77
+ bool JavaScriptValue::isUndefined() {
78
+ return jsValue->isUndefined();
79
+ }
80
+
81
+ bool JavaScriptValue::isBool() {
82
+ return jsValue->isBool();
83
+ }
84
+
85
+ bool JavaScriptValue::isNumber() {
86
+ return jsValue->isNumber();
87
+ }
88
+
89
+ bool JavaScriptValue::isString() {
90
+ return jsValue->isString();
91
+ }
92
+
93
+ bool JavaScriptValue::isSymbol() {
94
+ return jsValue->isSymbol();
95
+ }
96
+
97
+ bool JavaScriptValue::isFunction() {
98
+ if (jsValue->isObject()) {
99
+ auto runtime = runtimeHolder.lock();
100
+ assert(runtime != nullptr);
101
+ return jsValue->asObject(*runtime->get()).isFunction(*runtime->get());
102
+ }
103
+
104
+ return false;
105
+ }
106
+
107
+ bool JavaScriptValue::isArray() {
108
+ if (jsValue->isObject()) {
109
+ auto runtime = runtimeHolder.lock();
110
+ assert(runtime != nullptr);
111
+ return jsValue->asObject(*runtime->get()).isArray(*runtime->get());
112
+ }
113
+
114
+ return false;
115
+ }
116
+
117
+ bool JavaScriptValue::isObject() {
118
+ return jsValue->isObject();
119
+ }
120
+
121
+ bool JavaScriptValue::getBool() {
122
+ return jsValue->getBool();
123
+ }
124
+
125
+ double JavaScriptValue::getDouble() {
126
+ return jsValue->getNumber();
127
+ }
128
+
129
+ std::string JavaScriptValue::getString() {
130
+ auto runtime = runtimeHolder.lock();
131
+ assert(runtime != nullptr);
132
+ return jsValue->getString(*runtime->get()).utf8(*runtime->get());
133
+ }
134
+
135
+ jni::local_ref<JavaScriptObject::javaobject> JavaScriptValue::getObject() {
136
+ auto runtime = runtimeHolder.lock();
137
+ assert(runtime != nullptr);
138
+ auto jsObject = std::make_shared<jsi::Object>(jsValue->getObject(*runtime->get()));
139
+ return JavaScriptObject::newObjectCxxArgs(runtimeHolder, jsObject);
140
+ }
141
+
142
+ jni::local_ref<jni::JArrayClass<JavaScriptValue::javaobject>> JavaScriptValue::getArray() {
143
+ auto runtime = runtimeHolder.lock();
144
+ assert(runtime != nullptr);
145
+
146
+ auto jsArray = jsValue
147
+ ->getObject(*runtime->get())
148
+ .asArray(*runtime->get());
149
+ size_t size = jsArray.size(*runtime->get());
150
+
151
+ auto result = jni::JArrayClass<JavaScriptValue::javaobject>::newArray(size);
152
+ for (size_t i = 0; i < size; i++) {
153
+ auto element = JavaScriptValue::newObjectCxxArgs(
154
+ runtimeHolder,
155
+ std::make_shared<jsi::Value>(jsArray.getValueAtIndex(*runtime->get(), i))
156
+ );
157
+
158
+ result->setElement(i, element.release());
159
+ }
160
+ return result;
161
+ }
162
+
163
+ jni::local_ref<jstring> JavaScriptValue::jniKind() {
164
+ auto result = kind();
165
+ return jni::make_jstring(result);
166
+ }
167
+
168
+ jni::local_ref<jstring> JavaScriptValue::jniGetString() {
169
+ auto result = getString();
170
+ return jni::make_jstring(result);
171
+ }
172
+ } // namespace expo
@@ -0,0 +1,78 @@
1
+ // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
+
3
+ #pragma once
4
+
5
+ #include "JSIObjectWrapper.h"
6
+
7
+ #include <fbjni/fbjni.h>
8
+ #include <jsi/jsi.h>
9
+
10
+ #include <memory>
11
+
12
+ namespace jni = facebook::jni;
13
+ namespace jsi = facebook::jsi;
14
+
15
+ namespace expo {
16
+ class JavaScriptRuntime;
17
+
18
+ class JavaScriptObject;
19
+
20
+ /**
21
+ * Represents any JavaScript value. Its purpose is to expose the `jsi::Value` API back to Kotlin.
22
+ */
23
+ class JavaScriptValue : public jni::HybridClass<JavaScriptValue>, JSIValueWrapper {
24
+ public:
25
+ static auto constexpr
26
+ kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptValue;";
27
+ static auto constexpr TAG = "JavaScriptValue";
28
+
29
+ static void registerNatives();
30
+
31
+ JavaScriptValue(
32
+ std::weak_ptr<JavaScriptRuntime> runtime,
33
+ std::shared_ptr<jsi::Value> jsValue
34
+ );
35
+
36
+ std::shared_ptr<jsi::Value> get() override;
37
+
38
+ std::string kind();
39
+
40
+ bool isNull();
41
+
42
+ bool isUndefined();
43
+
44
+ bool isBool();
45
+
46
+ bool isNumber();
47
+
48
+ bool isString();
49
+
50
+ bool isSymbol();
51
+
52
+ bool isFunction();
53
+
54
+ bool isArray();
55
+
56
+ bool isObject();
57
+
58
+ bool getBool();
59
+
60
+ double getDouble();
61
+
62
+ std::string getString();
63
+
64
+ jni::local_ref<jni::HybridClass<JavaScriptObject>::javaobject> getObject();
65
+
66
+ jni::local_ref<jni::JArrayClass<JavaScriptValue::javaobject>> getArray();
67
+
68
+ private:
69
+ friend HybridBase;
70
+
71
+ std::weak_ptr<JavaScriptRuntime> runtimeHolder;
72
+ std::shared_ptr<jsi::Value> jsValue;
73
+
74
+ jni::local_ref<jstring> jniKind();
75
+
76
+ jni::local_ref<jstring> jniGetString();
77
+ };
78
+ } // namespace expo