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