1 // Copyright 2018-present 650 Industries. All rights reserved.
2 
3 #import <ExpoModulesCore/EXJavaScriptValue.h>
4 #import <ExpoModulesCore/EXJavaScriptObject.h>
5 #import <React/RCTBridgeModule.h>
6 
7 #ifdef __cplusplus
8 #import <ReactCommon/CallInvoker.h>
9 
10 namespace jsi = facebook::jsi;
11 namespace react = facebook::react;
12 #endif // __cplusplus
13 
14 @class EXJavaScriptValue;
15 @class EXJavaScriptObject;
16 
17 typedef void (^JSAsyncFunctionBlock)(EXJavaScriptValue * _Nonnull thisValue,
18                                      NSArray<EXJavaScriptValue *> * _Nonnull arguments,
19                                      RCTPromiseResolveBlock _Nonnull resolve,
20                                      RCTPromiseRejectBlock _Nonnull reject);
21 
22 typedef id _Nullable (^JSSyncFunctionBlock)(EXJavaScriptValue * _Nonnull thisValue,
23                                             NSArray<EXJavaScriptValue *> * _Nonnull arguments);
24 
25 #ifdef __cplusplus
26 typedef jsi::Value (^JSHostFunctionBlock)(jsi::Runtime &runtime,
27                                           std::shared_ptr<react::CallInvoker> callInvoker,
28                                           EXJavaScriptValue * _Nonnull thisValue,
29                                           NSArray<EXJavaScriptValue *> * _Nonnull arguments);
30 #endif // __cplusplus
31 
32 NS_SWIFT_NAME(JavaScriptRuntime)
33 @interface EXJavaScriptRuntime : NSObject
34 
35 /**
36  Creates a new JavaScript runtime.
37  */
38 - (nonnull instancetype)init;
39 
40 #ifdef __cplusplus
41 
42 - (nonnull instancetype)initWithRuntime:(nonnull jsi::Runtime *)runtime
43                             callInvoker:(std::shared_ptr<react::CallInvoker>)callInvoker;
44 
45 /**
46  Returns the underlying runtime object.
47  */
48 - (nonnull jsi::Runtime *)get;
49 
50 /**
51  Returns the call invoker the runtime was initialized with.
52  */
53 - (std::shared_ptr<react::CallInvoker>)callInvoker;
54 
55 /**
56  Wraps given host object to `EXJavaScriptObject`.
57  */
58 - (nonnull EXJavaScriptObject *)createHostObject:(std::shared_ptr<jsi::HostObject>)jsiHostObjectPtr;
59 
60 #endif // __cplusplus
61 
62 /**
63  Returns the runtime global object for use in Swift.
64  */
65 - (nonnull EXJavaScriptObject *)global;
66 
67 /**
68  Creates a new object for use in Swift.
69  */
70 - (nonnull EXJavaScriptObject *)createObject;
71 
72 /**
73  Creates a synchronous host function that runs given block when it's called.
74  The value returned by the block is synchronously returned to JS.
75  \return A JavaScript function represented as a `JavaScriptObject`.
76  */
77 - (nonnull EXJavaScriptObject *)createSyncFunction:(nonnull NSString *)name
78                                          argsCount:(NSInteger)argsCount
79                                              block:(nonnull JSSyncFunctionBlock)block;
80 
81 /**
82  Creates an asynchronous host function that runs given block when it's called.
83  The block receives a resolver that you should call when the asynchronous operation
84  succeeds and a rejecter to call whenever it fails.
85  \return A JavaScript function represented as a `JavaScriptObject`.
86  */
87 - (nonnull EXJavaScriptObject *)createAsyncFunction:(nonnull NSString *)name
88                                           argsCount:(NSInteger)argsCount
89                                               block:(nonnull JSAsyncFunctionBlock)block;
90 
91 #pragma mark - Classes
92 
93 typedef void (^ClassConstructorBlock)(EXJavaScriptObject * _Nonnull thisValue, NSArray<EXJavaScriptValue *> * _Nonnull arguments);
94 
95 - (nonnull EXJavaScriptObject *)createClass:(nonnull NSString *)name
96                                 constructor:(nonnull ClassConstructorBlock)constructor;
97 
98 #pragma mark - Script evaluation
99 
100 /**
101  Evaluates given JavaScript source code.
102  */
103 - (nonnull EXJavaScriptValue *)evaluateScript:(nonnull NSString *)scriptSource;
104 
105 @end
106