1a416e6dbSŁukasz Kosmaty // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2a416e6dbSŁukasz Kosmaty 
3a416e6dbSŁukasz Kosmaty #pragma once
4a416e6dbSŁukasz Kosmaty 
514c0f05dSŁukasz Kosmaty #include "JSIObjectWrapper.h"
6256b5942SŁukasz Kosmaty #include "WeakRuntimeHolder.h"
705c5e37dSŁukasz Kosmaty #include "JavaScriptTypedArray.h"
8*29e8b6f8SŁukasz Kosmaty #include "JNIDeallocator.h"
9a416e6dbSŁukasz Kosmaty 
10a416e6dbSŁukasz Kosmaty #include <fbjni/fbjni.h>
11a416e6dbSŁukasz Kosmaty #include <jsi/jsi.h>
12a416e6dbSŁukasz Kosmaty 
13a416e6dbSŁukasz Kosmaty #include <memory>
14a416e6dbSŁukasz Kosmaty 
15a416e6dbSŁukasz Kosmaty namespace jni = facebook::jni;
16a416e6dbSŁukasz Kosmaty namespace jsi = facebook::jsi;
17a416e6dbSŁukasz Kosmaty 
18a416e6dbSŁukasz Kosmaty namespace expo {
19a416e6dbSŁukasz Kosmaty class JavaScriptRuntime;
20a416e6dbSŁukasz Kosmaty 
2114c0f05dSŁukasz Kosmaty class JavaScriptObject;
2214c0f05dSŁukasz Kosmaty 
2305c5e37dSŁukasz Kosmaty class JavaScriptTypedArray;
2405c5e37dSŁukasz Kosmaty 
25879827bbSŁukasz Kosmaty class JavaScriptFunction;
26879827bbSŁukasz Kosmaty 
27a416e6dbSŁukasz Kosmaty /**
28a416e6dbSŁukasz Kosmaty  * Represents any JavaScript value. Its purpose is to expose the `jsi::Value` API back to Kotlin.
29a416e6dbSŁukasz Kosmaty  */
30*29e8b6f8SŁukasz Kosmaty class JavaScriptValue : public jni::HybridClass<JavaScriptValue, Destructible>, JSIValueWrapper {
31a416e6dbSŁukasz Kosmaty public:
32a416e6dbSŁukasz Kosmaty   static auto constexpr
33a416e6dbSŁukasz Kosmaty     kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptValue;";
34a416e6dbSŁukasz Kosmaty   static auto constexpr TAG = "JavaScriptValue";
35a416e6dbSŁukasz Kosmaty 
36a416e6dbSŁukasz Kosmaty   static void registerNatives();
37a416e6dbSŁukasz Kosmaty 
38*29e8b6f8SŁukasz Kosmaty   static jni::local_ref<JavaScriptValue::javaobject> newInstance(
39*29e8b6f8SŁukasz Kosmaty     JSIInteropModuleRegistry *jsiInteropModuleRegistry,
40*29e8b6f8SŁukasz Kosmaty     std::weak_ptr<JavaScriptRuntime> runtime,
41*29e8b6f8SŁukasz Kosmaty     std::shared_ptr<jsi::Value> jsValue
42*29e8b6f8SŁukasz Kosmaty   );
43*29e8b6f8SŁukasz Kosmaty 
44a416e6dbSŁukasz Kosmaty   JavaScriptValue(
45a416e6dbSŁukasz Kosmaty     std::weak_ptr<JavaScriptRuntime> runtime,
46a416e6dbSŁukasz Kosmaty     std::shared_ptr<jsi::Value> jsValue
47a416e6dbSŁukasz Kosmaty   );
48a416e6dbSŁukasz Kosmaty 
49256b5942SŁukasz Kosmaty   JavaScriptValue(
50256b5942SŁukasz Kosmaty     WeakRuntimeHolder runtime,
51256b5942SŁukasz Kosmaty     std::shared_ptr<jsi::Value> jsValue
52256b5942SŁukasz Kosmaty   );
53256b5942SŁukasz Kosmaty 
5414c0f05dSŁukasz Kosmaty   std::shared_ptr<jsi::Value> get() override;
5514c0f05dSŁukasz Kosmaty 
56a416e6dbSŁukasz Kosmaty   std::string kind();
57a416e6dbSŁukasz Kosmaty 
58a416e6dbSŁukasz Kosmaty   bool isNull();
5914c0f05dSŁukasz Kosmaty 
60a416e6dbSŁukasz Kosmaty   bool isUndefined();
6114c0f05dSŁukasz Kosmaty 
62a416e6dbSŁukasz Kosmaty   bool isBool();
6314c0f05dSŁukasz Kosmaty 
64a416e6dbSŁukasz Kosmaty   bool isNumber();
6514c0f05dSŁukasz Kosmaty 
66a416e6dbSŁukasz Kosmaty   bool isString();
6714c0f05dSŁukasz Kosmaty 
68a416e6dbSŁukasz Kosmaty   bool isSymbol();
6914c0f05dSŁukasz Kosmaty 
70a416e6dbSŁukasz Kosmaty   bool isFunction();
7114c0f05dSŁukasz Kosmaty 
724b11e9d6SŁukasz Kosmaty   bool isArray();
734b11e9d6SŁukasz Kosmaty 
74a416e6dbSŁukasz Kosmaty   bool isObject();
75a416e6dbSŁukasz Kosmaty 
7605c5e37dSŁukasz Kosmaty   bool isTypedArray();
7705c5e37dSŁukasz Kosmaty 
78a416e6dbSŁukasz Kosmaty   bool getBool();
7914c0f05dSŁukasz Kosmaty 
80a416e6dbSŁukasz Kosmaty   double getDouble();
8114c0f05dSŁukasz Kosmaty 
82a416e6dbSŁukasz Kosmaty   std::string getString();
8314c0f05dSŁukasz Kosmaty 
84*29e8b6f8SŁukasz Kosmaty   jni::local_ref<jni::HybridClass<JavaScriptObject, Destructible>::javaobject> getObject();
85a416e6dbSŁukasz Kosmaty 
864b11e9d6SŁukasz Kosmaty   jni::local_ref<jni::JArrayClass<JavaScriptValue::javaobject>> getArray();
874b11e9d6SŁukasz Kosmaty 
8805c5e37dSŁukasz Kosmaty   jni::local_ref<JavaScriptTypedArray::javaobject> getTypedArray();
8905c5e37dSŁukasz Kosmaty 
90*29e8b6f8SŁukasz Kosmaty   jni::local_ref<jni::HybridClass<JavaScriptFunction, Destructible>::javaobject> jniGetFunction();
91879827bbSŁukasz Kosmaty 
92a416e6dbSŁukasz Kosmaty private:
93a416e6dbSŁukasz Kosmaty   friend HybridBase;
9414c0f05dSŁukasz Kosmaty 
95256b5942SŁukasz Kosmaty   WeakRuntimeHolder runtimeHolder;
96a416e6dbSŁukasz Kosmaty   std::shared_ptr<jsi::Value> jsValue;
97a416e6dbSŁukasz Kosmaty 
98a416e6dbSŁukasz Kosmaty   jni::local_ref<jstring> jniKind();
9914c0f05dSŁukasz Kosmaty 
100a416e6dbSŁukasz Kosmaty   jni::local_ref<jstring> jniGetString();
101a416e6dbSŁukasz Kosmaty };
102a416e6dbSŁukasz Kosmaty } // namespace expo
103