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