2023-06-16 09:37:02 +00:00
|
|
|
#import "OnnxruntimeJSIHelper.h"
|
|
|
|
|
#import <React/RCTBlobManager.h>
|
|
|
|
|
#import <React/RCTBridge+Private.h>
|
|
|
|
|
#import <jsi/jsi.h>
|
|
|
|
|
|
|
|
|
|
@implementation OnnxruntimeJSIHelper
|
|
|
|
|
|
2024-05-15 17:32:08 +00:00
|
|
|
@synthesize bridge = _bridge;
|
|
|
|
|
|
2023-06-16 09:37:02 +00:00
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
|
|
2024-08-14 23:51:22 +00:00
|
|
|
- (void)setBridge:(RCTBridge*)bridge {
|
2024-05-15 17:32:08 +00:00
|
|
|
_bridge = bridge;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-16 09:37:02 +00:00
|
|
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) {
|
2024-08-14 23:51:22 +00:00
|
|
|
RCTCxxBridge* cxxBridge = (RCTCxxBridge*)_bridge;
|
2023-06-16 09:37:02 +00:00
|
|
|
if (cxxBridge == nil) {
|
|
|
|
|
return @false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using namespace facebook;
|
|
|
|
|
|
2024-08-14 23:51:22 +00:00
|
|
|
auto jsiRuntime = (jsi::Runtime*)cxxBridge.runtime;
|
2023-06-16 09:37:02 +00:00
|
|
|
if (jsiRuntime == nil) {
|
|
|
|
|
return @false;
|
|
|
|
|
}
|
2024-08-14 23:51:22 +00:00
|
|
|
auto& runtime = *jsiRuntime;
|
2023-06-16 09:37:02 +00:00
|
|
|
|
|
|
|
|
auto resolveArrayBuffer = jsi::Function::createFromHostFunction(
|
|
|
|
|
runtime, jsi::PropNameID::forUtf8(runtime, "jsiOnnxruntimeResolveArrayBuffer"), 1,
|
2024-08-14 23:51:22 +00:00
|
|
|
[](jsi::Runtime& runtime, const jsi::Value& thisArg, const jsi::Value* args, size_t count) -> jsi::Value {
|
2023-06-16 09:37:02 +00:00
|
|
|
if (count != 1) {
|
|
|
|
|
throw jsi::JSError(runtime, "jsiOnnxruntimeResolveArrayBuffer(..) expects one argument (object)!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto data = args[0].asObject(runtime);
|
|
|
|
|
auto blobId = data.getProperty(runtime, "blobId").asString(runtime).utf8(runtime);
|
|
|
|
|
auto size = data.getProperty(runtime, "size").asNumber();
|
|
|
|
|
auto offset = data.getProperty(runtime, "offset").asNumber();
|
|
|
|
|
|
2024-08-14 23:51:22 +00:00
|
|
|
RCTBlobManager* blobManager = [[RCTBridge currentBridge] moduleForClass:RCTBlobManager.class];
|
2023-06-16 09:37:02 +00:00
|
|
|
if (blobManager == nil) {
|
|
|
|
|
throw jsi::JSError(runtime, "RCTBlobManager is not initialized");
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-14 23:51:22 +00:00
|
|
|
NSString* blobIdStr = [NSString stringWithUTF8String:blobId.c_str()];
|
2023-06-16 09:37:02 +00:00
|
|
|
auto blob = [blobManager resolve:blobIdStr offset:(long)offset size:(long)size];
|
|
|
|
|
|
|
|
|
|
jsi::Function arrayBufferCtor = runtime.global().getPropertyAsFunction(runtime, "ArrayBuffer");
|
|
|
|
|
jsi::Object o = arrayBufferCtor.callAsConstructor(runtime, (int)blob.length).getObject(runtime);
|
|
|
|
|
jsi::ArrayBuffer buf = o.getArrayBuffer(runtime);
|
|
|
|
|
memcpy(buf.data(runtime), blob.bytes, blob.length);
|
|
|
|
|
[blobManager remove:blobIdStr];
|
|
|
|
|
return buf;
|
|
|
|
|
});
|
|
|
|
|
runtime.global().setProperty(runtime, "jsiOnnxruntimeResolveArrayBuffer", resolveArrayBuffer);
|
|
|
|
|
|
|
|
|
|
auto storeArrayBuffer = jsi::Function::createFromHostFunction(
|
|
|
|
|
runtime, jsi::PropNameID::forUtf8(runtime, "jsiOnnxruntimeStoreArrayBuffer"), 1,
|
2024-08-14 23:51:22 +00:00
|
|
|
[](jsi::Runtime& runtime, const jsi::Value& thisArg, const jsi::Value* args, size_t count) -> jsi::Value {
|
2023-06-16 09:37:02 +00:00
|
|
|
if (count != 1) {
|
|
|
|
|
throw jsi::JSError(runtime, "jsiOnnxruntimeStoreArrayBuffer(..) expects one argument (object)!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto arrayBuffer = args[0].asObject(runtime).getArrayBuffer(runtime);
|
|
|
|
|
auto size = arrayBuffer.length(runtime);
|
2024-08-14 23:51:22 +00:00
|
|
|
NSData* data = [NSData dataWithBytesNoCopy:arrayBuffer.data(runtime) length:size freeWhenDone:NO];
|
2023-06-16 09:37:02 +00:00
|
|
|
|
2024-08-14 23:51:22 +00:00
|
|
|
RCTBlobManager* blobManager = [[RCTBridge currentBridge] moduleForClass:RCTBlobManager.class];
|
2023-06-16 09:37:02 +00:00
|
|
|
if (blobManager == nil) {
|
|
|
|
|
throw jsi::JSError(runtime, "RCTBlobManager is not initialized");
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-14 23:51:22 +00:00
|
|
|
NSString* blobId = [blobManager store:data];
|
2023-06-16 09:37:02 +00:00
|
|
|
|
|
|
|
|
jsi::Object result(runtime);
|
|
|
|
|
auto blobIdString = jsi::String::createFromUtf8(runtime, [blobId cStringUsingEncoding:NSUTF8StringEncoding]);
|
|
|
|
|
result.setProperty(runtime, "blobId", blobIdString);
|
|
|
|
|
result.setProperty(runtime, "offset", jsi::Value(0));
|
|
|
|
|
result.setProperty(runtime, "size", jsi::Value(static_cast<double>(size)));
|
|
|
|
|
return result;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
runtime.global().setProperty(runtime, "jsiOnnxruntimeStoreArrayBuffer", storeArrayBuffer);
|
|
|
|
|
|
|
|
|
|
return @true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@end
|