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 jsi::Value ExpoModulesHostObject::get(jsi::Runtime &runtime, const jsi::PropNameID &name) {
16   auto cName = name.utf8(runtime);
17   auto module = installer->getModule(cName);
18   if (module == nullptr) {
19     return jsi::Value::undefined();
20   }
21 
22   module->cthis()->jsiInteropModuleRegistry = installer;
23   auto jsiObject = module->cthis()->getJSIObject(runtime);
24   return jsi::Value(runtime, *jsiObject);
25 }
26 
27 void ExpoModulesHostObject::set(jsi::Runtime &runtime, const jsi::PropNameID &name,
28                                 const jsi::Value &value) {
29   throw jsi::JSError(
30     runtime,
31     "RuntimeError: Cannot override the host object for expo module '" + name.utf8(runtime) + "'"
32   );
33 }
34 
35 std::vector<jsi::PropNameID> ExpoModulesHostObject::getPropertyNames(jsi::Runtime &rt) {
36   auto names = installer->getModulesName();
37   size_t size = names->size();
38   std::vector<jsi::PropNameID> result;
39   result.reserve(size);
40   for (int i = 0; i < size; i++) {
41     result.push_back(
42       jsi::PropNameID::forUtf8(rt, names->getElement(i)->toStdString())
43     );
44   }
45   return result;
46 }
47 } // namespace expo
48