1370fa39dSKudo Chien // Copyright 2018-present 650 Industries. All rights reserved. 2370fa39dSKudo Chien 34d7ea828STomasz Sapeta #import <Foundation/Foundation.h> 4ec62a260STomasz Sapeta #import <ExpoModulesCore/EXJavaScriptValue.h> 5370fa39dSKudo Chien #import <ExpoModulesCore/EXJavaScriptObject.h> 6447e3428STomasz Sapeta #import <React/RCTBridgeModule.h> 7370fa39dSKudo Chien 8370fa39dSKudo Chien #ifdef __cplusplus 9370fa39dSKudo Chien #import <ReactCommon/CallInvoker.h> 10370fa39dSKudo Chien 11370fa39dSKudo Chien namespace jsi = facebook::jsi; 12370fa39dSKudo Chien namespace react = facebook::react; 13370fa39dSKudo Chien #endif // __cplusplus 14370fa39dSKudo Chien 15c4fc6f47STomasz Sapeta @class EXJavaScriptValue; 16c4fc6f47STomasz Sapeta @class EXJavaScriptObject; 17c4fc6f47STomasz Sapeta 189b8bcdc4STomasz Sapeta typedef void (^JSAsyncFunctionBlock)(EXJavaScriptValue * _Nonnull thisValue, 199b8bcdc4STomasz Sapeta NSArray<EXJavaScriptValue *> * _Nonnull arguments, 209b8bcdc4STomasz Sapeta RCTPromiseResolveBlock _Nonnull resolve, 219b8bcdc4STomasz Sapeta RCTPromiseRejectBlock _Nonnull reject); 229b8bcdc4STomasz Sapeta 239b8bcdc4STomasz Sapeta typedef id _Nullable (^JSSyncFunctionBlock)(EXJavaScriptValue * _Nonnull thisValue, 244d7ea828STomasz Sapeta NSArray<EXJavaScriptValue *> * _Nonnull arguments, 254d7ea828STomasz Sapeta NSError * _Nullable __autoreleasing * _Nullable error); 26447e3428STomasz Sapeta 27c4fc6f47STomasz Sapeta #ifdef __cplusplus 289b8bcdc4STomasz Sapeta typedef jsi::Value (^JSHostFunctionBlock)(jsi::Runtime &runtime, 299b8bcdc4STomasz Sapeta std::shared_ptr<react::CallInvoker> callInvoker, 309b8bcdc4STomasz Sapeta EXJavaScriptValue * _Nonnull thisValue, 319b8bcdc4STomasz Sapeta NSArray<EXJavaScriptValue *> * _Nonnull arguments); 32c4fc6f47STomasz Sapeta #endif // __cplusplus 33c4fc6f47STomasz Sapeta 34370fa39dSKudo Chien NS_SWIFT_NAME(JavaScriptRuntime) 35370fa39dSKudo Chien @interface EXJavaScriptRuntime : NSObject 36370fa39dSKudo Chien 374bcb0d98STomasz Sapeta /** 384bcb0d98STomasz Sapeta Creates a new JavaScript runtime. 394bcb0d98STomasz Sapeta */ 404bcb0d98STomasz Sapeta - (nonnull instancetype)init; 414bcb0d98STomasz Sapeta 42370fa39dSKudo Chien #ifdef __cplusplus 4378516026STomasz Sapeta 44ec62a260STomasz Sapeta - (nonnull instancetype)initWithRuntime:(nonnull jsi::Runtime *)runtime 45370fa39dSKudo Chien callInvoker:(std::shared_ptr<react::CallInvoker>)callInvoker; 46370fa39dSKudo Chien 47370fa39dSKudo Chien /** 48370fa39dSKudo Chien Returns the underlying runtime object. 49370fa39dSKudo Chien */ 50370fa39dSKudo Chien - (nonnull jsi::Runtime *)get; 51370fa39dSKudo Chien 52370fa39dSKudo Chien /** 53370fa39dSKudo Chien Returns the call invoker the runtime was initialized with. 54370fa39dSKudo Chien */ 55370fa39dSKudo Chien - (std::shared_ptr<react::CallInvoker>)callInvoker; 56370fa39dSKudo Chien 57370fa39dSKudo Chien /** 58370fa39dSKudo Chien Wraps given host object to `EXJavaScriptObject`. 59370fa39dSKudo Chien */ 60370fa39dSKudo Chien - (nonnull EXJavaScriptObject *)createHostObject:(std::shared_ptr<jsi::HostObject>)jsiHostObjectPtr; 61370fa39dSKudo Chien 62370fa39dSKudo Chien #endif // __cplusplus 63370fa39dSKudo Chien 64370fa39dSKudo Chien /** 65370fa39dSKudo Chien Returns the runtime global object for use in Swift. 66370fa39dSKudo Chien */ 67370fa39dSKudo Chien - (nonnull EXJavaScriptObject *)global; 68370fa39dSKudo Chien 69370fa39dSKudo Chien /** 70370fa39dSKudo Chien Creates a new object for use in Swift. 71370fa39dSKudo Chien */ 72370fa39dSKudo Chien - (nonnull EXJavaScriptObject *)createObject; 73370fa39dSKudo Chien 74447e3428STomasz Sapeta /** 75447e3428STomasz Sapeta Creates a synchronous host function that runs given block when it's called. 76447e3428STomasz Sapeta The value returned by the block is synchronously returned to JS. 77447e3428STomasz Sapeta \return A JavaScript function represented as a `JavaScriptObject`. 78447e3428STomasz Sapeta */ 79447e3428STomasz Sapeta - (nonnull EXJavaScriptObject *)createSyncFunction:(nonnull NSString *)name 80447e3428STomasz Sapeta argsCount:(NSInteger)argsCount 814d7ea828STomasz Sapeta block:(nonnull JSSyncFunctionBlock)block NS_REFINED_FOR_SWIFT; 82447e3428STomasz Sapeta 83447e3428STomasz Sapeta /** 84447e3428STomasz Sapeta Creates an asynchronous host function that runs given block when it's called. 85447e3428STomasz Sapeta The block receives a resolver that you should call when the asynchronous operation 86447e3428STomasz Sapeta succeeds and a rejecter to call whenever it fails. 87447e3428STomasz Sapeta \return A JavaScript function represented as a `JavaScriptObject`. 88447e3428STomasz Sapeta */ 89447e3428STomasz Sapeta - (nonnull EXJavaScriptObject *)createAsyncFunction:(nonnull NSString *)name 90447e3428STomasz Sapeta argsCount:(NSInteger)argsCount 91447e3428STomasz Sapeta block:(nonnull JSAsyncFunctionBlock)block; 92447e3428STomasz Sapeta 937e0c1e78STomasz Sapeta #pragma mark - Classes 947e0c1e78STomasz Sapeta 957e0c1e78STomasz Sapeta typedef void (^ClassConstructorBlock)(EXJavaScriptObject * _Nonnull thisValue, NSArray<EXJavaScriptValue *> * _Nonnull arguments); 967e0c1e78STomasz Sapeta 977e0c1e78STomasz Sapeta - (nonnull EXJavaScriptObject *)createClass:(nonnull NSString *)name 987e0c1e78STomasz Sapeta constructor:(nonnull ClassConstructorBlock)constructor; 997e0c1e78STomasz Sapeta 100*7a261681STomasz Sapeta /** 101*7a261681STomasz Sapeta Creates a new object, using the provided object as the prototype. 102*7a261681STomasz Sapeta */ 103*7a261681STomasz Sapeta - (nullable EXJavaScriptObject *)createObjectWithPrototype:(nonnull EXJavaScriptObject *)prototype; 104*7a261681STomasz Sapeta 1054bcb0d98STomasz Sapeta #pragma mark - Script evaluation 1064bcb0d98STomasz Sapeta 1074bcb0d98STomasz Sapeta /** 1084bcb0d98STomasz Sapeta Evaluates given JavaScript source code. 1094bcb0d98STomasz Sapeta */ 110419852c4STomasz Sapeta - (nonnull EXJavaScriptValue *)evaluateScript:(nonnull NSString *)scriptSource NS_REFINED_FOR_SWIFT; 1114bcb0d98STomasz Sapeta 112370fa39dSKudo Chien @end 113