@@ -37,6 +37,29 @@ std::unique_ptr<StringBuffer> ToProtocolString(Isolate* isolate,
37
37
return StringBuffer::create (StringView (*buffer, buffer.length ()));
38
38
}
39
39
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>
40
63
class JSBindingsConnection : public AsyncWrap {
41
64
public:
42
65
class JSBindingsSessionDelegate : public InspectorSessionDelegate {
@@ -70,14 +93,29 @@ class JSBindingsConnection : public AsyncWrap {
70
93
: AsyncWrap(env, wrap, PROVIDER_INSPECTORJSBINDING),
71
94
callback_(env->isolate (), callback) {
72
95
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 ));
75
98
}
76
99
77
100
void OnMessage (Local<Value> value) {
78
101
MakeCallback (callback_.Get (env ()->isolate ()), 1 , &value);
79
102
}
80
103
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
+
81
119
static void New (const FunctionCallbackInfo<Value>& info) {
82
120
Environment* env = Environment::GetCurrent (info);
83
121
CHECK (info[0 ]->IsFunction ());
@@ -300,18 +338,8 @@ void Initialize(Local<Object> target, Local<Value> unused,
300
338
env->SetMethod (target, " registerAsyncHook" , RegisterAsyncHookWrapper);
301
339
env->SetMethodNoSideEffect (target, " isEnabled" , IsEnabled);
302
340
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);
315
343
}
316
344
317
345
} // namespace
0 commit comments