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