guardia-messenger/node_modules/expo-modules-core/common/cpp/JSIUtils.cpp
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

147 lines
5.7 KiB
C++

// Copyright 2022-present 650 Industries. All rights reserved.
#include <sstream>
#include "JSIUtils.h"
namespace expo::common {
jsi::Function createClass(jsi::Runtime &runtime, const char *name, ClassConstructor constructor) {
std::string nativeConstructorKey("__native_constructor__");
// Create a string buffer of the source code to evaluate.
std::stringstream source;
source << "(function " << name << "(...args) { return this." << nativeConstructorKey << "(...args); })";
std::shared_ptr<jsi::StringBuffer> sourceBuffer = std::make_shared<jsi::StringBuffer>(source.str());
// Evaluate the code and obtain returned value (the constructor function).
jsi::Object klass = runtime.evaluateJavaScript(sourceBuffer, "").asObject(runtime);
// Set the native constructor in the prototype.
jsi::Object prototype = klass.getPropertyAsObject(runtime, "prototype");
jsi::PropNameID nativeConstructorPropId = jsi::PropNameID::forAscii(runtime, nativeConstructorKey);
jsi::Function nativeConstructor = jsi::Function::createFromHostFunction(
runtime,
nativeConstructorPropId,
// The paramCount is not obligatory to match, it only affects the `length` property of the function.
0,
[constructor](jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value {
if (constructor) {
return constructor(runtime, thisValue, args, count);
}
return jsi::Value(runtime, thisValue);
});
jsi::Object descriptor(runtime);
descriptor.setProperty(runtime, "value", jsi::Value(runtime, nativeConstructor));
defineProperty(runtime, &prototype, nativeConstructorKey.c_str(), std::move(descriptor));
return klass.asFunction(runtime);
}
jsi::Function createInheritingClass(jsi::Runtime &runtime, const char *className, jsi::Function &baseClass, ClassConstructor constructor) {
jsi::PropNameID prototypePropNameId = jsi::PropNameID::forAscii(runtime, "prototype", 9);
jsi::Object baseClassPrototype = baseClass
.getProperty(runtime, prototypePropNameId)
.asObject(runtime);
jsi::Function klass = createClass(runtime, className, constructor);
jsi::Object klassPrototype = klass.getProperty(runtime, prototypePropNameId).asObject(runtime);
klassPrototype.setProperty(runtime, "__proto__", baseClassPrototype);
return klass;
}
jsi::Object createObjectWithPrototype(jsi::Runtime &runtime, jsi::Object *prototype) {
// Get the "Object" class.
jsi::Object objectClass = runtime
.global()
.getPropertyAsObject(runtime, "Object");
// Call "Object.create(prototype)" to create an object with the given prototype without calling the constructor.
jsi::Object object = objectClass
.getPropertyAsFunction(runtime, "create")
.callWithThis(runtime, objectClass, {
jsi::Value(runtime, *prototype)
})
.asObject(runtime);
return object;
}
std::vector<jsi::PropNameID> jsiArrayToPropNameIdsVector(jsi::Runtime &runtime, const jsi::Array &array) {
size_t size = array.size(runtime);
std::vector<jsi::PropNameID> vector;
vector.reserve(size);
for (size_t i = 0; i < size; i++) {
jsi::String name = array.getValueAtIndex(runtime, i).getString(runtime);
vector.push_back(jsi::PropNameID::forString(runtime, name));
}
return vector;
}
void defineProperty(jsi::Runtime &runtime, jsi::Object *object, const char *name, const PropertyDescriptor descriptor) {
jsi::Object jsDescriptor(runtime);
// These three flags are all `false` by default, so set the property only when `true`.
if (descriptor.configurable) {
jsDescriptor.setProperty(runtime, "configurable", jsi::Value(true));
}
if (descriptor.enumerable) {
jsDescriptor.setProperty(runtime, "enumerable", jsi::Value(true));
}
if (descriptor.writable) {
jsDescriptor.setProperty(runtime, "writable", jsi::Value(true));
}
if (descriptor.get) {
jsi::PropNameID getPropName = jsi::PropNameID::forAscii(runtime, "get", 3);
jsi::Function get = jsi::Function::createFromHostFunction(
runtime,
getPropName,
0,
[getter = descriptor.get](jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value {
return getter(runtime, thisValue.asObject(runtime));
});
jsDescriptor.setProperty(runtime, getPropName, get);
}
if (descriptor.set) {
jsi::PropNameID setPropName = jsi::PropNameID::forAscii(runtime, "set", 3);
jsi::Function set = jsi::Function::createFromHostFunction(
runtime,
setPropName,
1,
[setter = descriptor.set](jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value {
setter(runtime, thisValue.asObject(runtime), jsi::Value(runtime, args[0]));
return jsi::Value::undefined();
});
jsDescriptor.setProperty(runtime, setPropName, set);
}
if (!descriptor.value.isUndefined()) {
jsi::PropNameID valuePropName = jsi::PropNameID::forAscii(runtime, "value", 5);
jsDescriptor.setProperty(runtime, valuePropName, descriptor.value);
}
defineProperty(runtime, object, name, std::move(jsDescriptor));
}
void defineProperty(jsi::Runtime &runtime, jsi::Object *object, const char *name, jsi::Object descriptor) {
jsi::Object global = runtime.global();
jsi::Object objectClass = global.getPropertyAsObject(runtime, "Object");
jsi::Function definePropertyFunction = objectClass.getPropertyAsFunction(runtime, "defineProperty");
// This call is basically the same as `Object.defineProperty(object, name, descriptor)` in JS
definePropertyFunction.callWithThis(runtime, objectClass, {
jsi::Value(runtime, *object),
jsi::String::createFromUtf8(runtime, name),
std::move(descriptor),
});
}
} // namespace expo::common