@@ -37,6 +37,29 @@ std::unique_ptr<StringBuffer> ToProtocolString(Isolate* isolate,
3737 return StringBuffer::create (StringView (*buffer, buffer.length ()));
3838}
3939
40+ struct LocalConnection {
41+ static std::unique_ptr<InspectorSession> Connect (
42+ Agent* inspector, std::unique_ptr<InspectorSessionDelegate> delegate) {
43+ return inspector->Connect (std::move (delegate), false );
44+ }
45+
46+ static Local<String> GetClassName (Environment* env) {
47+ return FIXED_ONE_BYTE_STRING (env->isolate (), " Connection" );
48+ }
49+ };
50+
51+ struct MainThreadConnection {
52+ static std::unique_ptr<InspectorSession> Connect (
53+ Agent* inspector, std::unique_ptr<InspectorSessionDelegate> delegate) {
54+ return inspector->ConnectToMainThread (std::move (delegate), true );
55+ }
56+
57+ static Local<String> GetClassName (Environment* env) {
58+ return FIXED_ONE_BYTE_STRING (env->isolate (), " MainThreadConnection" );
59+ }
60+ };
61+
62+ template <typename ConnectionType>
4063class JSBindingsConnection : public AsyncWrap {
4164 public:
4265 class JSBindingsSessionDelegate : public InspectorSessionDelegate {
@@ -70,14 +93,29 @@ class JSBindingsConnection : public AsyncWrap {
7093 : AsyncWrap(env, wrap, PROVIDER_INSPECTORJSBINDING),
7194 callback_(env->isolate (), callback) {
7295 Agent* inspector = env->inspector_agent ();
73- session_ = inspector-> Connect (std::make_unique<JSBindingsSessionDelegate> (
74- env, this ), false );
96+ session_ = ConnectionType::Connect (
97+ inspector, std::make_unique<JSBindingsSessionDelegate>( env, this ));
7598 }
7699
77100 void OnMessage (Local<Value> value) {
78101 MakeCallback (callback_.Get (env ()->isolate ()), 1 , &value);
79102 }
80103
104+ static void Bind (Environment* env, Local<Object> target) {
105+ Local<String> class_name = ConnectionType::GetClassName (env);
106+ Local<FunctionTemplate> tmpl =
107+ env->NewFunctionTemplate (JSBindingsConnection::New);
108+ tmpl->InstanceTemplate ()->SetInternalFieldCount (1 );
109+ tmpl->SetClassName (class_name);
110+ tmpl->Inherit (AsyncWrap::GetConstructorTemplate (env));
111+ env->SetProtoMethod (tmpl, " dispatch" , JSBindingsConnection::Dispatch);
112+ env->SetProtoMethod (tmpl, " disconnect" , JSBindingsConnection::Disconnect);
113+ target->Set (env->context (),
114+ class_name,
115+ tmpl->GetFunction (env->context ()).ToLocalChecked ())
116+ .ToChecked ();
117+ }
118+
81119 static void New (const FunctionCallbackInfo<Value>& info) {
82120 Environment* env = Environment::GetCurrent (info);
83121 CHECK (info[0 ]->IsFunction ());
@@ -300,18 +338,8 @@ void Initialize(Local<Object> target, Local<Value> unused,
300338 env->SetMethod (target, " registerAsyncHook" , RegisterAsyncHookWrapper);
301339 env->SetMethodNoSideEffect (target, " isEnabled" , IsEnabled);
302340
303- auto conn_str = FIXED_ONE_BYTE_STRING (env->isolate (), " Connection" );
304- Local<FunctionTemplate> tmpl =
305- env->NewFunctionTemplate (JSBindingsConnection::New);
306- tmpl->InstanceTemplate ()->SetInternalFieldCount (1 );
307- tmpl->SetClassName (conn_str);
308- tmpl->Inherit (AsyncWrap::GetConstructorTemplate (env));
309- env->SetProtoMethod (tmpl, " dispatch" , JSBindingsConnection::Dispatch);
310- env->SetProtoMethod (tmpl, " disconnect" , JSBindingsConnection::Disconnect);
311- target
312- ->Set (env->context (), conn_str,
313- tmpl->GetFunction (env->context ()).ToLocalChecked ())
314- .ToChecked ();
341+ JSBindingsConnection<LocalConnection>::Bind (env, target);
342+ JSBindingsConnection<MainThreadConnection>::Bind (env, target);
315343}
316344
317345} // namespace
0 commit comments