// Copyright 2004-present Facebook. All Rights Reserved. #include "RAMBundleRegistry.h" #include #include #include namespace facebook { namespace react { constexpr uint32_t RAMBundleRegistry::MAIN_BUNDLE_ID; std::unique_ptr RAMBundleRegistry::singleBundleRegistry(std::unique_ptr mainBundle) { RAMBundleRegistry *registry = new RAMBundleRegistry(std::move(mainBundle)); return std::unique_ptr(registry); } std::unique_ptr RAMBundleRegistry::multipleBundlesRegistry(std::unique_ptr mainBundle, std::function(std::string)> factory) { RAMBundleRegistry *registry = new RAMBundleRegistry(std::move(mainBundle), std::move(factory)); return std::unique_ptr(registry); } RAMBundleRegistry::RAMBundleRegistry(std::unique_ptr mainBundle, std::function(std::string)> factory): m_factory(factory) { m_bundles.emplace(MAIN_BUNDLE_ID, std::move(mainBundle)); } void RAMBundleRegistry::registerBundle(uint32_t bundleId, std::string bundlePath) { m_bundlePaths.emplace(bundleId, bundlePath); } JSModulesUnbundle::Module RAMBundleRegistry::getModule(uint32_t bundleId, uint32_t moduleId) { if (m_bundles.find(bundleId) == m_bundles.end()) { if (!m_factory) { throw std::runtime_error("You need to register factory function in order to support multiple RAM bundles."); } auto bundlePath = m_bundlePaths.find(bundleId); if (bundlePath == m_bundlePaths.end()) { throw std::runtime_error("In order to fetch RAM bundle from the registry, its file path needs to be registered first."); } m_bundles.emplace(bundleId, m_factory(bundlePath->second)); } auto module = getBundle(bundleId)->getModule(moduleId); if (bundleId == MAIN_BUNDLE_ID) { return module; } return { folly::to("seg-", bundleId, '_', std::move(module.name)), std::move(module.code), }; } JSModulesUnbundle *RAMBundleRegistry::getBundle(uint32_t bundleId) const { return m_bundles.at(bundleId).get(); } } // namespace react } // namespace facebook