expo-modules-core 0.6.4 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/README.md +1 -1
- package/android/ExpoModulesCorePlugin.gradle +15 -0
- package/android/build.gradle +46 -32
- package/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +5 -5
- package/android/src/main/java/expo/modules/adapters/react/services/UIManagerModuleWrapper.java +13 -0
- package/android/src/main/java/expo/modules/core/ViewManager.java +9 -0
- package/android/src/main/java/expo/modules/core/interfaces/JavaScriptContextProvider.java +4 -0
- package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +37 -1
- package/android/src/main/java/expo/modules/core/interfaces/ReactNativeHostHandler.java +19 -0
- package/android/src/main/java/expo/modules/core/interfaces/services/UIManager.java +2 -0
- package/android/src/main/java/expo/modules/kotlin/AppContext.kt +23 -5
- package/android/src/main/java/expo/modules/kotlin/DynamicExtenstions.kt +5 -3
- package/android/src/main/java/expo/modules/kotlin/KPromiseWrapper.kt +3 -8
- package/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt +24 -9
- package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +12 -7
- package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +23 -1
- package/android/src/main/java/expo/modules/kotlin/Promise.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/callbacks/Callback.kt +5 -0
- package/android/src/main/java/expo/modules/kotlin/callbacks/ViewCallback.kt +39 -0
- package/android/src/main/java/expo/modules/kotlin/callbacks/ViewCallbackDelegate.kt +27 -0
- package/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt +25 -0
- package/android/src/main/java/expo/modules/kotlin/events/EventEmitter.kt +13 -0
- package/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt +102 -0
- package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +93 -9
- package/android/src/main/java/expo/modules/kotlin/exception/ExceptionDecorator.kt +11 -0
- package/android/src/main/java/expo/modules/kotlin/{methods/AnyMethod.kt → functions/AnyFunction.kt} +18 -18
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunction.kt +15 -0
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt +61 -0
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionWithPromise.kt +15 -0
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncSuspendFunction.kt +36 -0
- package/android/src/main/java/expo/modules/kotlin/modules/DefinitionMarker.kt +4 -0
- package/android/src/main/java/expo/modules/kotlin/modules/Module.kt +17 -2
- package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt +219 -30
- package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionData.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/records/FieldValidator.kt +139 -0
- package/android/src/main/java/expo/modules/kotlin/records/RecordTypeConverter.kt +71 -15
- package/android/src/main/java/expo/modules/kotlin/records/Required.kt +5 -0
- package/android/src/main/java/expo/modules/kotlin/records/ValidationBinder.kt +110 -0
- package/android/src/main/java/expo/modules/kotlin/records/Validators.kt +61 -0
- package/android/src/main/java/expo/modules/kotlin/types/ArrayTypeConverter.kt +11 -5
- package/android/src/main/java/expo/modules/kotlin/types/JSTypeConverter.kt +35 -0
- package/android/src/main/java/expo/modules/kotlin/types/JSTypeConverterHelper.kt +148 -0
- package/android/src/main/java/expo/modules/kotlin/types/ListTypeConverter.kt +10 -4
- package/android/src/main/java/expo/modules/kotlin/types/MapTypeConverter.kt +12 -6
- package/android/src/main/java/expo/modules/kotlin/types/PairTypeConverter.kt +29 -13
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt +2 -1
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +9 -1
- package/android/src/main/java/expo/modules/kotlin/views/CallbacksDefinition.kt +3 -0
- package/android/src/main/java/expo/modules/kotlin/views/GroupViewManagerWrapper.kt +71 -0
- package/android/src/main/java/expo/modules/kotlin/views/SimpleViewManagerWrapper.kt +22 -0
- package/android/src/main/java/expo/modules/kotlin/views/ViewGroupDefinition.kt +18 -0
- package/android/src/main/java/expo/modules/kotlin/views/ViewGroupDefinitionBuilder.kt +64 -0
- package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinition.kt +30 -2
- package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinitionBuilder.kt +42 -1
- package/android/src/main/java/expo/modules/kotlin/views/ViewManagerWrapperDelegate.kt +62 -2
- package/build/EventEmitter.d.ts +1 -0
- package/build/EventEmitter.d.ts.map +1 -0
- package/build/NativeModulesProxy.d.ts +1 -0
- package/build/NativeModulesProxy.d.ts.map +1 -0
- package/build/NativeModulesProxy.native.d.ts +1 -4
- package/build/NativeModulesProxy.native.d.ts.map +1 -0
- package/build/NativeModulesProxy.native.js +1 -14
- package/build/NativeModulesProxy.native.js.map +1 -1
- package/build/NativeModulesProxy.types.d.ts +1 -3
- package/build/NativeModulesProxy.types.d.ts.map +1 -0
- package/build/NativeModulesProxy.types.js.map +1 -1
- package/build/NativeViewManagerAdapter.d.ts +1 -0
- package/build/NativeViewManagerAdapter.d.ts.map +1 -0
- package/build/NativeViewManagerAdapter.native.d.ts +1 -0
- package/build/NativeViewManagerAdapter.native.d.ts.map +1 -0
- package/build/NativeViewManagerAdapter.native.js +9 -33
- package/build/NativeViewManagerAdapter.native.js.map +1 -1
- package/build/PermissionsHook.d.ts +1 -0
- package/build/PermissionsHook.d.ts.map +1 -0
- package/build/PermissionsInterface.d.ts +1 -0
- package/build/PermissionsInterface.d.ts.map +1 -0
- package/build/Platform.d.ts +1 -0
- package/build/Platform.d.ts.map +1 -0
- package/build/SyntheticPlatformEmitter.d.ts +1 -0
- package/build/SyntheticPlatformEmitter.d.ts.map +1 -0
- package/build/SyntheticPlatformEmitter.web.d.ts +1 -0
- package/build/SyntheticPlatformEmitter.web.d.ts.map +1 -0
- package/build/deprecate.d.ts +1 -0
- package/build/deprecate.d.ts.map +1 -0
- package/build/environment/browser.d.ts +1 -0
- package/build/environment/browser.d.ts.map +1 -0
- package/build/environment/browser.web.d.ts +1 -0
- package/build/environment/browser.web.d.ts.map +1 -0
- package/build/errors/CodedError.d.ts +1 -0
- package/build/errors/CodedError.d.ts.map +1 -0
- package/build/errors/UnavailabilityError.d.ts +1 -0
- package/build/errors/UnavailabilityError.d.ts.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/requireNativeModule.d.ts +16 -0
- package/build/requireNativeModule.d.ts.map +1 -0
- package/build/requireNativeModule.js +18 -0
- package/build/requireNativeModule.js.map +1 -0
- package/build/sweet/NativeErrorManager.d.ts +3 -0
- package/build/sweet/NativeErrorManager.d.ts.map +1 -0
- package/build/sweet/NativeErrorManager.js +3 -0
- package/build/sweet/NativeErrorManager.js.map +1 -0
- package/build/sweet/setUpErrorManager.fx.d.ts +2 -0
- package/build/sweet/setUpErrorManager.fx.d.ts.map +1 -0
- package/build/sweet/setUpErrorManager.fx.js +11 -0
- package/build/sweet/setUpErrorManager.fx.js.map +1 -0
- package/ios/AppDelegates/EXAppDelegatesLoader.m +4 -8
- package/ios/AppDelegates/ExpoAppDelegate.swift +22 -20
- package/ios/EXAppDefines.h +1 -0
- package/ios/EXAppDefines.m +6 -0
- package/ios/EXUtilities.h +2 -0
- package/ios/EXUtilities.m +12 -0
- package/ios/ExpoModulesCore.h +4 -0
- package/ios/ExpoModulesCore.podspec +4 -2
- package/ios/Interfaces/FileSystem/EXFileSystemInterface.h +1 -1
- package/ios/Interfaces/TaskManager/EXTaskServiceInterface.h +1 -0
- package/ios/JSI/{JSIConversions.h → EXJSIConversions.h} +5 -0
- package/ios/JSI/{JSIConversions.mm → EXJSIConversions.mm} +21 -1
- package/ios/JSI/{JSIInstaller.h → EXJSIInstaller.h} +10 -0
- package/ios/JSI/EXJSIInstaller.mm +17 -0
- package/ios/JSI/EXJSIUtils.h +19 -0
- package/ios/JSI/EXJSIUtils.mm +89 -0
- package/ios/JSI/EXJavaScriptObject.h +97 -0
- package/ios/JSI/EXJavaScriptObject.mm +121 -0
- package/ios/JSI/EXJavaScriptRuntime.h +73 -0
- package/ios/JSI/EXJavaScriptRuntime.mm +153 -0
- package/ios/JSI/EXJavaScriptValue.h +57 -0
- package/ios/JSI/EXJavaScriptValue.mm +166 -0
- package/ios/JSI/ExpoModulesHostObject.h +33 -0
- package/ios/JSI/ExpoModulesHostObject.mm +41 -0
- package/ios/JSI/JavaScriptRuntime.swift +32 -0
- package/ios/JSI/JavaScriptValue.swift +94 -0
- package/ios/ModuleRegistryAdapter/EXModuleRegistryAdapter.m +3 -23
- package/ios/NativeModulesProxy/EXNativeModulesProxy.h +2 -2
- package/ios/NativeModulesProxy/EXNativeModulesProxy.mm +101 -75
- package/ios/RCTComponentData+Privates.h +12 -0
- package/ios/ReactDelegates/EXReactCompatibleHelpers.h +18 -0
- package/ios/ReactDelegates/EXReactCompatibleHelpers.m +19 -0
- package/ios/ReactDelegates/ExpoReactDelegate.swift +3 -3
- package/ios/ReactDelegates/ExpoReactDelegateHandler.swift +4 -4
- package/ios/ReactDelegates/ModulePriorities.swift +1 -1
- package/ios/Swift/AppContext.swift +64 -4
- package/ios/Swift/Arguments/ArgumentType.swift +4 -0
- package/ios/Swift/Arguments/Convertibles.swift +13 -13
- package/ios/Swift/Arguments/Types/EnumArgumentType.swift +11 -17
- package/ios/Swift/Arguments/Types/PromiseArgumentType.swift +1 -1
- package/ios/Swift/Arguments/Types/RawArgumentType.swift +2 -2
- package/ios/Swift/Conversions.swift +51 -56
- package/ios/Swift/EventListener.swift +8 -10
- package/ios/Swift/Events/Callback.swift +66 -0
- package/ios/Swift/Events/Event.swift +43 -0
- package/ios/Swift/Exceptions/ChainableException.swift +51 -0
- package/ios/Swift/{CodedError.swift → Exceptions/CodedError.swift} +1 -12
- package/ios/Swift/Exceptions/Exception.swift +62 -0
- package/ios/Swift/Exceptions/ExceptionOrigin.swift +28 -0
- package/ios/Swift/Exceptions/GenericException.swift +20 -0
- package/ios/Swift/Exceptions/UnexpectedException.swift +16 -0
- package/ios/Swift/Functions/AnyFunction.swift +11 -1
- package/ios/Swift/Functions/AsyncFunction.swift +17 -0
- package/ios/Swift/Functions/ConcreteFunction.swift +43 -17
- package/ios/Swift/JavaScriptUtils.swift +54 -0
- package/ios/Swift/ModuleHolder.swift +66 -16
- package/ios/Swift/ModuleRegistry.swift +4 -1
- package/ios/Swift/Modules/AnyModule.swift +0 -1
- package/ios/Swift/Modules/ModuleDefinition.swift +4 -13
- package/ios/Swift/Modules/ModuleDefinitionBuilder.swift +0 -1
- package/ios/Swift/Modules/ModuleDefinitionComponents.swift +0 -188
- package/ios/Swift/ModulesProvider.swift +3 -11
- package/ios/Swift/Objects/ObjectDefinition.swift +30 -0
- package/ios/Swift/Objects/ObjectDefinitionComponents.swift +384 -0
- package/ios/Swift/Promise.swift +8 -3
- package/ios/Swift/Records/AnyField.swift +7 -0
- package/ios/Swift/Records/Field.swift +24 -19
- package/ios/Swift/Records/FieldOption.swift +1 -1
- package/ios/Swift/Records/Record.swift +12 -4
- package/ios/Swift/SwiftInteropBridge.swift +53 -15
- package/ios/Swift/Views/AnyViewProp.swift +1 -1
- package/ios/Swift/Views/ComponentData.swift +96 -0
- package/ios/Swift/Views/ConcreteViewProp.swift +6 -8
- package/ios/Swift/Views/ExpoView.swift +8 -0
- package/ios/Swift/Views/ViewFactory.swift +1 -1
- package/ios/Swift/Views/ViewManagerDefinition.swift +23 -2
- package/ios/Swift/Views/ViewManagerDefinitionBuilder.swift +0 -1
- package/ios/Swift/Views/ViewManagerDefinitionComponents.swift +26 -0
- package/ios/Swift/Views/ViewModuleWrapper.swift +5 -2
- package/ios/Swift.h +5 -0
- package/ios/Tests/ArgumentTypeSpec.swift +5 -7
- package/ios/Tests/ConstantsSpec.swift +6 -7
- package/ios/Tests/ConvertiblesSpec.swift +35 -36
- package/ios/Tests/ExceptionsSpec.swift +111 -0
- package/ios/Tests/ExpoModulesSpec.swift +76 -0
- package/ios/Tests/FunctionSpec.swift +22 -25
- package/ios/Tests/FunctionWithConvertiblesSpec.swift +4 -5
- package/ios/Tests/JavaScriptObjectSpec.swift +97 -0
- package/ios/Tests/JavaScriptRuntimeSpec.swift +94 -0
- package/ios/Tests/Mocks/ModuleMocks.swift +1 -1
- package/ios/Tests/Mocks/ModulesProviderMock.swift +0 -1
- package/ios/Tests/ModuleEventListenersSpec.swift +3 -4
- package/ios/Tests/ModuleRegistrySpec.swift +2 -3
- package/ios/Tests/RecordSpec.swift +9 -20
- package/package.json +3 -3
- package/src/NativeModulesProxy.native.ts +2 -22
- package/src/NativeModulesProxy.types.ts +0 -8
- package/src/NativeViewManagerAdapter.native.tsx +12 -28
- package/src/index.ts +4 -0
- package/src/requireNativeModule.ts +29 -0
- package/src/sweet/NativeErrorManager.ts +2 -0
- package/src/sweet/setUpErrorManager.fx.ts +12 -0
- package/android/src/main/java/expo/modules/kotlin/events/KEventEmitterWrapper.kt +0 -26
- package/android/src/main/java/expo/modules/kotlin/methods/Method.kt +0 -14
- package/android/src/main/java/expo/modules/kotlin/methods/PromiseMethod.kt +0 -15
- package/ios/JSI/ExpoModulesProxySpec.h +0 -24
- package/ios/JSI/ExpoModulesProxySpec.mm +0 -135
- package/ios/JSI/JSIInstaller.mm +0 -22
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Copyright 2022-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUtils.h>
|
|
4
|
+
#import <ExpoModulesCore/EXJSIConversions.h>
|
|
5
|
+
#import <ExpoModulesCore/EXJSIUtils.h>
|
|
6
|
+
|
|
7
|
+
using namespace facebook;
|
|
8
|
+
|
|
9
|
+
namespace expo {
|
|
10
|
+
|
|
11
|
+
void callPromiseSetupWithBlock(jsi::Runtime &runtime, std::shared_ptr<CallInvoker> jsInvoker, std::shared_ptr<Promise> promise, PromiseInvocationBlock setupBlock)
|
|
12
|
+
{
|
|
13
|
+
auto weakResolveWrapper = CallbackWrapper::createWeak(promise->resolve_.getFunction(runtime), runtime, jsInvoker);
|
|
14
|
+
auto weakRejectWrapper = CallbackWrapper::createWeak(promise->reject_.getFunction(runtime), runtime, jsInvoker);
|
|
15
|
+
|
|
16
|
+
__block BOOL resolveWasCalled = NO;
|
|
17
|
+
__block BOOL rejectWasCalled = NO;
|
|
18
|
+
|
|
19
|
+
RCTPromiseResolveBlock resolveBlock = ^(id result) {
|
|
20
|
+
if (rejectWasCalled) {
|
|
21
|
+
throw std::runtime_error("Tried to resolve a promise after it's already been rejected.");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (resolveWasCalled) {
|
|
25
|
+
throw std::runtime_error("Tried to resolve a promise more than once.");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
auto strongResolveWrapper = weakResolveWrapper.lock();
|
|
29
|
+
auto strongRejectWrapper = weakRejectWrapper.lock();
|
|
30
|
+
if (!strongResolveWrapper || !strongRejectWrapper) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
strongResolveWrapper->jsInvoker().invokeAsync([weakResolveWrapper, weakRejectWrapper, result]() {
|
|
35
|
+
auto strongResolveWrapper2 = weakResolveWrapper.lock();
|
|
36
|
+
auto strongRejectWrapper2 = weakRejectWrapper.lock();
|
|
37
|
+
if (!strongResolveWrapper2 || !strongRejectWrapper2) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
jsi::Runtime &rt = strongResolveWrapper2->runtime();
|
|
42
|
+
jsi::Value arg = convertObjCObjectToJSIValue(rt, result);
|
|
43
|
+
strongResolveWrapper2->callback().call(rt, arg);
|
|
44
|
+
|
|
45
|
+
strongResolveWrapper2->destroy();
|
|
46
|
+
strongRejectWrapper2->destroy();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
resolveWasCalled = YES;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
RCTPromiseRejectBlock rejectBlock = ^(NSString *code, NSString *message, NSError *error) {
|
|
53
|
+
if (resolveWasCalled) {
|
|
54
|
+
throw std::runtime_error("Tried to reject a promise after it's already been resolved.");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (rejectWasCalled) {
|
|
58
|
+
throw std::runtime_error("Tried to reject a promise more than once.");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
auto strongResolveWrapper = weakResolveWrapper.lock();
|
|
62
|
+
auto strongRejectWrapper = weakRejectWrapper.lock();
|
|
63
|
+
if (!strongResolveWrapper || !strongRejectWrapper) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
NSDictionary *jsError = RCTJSErrorFromCodeMessageAndNSError(code, message, error);
|
|
68
|
+
strongRejectWrapper->jsInvoker().invokeAsync([weakResolveWrapper, weakRejectWrapper, jsError]() {
|
|
69
|
+
auto strongResolveWrapper2 = weakResolveWrapper.lock();
|
|
70
|
+
auto strongRejectWrapper2 = weakRejectWrapper.lock();
|
|
71
|
+
if (!strongResolveWrapper2 || !strongRejectWrapper2) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
jsi::Runtime &rt = strongRejectWrapper2->runtime();
|
|
76
|
+
jsi::Value arg = convertNSDictionaryToJSIObject(rt, jsError);
|
|
77
|
+
strongRejectWrapper2->callback().call(rt, arg);
|
|
78
|
+
|
|
79
|
+
strongResolveWrapper2->destroy();
|
|
80
|
+
strongRejectWrapper2->destroy();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
rejectWasCalled = YES;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
setupBlock(resolveBlock, rejectBlock);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
} // namespace expo
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Copyright 2022-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
#import <React/RCTBridgeModule.h>
|
|
5
|
+
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
#import <jsi/jsi.h>
|
|
8
|
+
#import <ReactCommon/CallInvoker.h>
|
|
9
|
+
|
|
10
|
+
namespace jsi = facebook::jsi;
|
|
11
|
+
#endif // __cplusplus
|
|
12
|
+
|
|
13
|
+
typedef void (^JSAsyncFunctionBlock)(NSArray * _Nonnull, RCTPromiseResolveBlock _Nonnull, RCTPromiseRejectBlock _Nonnull);
|
|
14
|
+
typedef id _Nullable (^JSSyncFunctionBlock)(NSArray * _Nonnull);
|
|
15
|
+
|
|
16
|
+
@class EXJavaScriptRuntime;
|
|
17
|
+
@class EXJavaScriptValue;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
The property descriptor options for the property being defined or modified.
|
|
21
|
+
*/
|
|
22
|
+
typedef NS_OPTIONS(NSInteger, EXJavaScriptObjectPropertyDescriptor) {
|
|
23
|
+
/**
|
|
24
|
+
If set, the type of this property descriptor may be changed and if the property may be deleted from the corresponding object.
|
|
25
|
+
*/
|
|
26
|
+
EXJavaScriptObjectPropertyDescriptorConfigurable = 1 << 0,
|
|
27
|
+
/**
|
|
28
|
+
If set, the property shows up during enumeration of the properties on the corresponding object.
|
|
29
|
+
*/
|
|
30
|
+
EXJavaScriptObjectPropertyDescriptorEnumerable = 1 << 1,
|
|
31
|
+
/**
|
|
32
|
+
If set, the value associated with the property may be changed with an assignment operator.
|
|
33
|
+
*/
|
|
34
|
+
EXJavaScriptObjectPropertyDescriptorWritable = 1 << 2,
|
|
35
|
+
} NS_SWIFT_NAME(JavaScriptObjectPropertyDescriptor);
|
|
36
|
+
|
|
37
|
+
NS_SWIFT_NAME(JavaScriptObject)
|
|
38
|
+
@interface EXJavaScriptObject : NSObject
|
|
39
|
+
|
|
40
|
+
// Some parts of the interface must be hidden for Swift – it can't import any C++ code.
|
|
41
|
+
#ifdef __cplusplus
|
|
42
|
+
- (nonnull instancetype)initWith:(std::shared_ptr<jsi::Object>)jsObjectPtr
|
|
43
|
+
runtime:(nonnull EXJavaScriptRuntime *)runtime;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
Returns the pointer to the underlying object.
|
|
47
|
+
*/
|
|
48
|
+
- (nonnull jsi::Object *)get;
|
|
49
|
+
#endif // __cplusplus
|
|
50
|
+
|
|
51
|
+
#pragma mark - Accessing object properties
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
\return a bool whether the object has a property with the given name.
|
|
55
|
+
*/
|
|
56
|
+
- (BOOL)hasProperty:(nonnull NSString *)name;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
\return the property of the object with the given name.
|
|
60
|
+
If the name isn't a property on the object, returns the `undefined` value.
|
|
61
|
+
*/
|
|
62
|
+
- (nonnull EXJavaScriptValue *)getProperty:(nonnull NSString *)name;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
\return an array consisting of all enumerable property names in the object and its prototype chain.
|
|
66
|
+
*/
|
|
67
|
+
- (nonnull NSArray<NSString *> *)getPropertyNames;
|
|
68
|
+
|
|
69
|
+
#pragma mark - Modifying object properties
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
Sets the value for the property with the given name.
|
|
73
|
+
*/
|
|
74
|
+
- (void)setProperty:(nonnull NSString *)name value:(nullable id)value;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
Defines a new property or modifies an existing property on the object. Calls `Object.defineProperty` under the hood.
|
|
78
|
+
*/
|
|
79
|
+
- (void)defineProperty:(nonnull NSString *)name value:(nullable id)value options:(EXJavaScriptObjectPropertyDescriptor)options;
|
|
80
|
+
|
|
81
|
+
#pragma mark - Functions
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
Sets given function block on the object as a host function returning a promise.
|
|
85
|
+
*/
|
|
86
|
+
- (void)setAsyncFunction:(nonnull NSString *)key
|
|
87
|
+
argsCount:(NSInteger)argsCount
|
|
88
|
+
block:(nonnull JSAsyncFunctionBlock)block;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
Sets given synchronous function block as a host function on the object.
|
|
92
|
+
*/
|
|
93
|
+
- (void)setSyncFunction:(nonnull NSString *)name
|
|
94
|
+
argsCount:(NSInteger)argsCount
|
|
95
|
+
block:(nonnull JSSyncFunctionBlock)block;
|
|
96
|
+
|
|
97
|
+
@end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Copyright 2022-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import <ExpoModulesCore/EXJSIConversions.h>
|
|
4
|
+
#import <ExpoModulesCore/EXJavaScriptObject.h>
|
|
5
|
+
#import <ExpoModulesCore/EXJavaScriptRuntime.h>
|
|
6
|
+
|
|
7
|
+
@implementation EXJavaScriptObject {
|
|
8
|
+
/**
|
|
9
|
+
Pointer to the `EXJavaScriptRuntime` wrapper.
|
|
10
|
+
|
|
11
|
+
\note It must be weak because only then the original runtime can be safely deallocated
|
|
12
|
+
when the JS engine wants to without unsetting it on each created object.
|
|
13
|
+
*/
|
|
14
|
+
__weak EXJavaScriptRuntime *_runtime;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
Shared pointer to the original JSI object that is being wrapped by `EXJavaScriptObject` class.
|
|
18
|
+
*/
|
|
19
|
+
std::shared_ptr<jsi::Object> _jsObjectPtr;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
- (nonnull instancetype)initWith:(std::shared_ptr<jsi::Object>)jsObjectPtr
|
|
23
|
+
runtime:(nonnull EXJavaScriptRuntime *)runtime
|
|
24
|
+
{
|
|
25
|
+
if (self = [super init]) {
|
|
26
|
+
_runtime = runtime;
|
|
27
|
+
_jsObjectPtr = jsObjectPtr;
|
|
28
|
+
}
|
|
29
|
+
return self;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
- (nonnull jsi::Object *)get
|
|
33
|
+
{
|
|
34
|
+
return _jsObjectPtr.get();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#pragma mark - Accessing object properties
|
|
38
|
+
|
|
39
|
+
- (BOOL)hasProperty:(nonnull NSString *)name
|
|
40
|
+
{
|
|
41
|
+
return _jsObjectPtr->hasProperty(*[_runtime get], [name UTF8String]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- (nonnull EXJavaScriptValue *)getProperty:(nonnull NSString *)name
|
|
45
|
+
{
|
|
46
|
+
std::shared_ptr<jsi::Value> value = std::make_shared<jsi::Value>(_jsObjectPtr->getProperty(*[_runtime get], [name UTF8String]));
|
|
47
|
+
return [[EXJavaScriptValue alloc] initWithRuntime:_runtime value:value];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
- (nonnull NSArray<NSString *> *)getPropertyNames
|
|
51
|
+
{
|
|
52
|
+
jsi::Runtime *runtime = [_runtime get];
|
|
53
|
+
jsi::Array propertyNamesArray = _jsObjectPtr->getPropertyNames(*[_runtime get]);
|
|
54
|
+
return expo::convertJSIArrayToNSArray(*runtime, propertyNamesArray, nullptr);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#pragma mark - Modifying object properties
|
|
58
|
+
|
|
59
|
+
- (void)setProperty:(nonnull NSString *)name value:(nullable id)value
|
|
60
|
+
{
|
|
61
|
+
jsi::Value jsiValue = expo::convertObjCObjectToJSIValue(*[_runtime get], value);
|
|
62
|
+
_jsObjectPtr->setProperty(*[_runtime get], [name UTF8String], jsiValue);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)defineProperty:(nonnull NSString *)name value:(nullable id)value options:(EXJavaScriptObjectPropertyDescriptor)options
|
|
66
|
+
{
|
|
67
|
+
jsi::Runtime *runtime = [_runtime get];
|
|
68
|
+
jsi::Object global = runtime->global();
|
|
69
|
+
jsi::Object objectClass = global.getPropertyAsObject(*runtime, "Object");
|
|
70
|
+
jsi::Function definePropertyFunction = objectClass.getPropertyAsFunction(*runtime, "defineProperty");
|
|
71
|
+
jsi::Object descriptor = [self preparePropertyDescriptorWithOptions:options];
|
|
72
|
+
|
|
73
|
+
descriptor.setProperty(*runtime, "value", expo::convertObjCObjectToJSIValue(*runtime, value));
|
|
74
|
+
|
|
75
|
+
// This call is basically the same as `Object.defineProperty(object, name, descriptor)` in JS
|
|
76
|
+
definePropertyFunction.callWithThis(*runtime, objectClass, {
|
|
77
|
+
jsi::Value(*runtime, *_jsObjectPtr.get()),
|
|
78
|
+
jsi::String::createFromUtf8(*runtime, [name UTF8String]),
|
|
79
|
+
std::move(descriptor),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#pragma mark - Functions
|
|
84
|
+
|
|
85
|
+
- (void)setAsyncFunction:(nonnull NSString *)name
|
|
86
|
+
argsCount:(NSInteger)argsCount
|
|
87
|
+
block:(nonnull JSAsyncFunctionBlock)block
|
|
88
|
+
{
|
|
89
|
+
if (!_runtime) {
|
|
90
|
+
NSLog(@"Cannot set '%@' async function when the EXJavaScript runtime is no longer available.", name);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
jsi::Function function = [_runtime createAsyncFunction:name argsCount:argsCount block:block];
|
|
94
|
+
_jsObjectPtr->setProperty(*[_runtime get], [name UTF8String], function);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
- (void)setSyncFunction:(nonnull NSString *)name
|
|
98
|
+
argsCount:(NSInteger)argsCount
|
|
99
|
+
block:(nonnull JSSyncFunctionBlock)block
|
|
100
|
+
{
|
|
101
|
+
if (!_runtime) {
|
|
102
|
+
NSLog(@"Cannot set '%@' sync function when the EXJavaScript runtime is no longer available.", name);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
jsi::Function function = [_runtime createSyncFunction:name argsCount:argsCount block:block];
|
|
106
|
+
_jsObjectPtr->setProperty(*[_runtime get], [name UTF8String], function);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#pragma mark - Private helpers
|
|
110
|
+
|
|
111
|
+
- (jsi::Object)preparePropertyDescriptorWithOptions:(EXJavaScriptObjectPropertyDescriptor)options
|
|
112
|
+
{
|
|
113
|
+
jsi::Runtime *runtime = [_runtime get];
|
|
114
|
+
jsi::Object descriptor(*runtime);
|
|
115
|
+
descriptor.setProperty(*runtime, "configurable", (bool)(options & EXJavaScriptObjectPropertyDescriptorConfigurable));
|
|
116
|
+
descriptor.setProperty(*runtime, "enumerable", (bool)(options & EXJavaScriptObjectPropertyDescriptorEnumerable));
|
|
117
|
+
descriptor.setProperty(*runtime, "writable", (bool)(options & EXJavaScriptObjectPropertyDescriptorWritable));
|
|
118
|
+
return descriptor;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Copyright 2018-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import <ExpoModulesCore/EXJavaScriptValue.h>
|
|
4
|
+
#import <ExpoModulesCore/EXJavaScriptObject.h>
|
|
5
|
+
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
#import <ReactCommon/CallInvoker.h>
|
|
8
|
+
|
|
9
|
+
namespace jsi = facebook::jsi;
|
|
10
|
+
namespace react = facebook::react;
|
|
11
|
+
#endif // __cplusplus
|
|
12
|
+
|
|
13
|
+
@class EXJavaScriptValue;
|
|
14
|
+
@class EXJavaScriptObject;
|
|
15
|
+
|
|
16
|
+
#ifdef __cplusplus
|
|
17
|
+
typedef jsi::Value (^JSHostFunctionBlock)(jsi::Runtime &runtime, std::shared_ptr<react::CallInvoker> callInvoker, NSArray<EXJavaScriptValue *> * _Nonnull arguments);
|
|
18
|
+
#endif // __cplusplus
|
|
19
|
+
|
|
20
|
+
NS_SWIFT_NAME(JavaScriptRuntime)
|
|
21
|
+
@interface EXJavaScriptRuntime : NSObject
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
Creates a new JavaScript runtime.
|
|
25
|
+
*/
|
|
26
|
+
- (nonnull instancetype)init;
|
|
27
|
+
|
|
28
|
+
#ifdef __cplusplus
|
|
29
|
+
- (nonnull instancetype)initWithRuntime:(nonnull jsi::Runtime *)runtime
|
|
30
|
+
callInvoker:(std::shared_ptr<react::CallInvoker>)callInvoker;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
Returns the underlying runtime object.
|
|
34
|
+
*/
|
|
35
|
+
- (nonnull jsi::Runtime *)get;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
Returns the call invoker the runtime was initialized with.
|
|
39
|
+
*/
|
|
40
|
+
- (std::shared_ptr<react::CallInvoker>)callInvoker;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
Wraps given host object to `EXJavaScriptObject`.
|
|
44
|
+
*/
|
|
45
|
+
- (nonnull EXJavaScriptObject *)createHostObject:(std::shared_ptr<jsi::HostObject>)jsiHostObjectPtr;
|
|
46
|
+
|
|
47
|
+
- (jsi::Function)createSyncFunction:(nonnull NSString *)name
|
|
48
|
+
argsCount:(NSInteger)argsCount
|
|
49
|
+
block:(nonnull JSSyncFunctionBlock)block;
|
|
50
|
+
|
|
51
|
+
- (jsi::Function)createAsyncFunction:(nonnull NSString *)name
|
|
52
|
+
argsCount:(NSInteger)argsCount
|
|
53
|
+
block:(nonnull JSAsyncFunctionBlock)block;
|
|
54
|
+
#endif // __cplusplus
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
Returns the runtime global object for use in Swift.
|
|
58
|
+
*/
|
|
59
|
+
- (nonnull EXJavaScriptObject *)global;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
Creates a new object for use in Swift.
|
|
63
|
+
*/
|
|
64
|
+
- (nonnull EXJavaScriptObject *)createObject;
|
|
65
|
+
|
|
66
|
+
#pragma mark - Script evaluation
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
Evaluates given JavaScript source code.
|
|
70
|
+
*/
|
|
71
|
+
- (nonnull EXJavaScriptValue *)evaluateScript:(nonnull NSString *)scriptSource;
|
|
72
|
+
|
|
73
|
+
@end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Copyright 2018-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import <jsi/jsi.h>
|
|
4
|
+
|
|
5
|
+
#if __has_include(<reacthermes/HermesExecutorFactory.h>)
|
|
6
|
+
#import <reacthermes/HermesExecutorFactory.h>
|
|
7
|
+
#elif __has_include(<hermes/hermes.h>)
|
|
8
|
+
#import <hermes/hermes.h>
|
|
9
|
+
#else
|
|
10
|
+
#import <jsi/JSCRuntime.h>
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#import <ExpoModulesCore/EXJavaScriptRuntime.h>
|
|
14
|
+
#import <ExpoModulesCore/ExpoModulesHostObject.h>
|
|
15
|
+
#import <ExpoModulesCore/EXJSIUtils.h>
|
|
16
|
+
#import <ExpoModulesCore/EXJSIConversions.h>
|
|
17
|
+
#import <ExpoModulesCore/Swift.h>
|
|
18
|
+
|
|
19
|
+
using namespace facebook;
|
|
20
|
+
|
|
21
|
+
@implementation EXJavaScriptRuntime {
|
|
22
|
+
std::shared_ptr<jsi::Runtime> _runtime;
|
|
23
|
+
std::shared_ptr<react::CallInvoker> _jsCallInvoker;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
Initializes a runtime that is independent from React Native and its runtime initialization.
|
|
28
|
+
This flow is mostly intended for tests. The JS call invoker is unavailable thus calling async functions is not supported.
|
|
29
|
+
TODO: Implement the call invoker when it becomes necessary.
|
|
30
|
+
*/
|
|
31
|
+
- (nonnull instancetype)init
|
|
32
|
+
{
|
|
33
|
+
if (self = [super init]) {
|
|
34
|
+
#if __has_include(<reacthermes/HermesExecutorFactory.h>) || __has_include(<hermes/hermes.h>)
|
|
35
|
+
_runtime = hermes::makeHermesRuntime();
|
|
36
|
+
#else
|
|
37
|
+
_runtime = jsc::makeJSCRuntime();
|
|
38
|
+
#endif
|
|
39
|
+
_jsCallInvoker = nil;
|
|
40
|
+
}
|
|
41
|
+
return self;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- (nonnull instancetype)initWithRuntime:(nonnull jsi::Runtime *)runtime
|
|
45
|
+
callInvoker:(std::shared_ptr<react::CallInvoker>)callInvoker
|
|
46
|
+
{
|
|
47
|
+
if (self = [super init]) {
|
|
48
|
+
// Creating a shared pointer that points to the runtime but doesn't own it, thus doesn't release it.
|
|
49
|
+
// In this code flow, the runtime should be owned by something else like the RCTBridge.
|
|
50
|
+
// See explanation for constructor (8): https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
|
|
51
|
+
_runtime = std::shared_ptr<jsi::Runtime>(std::shared_ptr<jsi::Runtime>(), runtime);
|
|
52
|
+
_jsCallInvoker = callInvoker;
|
|
53
|
+
}
|
|
54
|
+
return self;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
- (nonnull jsi::Runtime *)get
|
|
58
|
+
{
|
|
59
|
+
return _runtime.get();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
- (std::shared_ptr<react::CallInvoker>)callInvoker
|
|
63
|
+
{
|
|
64
|
+
return _jsCallInvoker;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
- (nonnull EXJavaScriptObject *)createObject
|
|
68
|
+
{
|
|
69
|
+
auto jsObjectPtr = std::make_shared<jsi::Object>(*_runtime);
|
|
70
|
+
return [[EXJavaScriptObject alloc] initWith:jsObjectPtr runtime:self];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
- (nonnull EXJavaScriptObject *)createHostObject:(std::shared_ptr<jsi::HostObject>)jsiHostObjectPtr
|
|
74
|
+
{
|
|
75
|
+
auto jsObjectPtr = std::make_shared<jsi::Object>(jsi::Object::createFromHostObject(*_runtime, jsiHostObjectPtr));
|
|
76
|
+
return [[EXJavaScriptObject alloc] initWith:jsObjectPtr runtime:self];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
- (nonnull EXJavaScriptObject *)global
|
|
80
|
+
{
|
|
81
|
+
auto jsGlobalPtr = std::make_shared<jsi::Object>(_runtime->global());
|
|
82
|
+
return [[EXJavaScriptObject alloc] initWith:jsGlobalPtr runtime:self];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
- (jsi::Function)createSyncFunction:(nonnull NSString *)name
|
|
86
|
+
argsCount:(NSInteger)argsCount
|
|
87
|
+
block:(nonnull JSSyncFunctionBlock)block
|
|
88
|
+
{
|
|
89
|
+
return [self createHostFunction:name argsCount:argsCount block:^jsi::Value(jsi::Runtime &runtime, std::shared_ptr<react::CallInvoker> callInvoker, NSArray * _Nonnull arguments) {
|
|
90
|
+
return expo::convertObjCObjectToJSIValue(runtime, block(arguments));
|
|
91
|
+
}];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
- (jsi::Function)createAsyncFunction:(nonnull NSString *)name
|
|
95
|
+
argsCount:(NSInteger)argsCount
|
|
96
|
+
block:(nonnull JSAsyncFunctionBlock)block
|
|
97
|
+
{
|
|
98
|
+
return [self createHostFunction:name argsCount:argsCount block:^jsi::Value(jsi::Runtime &runtime, std::shared_ptr<react::CallInvoker> callInvoker, NSArray *arguments) {
|
|
99
|
+
if (!callInvoker) {
|
|
100
|
+
// In mocked environment the call invoker may be null so it's not supported to call async functions.
|
|
101
|
+
// Testing async functions is a bit more complicated anyway. See `init` description for more.
|
|
102
|
+
throw jsi::JSError(runtime, "Calling async functions is not supported when the call invoker is unavailable");
|
|
103
|
+
}
|
|
104
|
+
// The function that is invoked as a setup of the EXJavaScript `Promise`.
|
|
105
|
+
auto promiseSetup = [callInvoker, block, arguments](jsi::Runtime &runtime, std::shared_ptr<Promise> promise) {
|
|
106
|
+
expo::callPromiseSetupWithBlock(runtime, callInvoker, promise, ^(RCTPromiseResolveBlock resolver, RCTPromiseRejectBlock rejecter) {
|
|
107
|
+
block(arguments, resolver, rejecter);
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
return createPromiseAsJSIValue(runtime, promiseSetup);
|
|
111
|
+
}];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
#pragma mark - Script evaluation
|
|
115
|
+
|
|
116
|
+
- (nonnull EXJavaScriptValue *)evaluateScript:(nonnull NSString *)scriptSource
|
|
117
|
+
{
|
|
118
|
+
std::shared_ptr<jsi::StringBuffer> scriptBuffer = std::make_shared<jsi::StringBuffer>([scriptSource UTF8String]);
|
|
119
|
+
std::shared_ptr<jsi::Value> result;
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
result = std::make_shared<jsi::Value>(_runtime->evaluateJavaScript(scriptBuffer, "<<evaluated>>"));
|
|
123
|
+
} catch (jsi::JSError &error) {
|
|
124
|
+
NSString *reason = [NSString stringWithUTF8String:error.getMessage().c_str()];
|
|
125
|
+
NSString *stack = [NSString stringWithUTF8String:error.getStack().c_str()];
|
|
126
|
+
|
|
127
|
+
@throw [NSException exceptionWithName:@"ScriptEvaluationException" reason:reason userInfo:@{
|
|
128
|
+
@"message": reason,
|
|
129
|
+
@"stack": stack,
|
|
130
|
+
}];
|
|
131
|
+
}
|
|
132
|
+
return [[EXJavaScriptValue alloc] initWithRuntime:self value:result];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
#pragma mark - Private
|
|
136
|
+
|
|
137
|
+
- (jsi::Function)createHostFunction:(nonnull NSString *)name
|
|
138
|
+
argsCount:(NSInteger)argsCount
|
|
139
|
+
block:(nonnull JSHostFunctionBlock)block
|
|
140
|
+
{
|
|
141
|
+
jsi::PropNameID propNameId = jsi::PropNameID::forAscii(*_runtime, [name UTF8String], [name length]);
|
|
142
|
+
std::weak_ptr<react::CallInvoker> weakCallInvoker = _jsCallInvoker;
|
|
143
|
+
jsi::HostFunctionType function = [weakCallInvoker, block, self](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *args, size_t count) -> jsi::Value {
|
|
144
|
+
// Theoretically should check here whether the call invoker isn't null, but in mocked environment
|
|
145
|
+
// there is no need to care about that for synchronous calls, so it's ensured in `createAsyncFunction` instead.
|
|
146
|
+
auto callInvoker = weakCallInvoker.lock();
|
|
147
|
+
NSArray<EXJavaScriptValue *> *arguments = expo::convertJSIValuesToNSArray(self, args, count);
|
|
148
|
+
return block(runtime, callInvoker, arguments);
|
|
149
|
+
};
|
|
150
|
+
return jsi::Function::createFromHostFunction(*_runtime, propNameId, (unsigned int)argsCount, function);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Copyright 2022-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
#import <ExpoModulesCore/EXJavaScriptObject.h>
|
|
5
|
+
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
#import <jsi/jsi.h>
|
|
8
|
+
namespace jsi = facebook::jsi;
|
|
9
|
+
#endif // __cplusplus
|
|
10
|
+
|
|
11
|
+
@class EXJavaScriptRuntime;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
Represents any JavaScript value. Its purpose is to exposes `facebook::jsi::Value` API back to Swift.
|
|
15
|
+
*/
|
|
16
|
+
NS_SWIFT_NAME(JavaScriptValue)
|
|
17
|
+
@interface EXJavaScriptValue : NSObject
|
|
18
|
+
|
|
19
|
+
#ifdef __cplusplus
|
|
20
|
+
- (nonnull instancetype)initWithRuntime:(nonnull EXJavaScriptRuntime *)runtime
|
|
21
|
+
value:(std::shared_ptr<jsi::Value>)value;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
\return the underlying `jsi::Value`.
|
|
25
|
+
*/
|
|
26
|
+
- (nonnull jsi::Value *)get;
|
|
27
|
+
#endif // __cplusplus
|
|
28
|
+
|
|
29
|
+
#pragma mark - Type checking
|
|
30
|
+
|
|
31
|
+
- (BOOL)isUndefined;
|
|
32
|
+
- (BOOL)isNull;
|
|
33
|
+
- (BOOL)isBool;
|
|
34
|
+
- (BOOL)isNumber;
|
|
35
|
+
- (BOOL)isString;
|
|
36
|
+
- (BOOL)isSymbol;
|
|
37
|
+
- (BOOL)isObject;
|
|
38
|
+
- (BOOL)isFunction;
|
|
39
|
+
|
|
40
|
+
+ (nonnull NSString *)kindOf:(nonnull EXJavaScriptValue *)value;
|
|
41
|
+
|
|
42
|
+
#pragma mark - Type casting
|
|
43
|
+
|
|
44
|
+
- (nullable id)getRaw;
|
|
45
|
+
- (BOOL)getBool;
|
|
46
|
+
- (NSInteger)getInt;
|
|
47
|
+
- (double)getDouble;
|
|
48
|
+
- (nonnull NSString *)getString;
|
|
49
|
+
- (nonnull NSArray<EXJavaScriptValue *> *)getArray;
|
|
50
|
+
- (nonnull NSDictionary<NSString *, id> *)getDictionary;
|
|
51
|
+
- (nonnull EXJavaScriptObject *)getObject;
|
|
52
|
+
|
|
53
|
+
#pragma mark - Helpers
|
|
54
|
+
|
|
55
|
+
- (nonnull NSString *)toString;
|
|
56
|
+
|
|
57
|
+
@end
|