1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo) 2 3 #include "ExpoModulesHostObject.h" 4 5 #include <folly/dynamic.h> 6 #include <jsi/JSIDynamic.h> 7 8 namespace jsi = facebook::jsi; 9 10 namespace expo { 11 12 ExpoModulesHostObject::ExpoModulesHostObject(JSIInteropModuleRegistry *installer) 13 : installer(installer) {} 14 15 /** 16 * Clears jsi references held by JSRegistry and JavaScriptRuntime. 17 */ 18 ExpoModulesHostObject::~ExpoModulesHostObject() { 19 installer->jsRegistry.reset(); 20 installer->runtimeHolder.reset(); 21 } 22 23 jsi::Value ExpoModulesHostObject::get(jsi::Runtime &runtime, const jsi::PropNameID &name) { 24 auto cName = name.utf8(runtime); 25 auto module = installer->getModule(cName); 26 if (module == nullptr) { 27 return jsi::Value::undefined(); 28 } 29 30 module->cthis()->jsiInteropModuleRegistry = installer; 31 auto jsiObject = module->cthis()->getJSIObject(runtime); 32 return jsi::Value(runtime, *jsiObject); 33 } 34 35 void ExpoModulesHostObject::set(jsi::Runtime &runtime, const jsi::PropNameID &name, 36 const jsi::Value &value) { 37 throw jsi::JSError( 38 runtime, 39 "RuntimeError: Cannot override the host object for expo module '" + name.utf8(runtime) + "'" 40 ); 41 } 42 43 std::vector<jsi::PropNameID> ExpoModulesHostObject::getPropertyNames(jsi::Runtime &rt) { 44 auto names = installer->getModulesName(); 45 size_t size = names->size(); 46 std::vector<jsi::PropNameID> result; 47 result.reserve(size); 48 for (int i = 0; i < size; i++) { 49 result.push_back( 50 jsi::PropNameID::forUtf8(rt, names->getElement(i)->toStdString()) 51 ); 52 } 53 return result; 54 } 55 } // namespace expo 56