// Copyright (c) 2023 Salesforce, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ELECTRON_SHELL_COMMON_GIN_HELPER_REPLY_CHANNEL_H_ #define ELECTRON_SHELL_COMMON_GIN_HELPER_REPLY_CHANNEL_H_ #include "gin/wrappable.h" #include "shell/common/api/api.mojom.h" namespace gin { template class Handle; } // namespace gin namespace v8 { class Isolate; template class Local; class Object; class ObjectTemplate; } // namespace v8 namespace gin_helper::internal { // This object wraps the InvokeCallback so that if it gets GC'd by V8, we can // still call the callback and send an error. Not doing so causes a Mojo DCHECK, // since Mojo requires callbacks to be called before they are destroyed. class ReplyChannel : public gin::Wrappable { public: using InvokeCallback = electron::mojom::ElectronApiIPC::InvokeCallback; static gin::Handle Create(v8::Isolate* isolate, InvokeCallback callback); // gin::Wrappable static gin::WrapperInfo kWrapperInfo; gin::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) override; const char* GetTypeName() override; void SendError(const std::string& msg); private: explicit ReplyChannel(InvokeCallback callback); ~ReplyChannel() override; bool SendReply(v8::Isolate* isolate, v8::Local arg); InvokeCallback callback_; }; } // namespace gin_helper::internal #endif // ELECTRON_SHELL_COMMON_GIN_HELPER_REPLY_CHANNEL_H_