164f5c95fSŁukasz Kosmaty // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
264f5c95fSŁukasz Kosmaty 
364f5c95fSŁukasz Kosmaty #pragma once
464f5c95fSŁukasz Kosmaty 
564f5c95fSŁukasz Kosmaty #include "JSIInteropModuleRegistry.h"
664f5c95fSŁukasz Kosmaty 
764f5c95fSŁukasz Kosmaty #include <jsi/jsi.h>
864f5c95fSŁukasz Kosmaty 
964f5c95fSŁukasz Kosmaty #include <vector>
10*b627df43SŁukasz Kosmaty #import <unordered_map>
1164f5c95fSŁukasz Kosmaty 
1264f5c95fSŁukasz Kosmaty namespace jsi = facebook::jsi;
1364f5c95fSŁukasz Kosmaty 
1464f5c95fSŁukasz Kosmaty namespace expo {
15*b627df43SŁukasz Kosmaty 
16*b627df43SŁukasz Kosmaty using UniqueJSIObject = std::unique_ptr<jsi::Object>;
17*b627df43SŁukasz Kosmaty 
1864f5c95fSŁukasz Kosmaty /**
1964f5c95fSŁukasz Kosmaty  * An entry point to all exported functionalities like modules.
2064f5c95fSŁukasz Kosmaty  *
2164f5c95fSŁukasz Kosmaty  * An instance of this class will be added to the JS global object.
2264f5c95fSŁukasz Kosmaty  */
2364f5c95fSŁukasz Kosmaty class ExpoModulesHostObject : public jsi::HostObject {
2464f5c95fSŁukasz Kosmaty public:
2564f5c95fSŁukasz Kosmaty   ExpoModulesHostObject(JSIInteropModuleRegistry *installer);
2664f5c95fSŁukasz Kosmaty 
2733ae33eaSŁukasz Kosmaty   ~ExpoModulesHostObject() override;
2833ae33eaSŁukasz Kosmaty 
2964f5c95fSŁukasz Kosmaty   jsi::Value get(jsi::Runtime &, const jsi::PropNameID &name) override;
3064f5c95fSŁukasz Kosmaty 
3164f5c95fSŁukasz Kosmaty   void set(jsi::Runtime &, const jsi::PropNameID &name, const jsi::Value &value) override;
3264f5c95fSŁukasz Kosmaty 
3364f5c95fSŁukasz Kosmaty   std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
3464f5c95fSŁukasz Kosmaty 
3564f5c95fSŁukasz Kosmaty private:
3664f5c95fSŁukasz Kosmaty   JSIInteropModuleRegistry *installer;
37*b627df43SŁukasz Kosmaty   std::unordered_map<std::string, UniqueJSIObject> modulesCache;
3864f5c95fSŁukasz Kosmaty };
3964f5c95fSŁukasz Kosmaty } // namespace expo
40