1 // Copyright 2018-present 650 Industries. All rights reserved.
2 
3 #import <ExpoModulesCore/EXJavaScriptValue.h>
4 #import <ExpoModulesCore/EXJavaScriptObject.h>
5 
6 #ifdef __cplusplus
7 #import <ReactCommon/CallInvoker.h>
8 
9 namespace jsi = facebook::jsi;
10 namespace react = facebook::react;
11 #endif // __cplusplus
12 
13 @class EXJavaScriptValue;
14 @class EXJavaScriptObject;
15 
16 #ifdef __cplusplus
17 typedef jsi::Value (^JSHostFunctionBlock)(jsi::Runtime &runtime, std::shared_ptr<react::CallInvoker> callInvoker, NSArray<EXJavaScriptValue *> * _Nonnull arguments);
18 #endif // __cplusplus
19 
20 NS_SWIFT_NAME(JavaScriptRuntime)
21 @interface EXJavaScriptRuntime : NSObject
22 
23 /**
24  Creates a new JavaScript runtime.
25  */
26 - (nonnull instancetype)init;
27 
28 #ifdef __cplusplus
29 - (nonnull instancetype)initWithRuntime:(nonnull jsi::Runtime *)runtime
30                             callInvoker:(std::shared_ptr<react::CallInvoker>)callInvoker;
31 
32 /**
33  Returns the underlying runtime object.
34  */
35 - (nonnull jsi::Runtime *)get;
36 
37 /**
38  Returns the call invoker the runtime was initialized with.
39  */
40 - (std::shared_ptr<react::CallInvoker>)callInvoker;
41 
42 /**
43  Wraps given host object to `EXJavaScriptObject`.
44  */
45 - (nonnull EXJavaScriptObject *)createHostObject:(std::shared_ptr<jsi::HostObject>)jsiHostObjectPtr;
46 
47 - (jsi::Function)createSyncFunction:(nonnull NSString *)name
48                           argsCount:(NSInteger)argsCount
49                               block:(nonnull JSSyncFunctionBlock)block;
50 
51 - (jsi::Function)createAsyncFunction:(nonnull NSString *)name
52                            argsCount:(NSInteger)argsCount
53                                block:(nonnull JSAsyncFunctionBlock)block;
54 #endif // __cplusplus
55 
56 /**
57  Returns the runtime global object for use in Swift.
58  */
59 - (nonnull EXJavaScriptObject *)global;
60 
61 /**
62  Creates a new object for use in Swift.
63  */
64 - (nonnull EXJavaScriptObject *)createObject;
65 
66 #pragma mark - Script evaluation
67 
68 /**
69  Evaluates given JavaScript source code.
70  */
71 - (nonnull EXJavaScriptValue *)evaluateScript:(nonnull NSString *)scriptSource;
72 
73 @end
74