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