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