1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2 
3 #pragma once
4 
5 #include "JSIInteropModuleRegistry.h"
6 
7 #include <jsi/jsi.h>
8 
9 #include <vector>
10 #import <unordered_map>
11 
12 namespace jsi = facebook::jsi;
13 
14 namespace expo {
15 
16 using UniqueJSIObject = std::unique_ptr<jsi::Object>;
17 
18 /**
19  * An entry point to all exported functionalities like modules.
20  *
21  * An instance of this class will be added to the JS global object.
22  */
23 class ExpoModulesHostObject : public jsi::HostObject {
24 public:
25   ExpoModulesHostObject(JSIInteropModuleRegistry *installer);
26 
27   ~ExpoModulesHostObject() override;
28 
29   jsi::Value get(jsi::Runtime &, const jsi::PropNameID &name) override;
30 
31   void set(jsi::Runtime &, const jsi::PropNameID &name, const jsi::Value &value) override;
32 
33   std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
34 
35 private:
36   JSIInteropModuleRegistry *installer;
37   std::unordered_map<std::string, UniqueJSIObject> modulesCache;
38 };
39 } // namespace expo
40