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