@@ -851,7 +851,7 @@ ssize_t Http2Session::OnCallbackPadding(size_t frameLen,
851
851
buffer[PADDING_BUF_FRAME_LENGTH] = frameLen;
852
852
buffer[PADDING_BUF_MAX_PAYLOAD_LENGTH] = maxPayloadLen;
853
853
buffer[PADDING_BUF_RETURN_VALUE] = frameLen;
854
- MakeCallback (env ()->ongetpadding_string (), 0 , nullptr );
854
+ MakeCallback (env ()->http2session_on_select_padding_function (), 0 , nullptr );
855
855
uint32_t retval = buffer[PADDING_BUF_RETURN_VALUE];
856
856
retval = std::min (retval, static_cast <uint32_t >(maxPayloadLen));
857
857
retval = std::max (retval, static_cast <uint32_t >(frameLen));
@@ -1017,7 +1017,7 @@ int Http2Session::OnInvalidFrame(nghttp2_session* handle,
1017
1017
Local<Context> context = env->context ();
1018
1018
Context::Scope context_scope (context);
1019
1019
Local<Value> arg = Integer::New (isolate, lib_error_code);
1020
- session->MakeCallback (env->error_string (), 1 , &arg);
1020
+ session->MakeCallback (env->http2session_on_error_function (), 1 , &arg);
1021
1021
}
1022
1022
return 0 ;
1023
1023
}
@@ -1054,7 +1054,9 @@ int Http2Session::OnFrameNotSent(nghttp2_session* handle,
1054
1054
Integer::New (isolate, frame->hd .type ),
1055
1055
Integer::New (isolate, error_code)
1056
1056
};
1057
- session->MakeCallback (env->onframeerror_string (), arraysize (argv), argv);
1057
+ session->MakeCallback (
1058
+ env->http2session_on_frame_error_function (),
1059
+ arraysize (argv), argv);
1058
1060
return 0 ;
1059
1061
}
1060
1062
@@ -1085,22 +1087,19 @@ int Http2Session::OnStreamClose(nghttp2_session* handle,
1085
1087
return 0 ;
1086
1088
1087
1089
stream->Close (code);
1090
+
1088
1091
// It is possible for the stream close to occur before the stream is
1089
- // ever passed on to the javascript side. If that happens, skip straight
1090
- // to destroying the stream. We can check this by looking for the
1091
- // onstreamclose function. If it exists, then the stream has already
1092
- // been passed on to javascript.
1093
- Local<Value> fn =
1094
- stream-> object ()-> Get (context, env-> onstreamclose_string ())
1095
- . ToLocalChecked ();
1096
-
1097
- if (!fn-> IsFunction ()) {
1092
+ // ever passed on to the javascript side. If that happens, the callback
1093
+ // will return false.
1094
+ Local<Value> arg = Integer::NewFromUnsigned (isolate, code);
1095
+ MaybeLocal<Value> answer =
1096
+ stream-> MakeCallback (env-> http2session_on_stream_close_function (),
1097
+ 1 , &arg);
1098
+ if (answer. IsEmpty () ||
1099
+ !(answer. ToLocalChecked ()-> BooleanValue (env-> context ()). FromJust ())) {
1100
+ // Skip to destroy
1098
1101
stream->Destroy ();
1099
- return 0 ;
1100
1102
}
1101
-
1102
- Local<Value> arg = Integer::NewFromUnsigned (isolate, code);
1103
- stream->MakeCallback (fn.As <Function>(), 1 , &arg);
1104
1103
return 0 ;
1105
1104
}
1106
1105
@@ -1233,7 +1232,7 @@ int Http2Session::OnNghttpError(nghttp2_session* handle,
1233
1232
Local<Context> context = env->context ();
1234
1233
Context::Scope context_scope (context);
1235
1234
Local<Value> arg = Integer::New (isolate, NGHTTP2_ERR_PROTO);
1236
- session->MakeCallback (env->error_string (), 1 , &arg);
1235
+ session->MakeCallback (env->http2session_on_error_function (), 1 , &arg);
1237
1236
}
1238
1237
return 0 ;
1239
1238
}
@@ -1317,7 +1316,8 @@ void Http2Session::HandleHeadersFrame(const nghttp2_frame* frame) {
1317
1316
Integer::New (isolate, stream->headers_category ()),
1318
1317
Integer::New (isolate, frame->hd .flags ),
1319
1318
Array::New (isolate, headers_v.data (), headers_size * 2 )};
1320
- MakeCallback (env ()->onheaders_string (), arraysize (args), args);
1319
+ MakeCallback (env ()->http2session_on_headers_function (),
1320
+ arraysize (args), args);
1321
1321
}
1322
1322
1323
1323
@@ -1343,7 +1343,8 @@ void Http2Session::HandlePriorityFrame(const nghttp2_frame* frame) {
1343
1343
Integer::New (isolate, spec.weight ),
1344
1344
Boolean::New (isolate, spec.exclusive )
1345
1345
};
1346
- MakeCallback (env ()->onpriority_string (), arraysize (argv), argv);
1346
+ MakeCallback (env ()->http2session_on_priority_function (),
1347
+ arraysize (argv), argv);
1347
1348
}
1348
1349
1349
1350
@@ -1383,7 +1384,8 @@ void Http2Session::HandleGoawayFrame(const nghttp2_frame* frame) {
1383
1384
length).ToLocalChecked ();
1384
1385
}
1385
1386
1386
- MakeCallback (env ()->ongoawaydata_string (), arraysize (argv), argv);
1387
+ MakeCallback (env ()->http2session_on_goaway_data_function (),
1388
+ arraysize (argv), argv);
1387
1389
}
1388
1390
1389
1391
// Called by OnFrameReceived when a complete ALTSVC frame has been received.
@@ -1411,7 +1413,8 @@ void Http2Session::HandleAltSvcFrame(const nghttp2_frame* frame) {
1411
1413
altsvc->field_value_len ).ToLocalChecked (),
1412
1414
};
1413
1415
1414
- MakeCallback (env ()->onaltsvc_string (), arraysize (argv), argv);
1416
+ MakeCallback (env ()->http2session_on_altsvc_function (),
1417
+ arraysize (argv), argv);
1415
1418
}
1416
1419
1417
1420
void Http2Session::HandleOriginFrame (const nghttp2_frame* frame) {
@@ -1436,7 +1439,7 @@ void Http2Session::HandleOriginFrame(const nghttp2_frame* frame) {
1436
1439
.ToLocalChecked ();
1437
1440
}
1438
1441
Local<Value> holder = Array::New (isolate, origin_v.data (), origin_v.size ());
1439
- MakeCallback (env ()->onorigin_string (), 1 , &holder);
1442
+ MakeCallback (env ()->http2session_on_origin_function (), 1 , &holder);
1440
1443
}
1441
1444
1442
1445
// Called by OnFrameReceived when a complete PING frame has been received.
@@ -1457,7 +1460,7 @@ void Http2Session::HandlePingFrame(const nghttp2_frame* frame) {
1457
1460
// is buggy or malicious, and we're not going to tolerate such
1458
1461
// nonsense.
1459
1462
arg = Integer::New (isolate, NGHTTP2_ERR_PROTO);
1460
- MakeCallback (env ()->error_string (), 1 , &arg);
1463
+ MakeCallback (env ()->http2session_on_error_function (), 1 , &arg);
1461
1464
return ;
1462
1465
}
1463
1466
@@ -1469,15 +1472,15 @@ void Http2Session::HandlePingFrame(const nghttp2_frame* frame) {
1469
1472
arg = Buffer::Copy (env (),
1470
1473
reinterpret_cast <const char *>(frame->ping .opaque_data ),
1471
1474
8 ).ToLocalChecked ();
1472
- MakeCallback (env ()->onping_string (), 1 , &arg);
1475
+ MakeCallback (env ()->http2session_on_ping_function (), 1 , &arg);
1473
1476
}
1474
1477
1475
1478
// Called by OnFrameReceived when a complete SETTINGS frame has been received.
1476
1479
void Http2Session::HandleSettingsFrame (const nghttp2_frame* frame) {
1477
1480
bool ack = frame->hd .flags & NGHTTP2_FLAG_ACK;
1478
1481
if (!ack) {
1479
1482
// This is not a SETTINGS acknowledgement, notify and return
1480
- MakeCallback (env ()->onsettings_string (), 0 , nullptr );
1483
+ MakeCallback (env ()->http2session_on_settings_function (), 0 , nullptr );
1481
1484
return ;
1482
1485
}
1483
1486
@@ -1502,7 +1505,7 @@ void Http2Session::HandleSettingsFrame(const nghttp2_frame* frame) {
1502
1505
Local<Context> context = env ()->context ();
1503
1506
Context::Scope context_scope (context);
1504
1507
Local<Value> arg = Integer::New (isolate, NGHTTP2_ERR_PROTO);
1505
- MakeCallback (env ()->error_string (), 1 , &arg);
1508
+ MakeCallback (env ()->http2session_on_error_function (), 1 , &arg);
1506
1509
}
1507
1510
1508
1511
// Callback used when data has been written to the stream.
@@ -1827,7 +1830,7 @@ void Http2Session::OnStreamRead(ssize_t nread, const uv_buf_t& buf) {
1827
1830
if (UNLIKELY (ret < 0 )) {
1828
1831
Debug (this , " fatal error receiving data: %d" , ret);
1829
1832
Local<Value> arg = Integer::New (isolate, ret);
1830
- MakeCallback (env ()->error_string (), 1 , &arg);
1833
+ MakeCallback (env ()->http2session_on_error_function (), 1 , &arg);
1831
1834
return ;
1832
1835
}
1833
1836
@@ -2032,7 +2035,7 @@ void Http2Stream::OnTrailers() {
2032
2035
Local<Context> context = env ()->context ();
2033
2036
Context::Scope context_scope (context);
2034
2037
flags_ &= ~NGHTTP2_STREAM_FLAG_TRAILERS;
2035
- MakeCallback (env ()->ontrailers_string (), 0 , nullptr );
2038
+ MakeCallback (env ()->http2session_on_stream_trailers_function (), 0 , nullptr );
2036
2039
}
2037
2040
2038
2041
// Submit informational headers for a stream.
@@ -2898,6 +2901,29 @@ void nghttp2_header::MemoryInfo(MemoryTracker* tracker) const {
2898
2901
tracker->TrackFieldWithSize (" value" , nghttp2_rcbuf_get_buf (value).len );
2899
2902
}
2900
2903
2904
+ void SetCallbackFunctions (const FunctionCallbackInfo<Value>& args) {
2905
+ Environment* env = Environment::GetCurrent (args);
2906
+ CHECK_EQ (args.Length (), 12 );
2907
+
2908
+ #define SET_FUNCTION (arg, name ) \
2909
+ CHECK (args[arg]->IsFunction ()); \
2910
+ env->set_http2session_on_ ## name ## _function (args[arg].As <Function>());
2911
+
2912
+ SET_FUNCTION (0 , error)
2913
+ SET_FUNCTION (1 , priority)
2914
+ SET_FUNCTION (2 , settings)
2915
+ SET_FUNCTION (3 , ping)
2916
+ SET_FUNCTION (4 , headers)
2917
+ SET_FUNCTION (5 , frame_error)
2918
+ SET_FUNCTION (6 , goaway_data)
2919
+ SET_FUNCTION (7 , altsvc)
2920
+ SET_FUNCTION (8 , origin)
2921
+ SET_FUNCTION (9 , select_padding)
2922
+ SET_FUNCTION (10 , stream_trailers)
2923
+ SET_FUNCTION (11 , stream_close)
2924
+
2925
+ #undef SET_FUNCTION
2926
+ }
2901
2927
2902
2928
// Set up the process.binding('http2') binding.
2903
2929
void Initialize (Local<Object> target,
@@ -3106,6 +3132,7 @@ HTTP_STATUS_CODES(V)
3106
3132
3107
3133
env->SetMethod (target, " refreshDefaultSettings" , RefreshDefaultSettings);
3108
3134
env->SetMethod (target, " packSettings" , PackSettings);
3135
+ env->SetMethod (target, " setCallbackFunctions" , SetCallbackFunctions);
3109
3136
3110
3137
target->Set (context,
3111
3138
env->constants_string (),
0 commit comments