1879827bbSŁukasz Kosmaty // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2879827bbSŁukasz Kosmaty 
3879827bbSŁukasz Kosmaty #pragma once
4879827bbSŁukasz Kosmaty 
5879827bbSŁukasz Kosmaty #include "JSIObjectWrapper.h"
6879827bbSŁukasz Kosmaty #include "JavaScriptRuntime.h"
7879827bbSŁukasz Kosmaty #include "WeakRuntimeHolder.h"
8879827bbSŁukasz Kosmaty #include "types/ExpectedType.h"
9879827bbSŁukasz Kosmaty 
10879827bbSŁukasz Kosmaty #include <fbjni/fbjni.h>
11879827bbSŁukasz Kosmaty #include <jsi/jsi.h>
12879827bbSŁukasz Kosmaty 
13879827bbSŁukasz Kosmaty namespace jni = facebook::jni;
14879827bbSŁukasz Kosmaty namespace jsi = facebook::jsi;
15879827bbSŁukasz Kosmaty 
16879827bbSŁukasz Kosmaty namespace expo {
17879827bbSŁukasz Kosmaty 
18879827bbSŁukasz Kosmaty /**
19879827bbSŁukasz Kosmaty  * Represents any JavaScript function. Its purpose is to expose the `jsi::Function` API back to Kotlin.
20879827bbSŁukasz Kosmaty  */
21*29e8b6f8SŁukasz Kosmaty class JavaScriptFunction : public jni::HybridClass<JavaScriptFunction, Destructible>, JSIFunctionWrapper {
22879827bbSŁukasz Kosmaty public:
23879827bbSŁukasz Kosmaty   static auto constexpr
24879827bbSŁukasz Kosmaty     kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptFunction;";
25879827bbSŁukasz Kosmaty   static auto constexpr TAG = "JavaScriptFunction";
26879827bbSŁukasz Kosmaty 
27879827bbSŁukasz Kosmaty   static void registerNatives();
28879827bbSŁukasz Kosmaty 
29*29e8b6f8SŁukasz Kosmaty   static jni::local_ref<JavaScriptFunction::javaobject> newInstance(
30*29e8b6f8SŁukasz Kosmaty     JSIInteropModuleRegistry *jsiInteropModuleRegistry,
31*29e8b6f8SŁukasz Kosmaty     std::weak_ptr<JavaScriptRuntime> runtime,
32*29e8b6f8SŁukasz Kosmaty     std::shared_ptr<jsi::Function> jsFunction
33*29e8b6f8SŁukasz Kosmaty   );
34*29e8b6f8SŁukasz Kosmaty 
35879827bbSŁukasz Kosmaty   JavaScriptFunction(
36879827bbSŁukasz Kosmaty     std::weak_ptr<JavaScriptRuntime> runtime,
37879827bbSŁukasz Kosmaty     std::shared_ptr<jsi::Function> jsFunction
38879827bbSŁukasz Kosmaty   );
39879827bbSŁukasz Kosmaty 
40879827bbSŁukasz Kosmaty   JavaScriptFunction(
41879827bbSŁukasz Kosmaty     WeakRuntimeHolder runtime,
42879827bbSŁukasz Kosmaty     std::shared_ptr<jsi::Function> jsFunction
43879827bbSŁukasz Kosmaty   );
44879827bbSŁukasz Kosmaty 
45879827bbSŁukasz Kosmaty   std::shared_ptr<jsi::Function> get() override;
46879827bbSŁukasz Kosmaty 
47879827bbSŁukasz Kosmaty 
48879827bbSŁukasz Kosmaty private:
49879827bbSŁukasz Kosmaty   friend HybridBase;
50879827bbSŁukasz Kosmaty 
51879827bbSŁukasz Kosmaty   WeakRuntimeHolder runtimeHolder;
52879827bbSŁukasz Kosmaty   std::shared_ptr<jsi::Function> jsFunction;
53879827bbSŁukasz Kosmaty 
54879827bbSŁukasz Kosmaty   jobject invoke(
55879827bbSŁukasz Kosmaty     jni::alias_ref<jni::JArrayClass<jni::JObject>> args,
56879827bbSŁukasz Kosmaty     jni::alias_ref<ExpectedType::javaobject> expectedReturnType
57879827bbSŁukasz Kosmaty   );
58879827bbSŁukasz Kosmaty };
59879827bbSŁukasz Kosmaty 
60879827bbSŁukasz Kosmaty } // namespace expo
61