// Copyright (c) 2022 Microsoft, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ELECTRON_SHELL_SERVICES_NODE_PARENT_PORT_H_ #define ELECTRON_SHELL_SERVICES_NODE_PARENT_PORT_H_ #include #include "gin/wrappable.h" #include "mojo/public/cpp/bindings/connector.h" #include "mojo/public/cpp/bindings/message.h" #include "shell/browser/event_emitter_mixin.h" namespace v8 { template class Local; class Value; class Isolate; } // namespace v8 namespace gin { class Arguments; template class Handle; } // namespace gin namespace electron { // There is only a single instance of this class // for the lifetime of a Utility Process which // also means that GC lifecycle is ignored by this class. class ParentPort final : public gin::Wrappable, public mojo::MessageReceiver { public: static ParentPort* GetInstance(); static gin::Handle Create(v8::Isolate* isolate); ParentPort(const ParentPort&) = delete; ParentPort& operator=(const ParentPort&) = delete; ParentPort(); ~ParentPort() override; void Initialize(blink::MessagePortDescriptor port); // gin::Wrappable static gin::WrapperInfo kWrapperInfo; gin::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) override; const char* GetTypeName() override; private: void PostMessage(v8::Local message_value); void Close(); void Start(); void Pause(); // mojo::MessageReceiver bool Accept(mojo::Message* mojo_message) override; bool connector_closed_ = false; std::unique_ptr connector_; blink::MessagePortDescriptor port_; }; } // namespace electron #endif // ELECTRON_SHELL_SERVICES_NODE_PARENT_PORT_H_