guardia-messenger/node_modules/expo-modules-core/ios/JSI/EXJSIUtils.mm
DESKTOP-TKLFCPRython f29f525c77 refactor: 101.79.17.164 → zioinfo.co.kr 전체 도메인 변환 + Manager UI 배포
- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스)
- Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포
- 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 10:09:17 +09:00

158 lines
5.2 KiB
Plaintext

// Copyright 2022-present 650 Industries. All rights reserved.
#import <sstream>
#import <React/RCTUtils.h>
#import <ExpoModulesCore/EXJSIConversions.h>
#import <ExpoModulesCore/EXJSIUtils.h>
#import <ExpoModulesCore/JSIUtils.h>
#import <ExpoModulesCore/NativeModule.h>
#import <ExpoModulesCore/EventEmitter.h>
namespace expo {
void callPromiseSetupWithBlock(jsi::Runtime &runtime, std::shared_ptr<CallInvoker> jsInvoker, std::shared_ptr<Promise> promise, PromiseInvocationBlock setupBlock)
{
auto weakResolveWrapper = react::CallbackWrapper::createWeak(promise->resolve_.getFunction(runtime), runtime, jsInvoker);
auto weakRejectWrapper = react::CallbackWrapper::createWeak(promise->reject_.getFunction(runtime), runtime, jsInvoker);
__block BOOL resolveWasCalled = NO;
__block BOOL rejectWasCalled = NO;
RCTPromiseResolveBlock resolveBlock = ^(id result) {
if (rejectWasCalled) {
throw std::runtime_error("Tried to resolve a promise after it's already been rejected.");
}
if (resolveWasCalled) {
throw std::runtime_error("Tried to resolve a promise more than once.");
}
auto strongResolveWrapper = weakResolveWrapper.lock();
auto strongRejectWrapper = weakRejectWrapper.lock();
if (!strongResolveWrapper || !strongRejectWrapper) {
return;
}
strongResolveWrapper->jsInvoker().invokeAsync([weakResolveWrapper, weakRejectWrapper, result]() {
auto strongResolveWrapper2 = weakResolveWrapper.lock();
auto strongRejectWrapper2 = weakRejectWrapper.lock();
if (!strongResolveWrapper2 || !strongRejectWrapper2) {
return;
}
jsi::Runtime &rt = strongResolveWrapper2->runtime();
jsi::Value arg = convertObjCObjectToJSIValue(rt, result);
strongResolveWrapper2->callback().call(rt, arg);
strongResolveWrapper2->destroy();
strongRejectWrapper2->destroy();
});
resolveWasCalled = YES;
};
RCTPromiseRejectBlock rejectBlock = ^(NSString *code, NSString *message, NSError *error) {
if (resolveWasCalled) {
throw std::runtime_error("Tried to reject a promise after it's already been resolved.");
}
if (rejectWasCalled) {
throw std::runtime_error("Tried to reject a promise more than once.");
}
auto strongResolveWrapper = weakResolveWrapper.lock();
auto strongRejectWrapper = weakRejectWrapper.lock();
if (!strongResolveWrapper || !strongRejectWrapper) {
return;
}
strongRejectWrapper->jsInvoker().invokeAsync([weakResolveWrapper, weakRejectWrapper, code, message]() {
auto strongResolveWrapper2 = weakResolveWrapper.lock();
auto strongRejectWrapper2 = weakRejectWrapper.lock();
if (!strongResolveWrapper2 || !strongRejectWrapper2) {
return;
}
jsi::Runtime &rt = strongRejectWrapper2->runtime();
jsi::Value jsError = makeCodedError(rt, code, message);
strongRejectWrapper2->callback().call(rt, jsError);
strongResolveWrapper2->destroy();
strongRejectWrapper2->destroy();
});
rejectWasCalled = YES;
};
setupBlock(resolveBlock, rejectBlock);
}
#pragma mark - Weak objects
bool isWeakRefSupported(jsi::Runtime &runtime) {
return runtime.global().hasProperty(runtime, "WeakRef");
}
std::shared_ptr<jsi::Object> createWeakRef(jsi::Runtime &runtime, std::shared_ptr<jsi::Object> object) {
jsi::Object weakRef = runtime
.global()
.getProperty(runtime, "WeakRef")
.asObject(runtime)
.asFunction(runtime)
.callAsConstructor(runtime, jsi::Value(runtime, *object))
.asObject(runtime);
return std::make_shared<jsi::Object>(std::move(weakRef));
}
std::shared_ptr<jsi::Object> derefWeakRef(jsi::Runtime &runtime, std::shared_ptr<jsi::Object> object) {
jsi::Value ref = object->getProperty(runtime, "deref")
.asObject(runtime)
.asFunction(runtime)
.callWithThis(runtime, *object);
if (ref.isUndefined()) {
return nullptr;
}
return std::make_shared<jsi::Object>(ref.asObject(runtime));
}
#pragma mark - Errors
jsi::Value makeCodedError(jsi::Runtime &runtime, NSString *code, NSString *message) {
jsi::String jsCode = convertNSStringToJSIString(runtime, code);
jsi::String jsMessage = convertNSStringToJSIString(runtime, message);
return runtime
.global()
.getProperty(runtime, "ExpoModulesCore_CodedError")
.asObject(runtime)
.asFunction(runtime)
.callAsConstructor(runtime, {
jsi::Value(runtime, jsCode),
jsi::Value(runtime, jsMessage)
});
}
} // namespace expo
@implementation EXJSIUtils
+ (nonnull EXJavaScriptObject *)createNativeModuleObject:(nonnull EXJavaScriptRuntime *)runtime
{
std::shared_ptr<jsi::Object> nativeModule = std::make_shared<jsi::Object>(expo::NativeModule::createInstance(*[runtime get]));
return [[EXJavaScriptObject alloc] initWith:nativeModule runtime:runtime];
}
+ (void)emitEvent:(nonnull NSString *)eventName
toObject:(nonnull EXJavaScriptObject *)object
withArguments:(nonnull NSArray<id> *)arguments
inRuntime:(nonnull EXJavaScriptRuntime *)runtime
{
const std::vector<jsi::Value> argumentsVector(expo::convertNSArrayToStdVector(*[runtime get], arguments));
expo::EventEmitter::emitEvent(*[runtime get], *[object get], [eventName UTF8String], std::move(argumentsVector));
}
@end