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