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