#pragma once #include #include #include #include "isolate/holder.h" #include "isolate/remote_handle.h" #include "transferable.h" namespace ivm { struct ModuleInfo { // Underlying data on the module. Some information is stored outside of v8 so there is a separate // struct to hold this data, which is then referenced by any number of handles. friend struct InstantiateRunner; friend class ModuleHandle; enum class LinkStatus { None, Linking, Linked }; std::mutex mutex; class ModuleLinker* linker = nullptr; LinkStatus link_status = LinkStatus::None; int identity_hash; std::vector dependency_specifiers; std::unordered_map> resolutions; RemoteHandle handle; RemoteHandle context_handle; RemoteHandle global_namespace; RemoteHandle meta_callback; explicit ModuleInfo(v8::Local handle); ModuleInfo(const ModuleInfo&) = delete; auto operator=(const ModuleInfo&) = delete; ~ModuleInfo(); }; class ModuleHandle : public TransferableHandle { private: class ModuleHandleTransferable : public Transferable { private: std::shared_ptr info; public: explicit ModuleHandleTransferable(std::shared_ptr info); auto TransferIn() -> v8::Local final; }; std::shared_ptr info; public: using DontFreezeInstance = void; explicit ModuleHandle(std::shared_ptr info); static auto Definition() -> v8::Local; auto TransferOut() -> std::unique_ptr final; auto GetDependencySpecifiers() -> v8::Local; auto GetInfo() const -> std::shared_ptr; auto Release() -> v8::Local; auto Instantiate(class ContextHandle& context_handle, v8::Local callback) -> v8::Local; auto InstantiateSync(class ContextHandle& context_handle, v8::Local callback) -> v8::Local; template auto Evaluate(v8::MaybeLocal maybe_options) -> v8::Local; auto GetNamespace() -> v8::Local; static void InitializeImportMeta(v8::Local context, v8::Local module, v8::Local meta); }; } // namespace ivm