#pragma once #include #include #include #include "transferable.h" #include "context_handle.h" #include "transferable.h" namespace ivm { class NativeModule { private: using init_t = void(*)(v8::Isolate *, v8::Local, v8::Local); uv_lib_t lib; init_t init; public: explicit NativeModule(const std::string& filename); NativeModule(const NativeModule&) = delete; auto operator= (const NativeModule&) -> NativeModule& = delete; ~NativeModule(); void InitForContext(v8::Isolate* isolate, v8::Local context, v8::Local target); }; class NativeModuleHandle : public TransferableHandle { private: class NativeModuleTransferable : public Transferable { private: std::shared_ptr module; public: explicit NativeModuleTransferable(std::shared_ptr module); auto TransferIn() -> v8::Local final; }; std::shared_ptr module; template auto Create(ContextHandle& context_handle) -> v8::Local; public: explicit NativeModuleHandle(std::shared_ptr module); static auto Definition() -> v8::Local; static auto New(v8::Local value) -> std::unique_ptr; auto TransferOut() -> std::unique_ptr final; }; } // namespace ivm