@@ -7,10 +7,12 @@ namespace node {
77using v8::ArrayBuffer;
88using v8::Boolean;
99using v8::Context;
10+ using v8::Float64Array;
1011using v8::Function;
1112using v8::Integer;
1213using v8::String;
1314using v8::Uint32;
15+ using v8::Uint32Array;
1416using v8::Undefined;
1517
1618namespace http2 {
@@ -57,27 +59,18 @@ enum Http2OptionsIndex {
5759 IDX_OPTIONS_FLAGS
5860};
5961
60- static uint32_t http2_padding_buffer[3 ];
61- static uint32_t http2_options_buffer[IDX_OPTIONS_FLAGS + 1 ];
62- static uint32_t http2_settings_buffer[IDX_SETTINGS_COUNT + 1 ];
63- static double http2_session_state_buffer[IDX_SESSION_STATE_COUNT];
64- static double http2_stream_state_buffer[IDX_STREAM_STATE_COUNT];
65-
66- static const size_t http2_options_buffer_byte_length =
67- sizeof (http2_options_buffer) * (IDX_OPTIONS_FLAGS + 1 );
68- static const size_t http2_settings_buffer_byte_length =
69- sizeof (http2_settings_buffer) * (IDX_SETTINGS_COUNT + 1 );
70- static const size_t http2_padding_buffer_byte_length =
71- sizeof (http2_padding_buffer) * 3 ;
72- static const size_t http2_stream_state_buffer_byte_length =
73- sizeof (http2_stream_state_buffer) * IDX_STREAM_STATE_COUNT;
74- static const size_t http2_session_state_buffer_byte_length =
75- sizeof (http2_session_state_buffer) * IDX_SESSION_STATE_COUNT;
62+ struct http2_state {
63+ uint32_t padding_buffer[3 ];
64+ uint32_t options_buffer[IDX_OPTIONS_FLAGS + 1 ];
65+ uint32_t settings_buffer[IDX_SETTINGS_COUNT + 1 ];
66+ double session_state_buffer[IDX_SESSION_STATE_COUNT];
67+ double stream_state_buffer[IDX_STREAM_STATE_COUNT];
68+ };
7669
7770Http2Options::Http2Options (Environment* env) {
7871 nghttp2_option_new (&options_);
7972
80- uint32_t * buffer = http2_options_buffer ;
73+ uint32_t * buffer = env-> http2_state_buffer ()-> options_buffer ;
8174 uint32_t flags = buffer[IDX_OPTIONS_FLAGS];
8275
8376 if (flags & (1 << IDX_OPTIONS_MAX_DEFLATE_DYNAMIC_TABLE_SIZE)) {
@@ -126,7 +119,7 @@ ssize_t Http2Session::OnCallbackPadding(size_t frameLen,
126119 Context::Scope context_scope (context);
127120
128121 if (object ()->Has (context, env ()->ongetpadding_string ()).FromJust ()) {
129- uint32_t * buffer = http2_padding_buffer ;
122+ uint32_t * buffer = env ()-> http2_state_buffer ()-> padding_buffer ;
130123 buffer[0 ] = frameLen;
131124 buffer[1 ] = maxPayloadLen;
132125 MakeCallback (env ()->ongetpadding_string (), 0 , nullptr );
@@ -167,7 +160,7 @@ void PackSettings(const FunctionCallbackInfo<Value>& args) {
167160 std::vector<nghttp2_settings_entry> entries;
168161 entries.reserve (6 );
169162
170- uint32_t * buffer = http2_settings_buffer ;
163+ uint32_t * buffer = env-> http2_state_buffer ()-> settings_buffer ;
171164 uint32_t flags = buffer[IDX_SETTINGS_COUNT];
172165
173166 if (flags & (1 << IDX_SETTINGS_HEADER_TABLE_SIZE)) {
@@ -226,7 +219,8 @@ void PackSettings(const FunctionCallbackInfo<Value>& args) {
226219// Used to fill in the spec defined initial values for each setting.
227220void RefreshDefaultSettings (const FunctionCallbackInfo<Value>& args) {
228221 DEBUG_HTTP2 (" Http2Session: refreshing default settings\n " );
229- uint32_t * buffer = http2_settings_buffer;
222+ Environment* env = Environment::GetCurrent (args);
223+ uint32_t * buffer = env->http2_state_buffer ()->settings_buffer ;
230224 buffer[IDX_SETTINGS_HEADER_TABLE_SIZE] =
231225 DEFAULT_SETTINGS_HEADER_TABLE_SIZE;
232226 buffer[IDX_SETTINGS_ENABLE_PUSH] =
@@ -245,13 +239,14 @@ void RefreshDefaultSettings(const FunctionCallbackInfo<Value>& args) {
245239template <get_setting fn>
246240void RefreshSettings (const FunctionCallbackInfo<Value>& args) {
247241 DEBUG_HTTP2 (" Http2Session: refreshing settings for session\n " );
242+ Environment* env = Environment::GetCurrent (args);
248243 CHECK_EQ (args.Length (), 1 );
249244 CHECK (args[0 ]->IsObject ());
250245 Http2Session* session;
251246 ASSIGN_OR_RETURN_UNWRAP (&session, args[0 ].As <Object>());
252247 nghttp2_session* s = session->session ();
253248
254- uint32_t * buffer = http2_settings_buffer ;
249+ uint32_t * buffer = env-> http2_state_buffer ()-> settings_buffer ;
255250 buffer[IDX_SETTINGS_HEADER_TABLE_SIZE] =
256251 fn (s, NGHTTP2_SETTINGS_HEADER_TABLE_SIZE);
257252 buffer[IDX_SETTINGS_MAX_CONCURRENT_STREAMS] =
@@ -269,9 +264,10 @@ void RefreshSettings(const FunctionCallbackInfo<Value>& args) {
269264// Used to fill in the spec defined initial values for each setting.
270265void RefreshSessionState (const FunctionCallbackInfo<Value>& args) {
271266 DEBUG_HTTP2 (" Http2Session: refreshing session state\n " );
267+ Environment* env = Environment::GetCurrent (args);
272268 CHECK_EQ (args.Length (), 1 );
273269 CHECK (args[0 ]->IsObject ());
274- double * buffer = http2_session_state_buffer ;
270+ double * buffer = env-> http2_state_buffer ()-> session_state_buffer ;
275271 Http2Session* session;
276272 ASSIGN_OR_RETURN_UNWRAP (&session, args[0 ].As <Object>());
277273 nghttp2_session* s = session->session ();
@@ -308,7 +304,7 @@ void RefreshStreamState(const FunctionCallbackInfo<Value>& args) {
308304 nghttp2_session* s = session->session ();
309305 Nghttp2Stream* stream;
310306
311- double * buffer = http2_stream_state_buffer ;
307+ double * buffer = env-> http2_state_buffer ()-> stream_state_buffer ;
312308
313309 if ((stream = session->FindStream (id)) == nullptr ) {
314310 buffer[IDX_STREAM_STATE] = NGHTTP2_STREAM_STATE_IDLE;
@@ -418,8 +414,9 @@ void Http2Session::SubmitPriority(const FunctionCallbackInfo<Value>& args) {
418414void Http2Session::SubmitSettings (const FunctionCallbackInfo<Value>& args) {
419415 Http2Session* session;
420416 ASSIGN_OR_RETURN_UNWRAP (&session, args.Holder ());
417+ Environment* env = session->env ();
421418
422- uint32_t * buffer = http2_settings_buffer ;
419+ uint32_t * buffer = env-> http2_state_buffer ()-> settings_buffer ;
423420 uint32_t flags = buffer[IDX_SETTINGS_COUNT];
424421
425422 std::vector<nghttp2_settings_entry> entries;
@@ -1148,43 +1145,27 @@ void Initialize(Local<Object> target,
11481145 Isolate* isolate = env->isolate ();
11491146 HandleScope scope (isolate);
11501147
1151- // Initialize the buffer used for padding callbacks
1152- target->Set (context,
1153- FIXED_ONE_BYTE_STRING (isolate, " paddingArrayBuffer" ),
1154- ArrayBuffer::New (isolate,
1155- &http2_padding_buffer,
1156- http2_padding_buffer_byte_length))
1157- .FromJust ();
1148+ http2_state* state = Calloc<http2_state>(1 );
1149+ env->set_http2_state_buffer (state);
1150+ auto state_ab = ArrayBuffer::New (isolate, state, sizeof (*state));
11581151
1159- // Initialize the buffer used to store the session state
1160- target->Set (context,
1161- FIXED_ONE_BYTE_STRING (isolate, " sessionStateArrayBuffer " ),
1162- ArrayBuffer ::New (isolate,
1163- &http2_session_state_buffer,
1164- http2_session_state_buffer_byte_length))
1165- .FromJust ();
1152+ # define SET_STATE_TYPEDARRAY ( name, type, field ) \
1153+ target->Set (context, \
1154+ FIXED_ONE_BYTE_STRING (isolate, (name)), \
1155+ type ::New (state_ab, \
1156+ offsetof (http2_state, field), \
1157+ arraysize (state-> field ))) \
1158+ .FromJust ()
11661159
1160+ // Initialize the buffer used for padding callbacks
1161+ SET_STATE_TYPEDARRAY (" paddingBuffer" , Uint32Array, padding_buffer);
1162+ // Initialize the buffer used to store the session state
1163+ SET_STATE_TYPEDARRAY (" sessionState" , Float64Array, session_state_buffer);
11671164 // Initialize the buffer used to store the stream state
1168- target->Set (context,
1169- FIXED_ONE_BYTE_STRING (isolate, " streamStateArrayBuffer" ),
1170- ArrayBuffer::New (isolate,
1171- &http2_stream_state_buffer,
1172- http2_stream_state_buffer_byte_length))
1173- .FromJust ();
1174-
1175- target->Set (context,
1176- FIXED_ONE_BYTE_STRING (isolate, " settingsArrayBuffer" ),
1177- ArrayBuffer::New (isolate,
1178- &http2_settings_buffer,
1179- http2_settings_buffer_byte_length))
1180- .FromJust ();
1181-
1182- target->Set (context,
1183- FIXED_ONE_BYTE_STRING (isolate, " optionsArrayBuffer" ),
1184- ArrayBuffer::New (isolate,
1185- &http2_options_buffer,
1186- http2_options_buffer_byte_length))
1187- .FromJust ();
1165+ SET_STATE_TYPEDARRAY (" streamState" , Float64Array, stream_state_buffer);
1166+ SET_STATE_TYPEDARRAY (" settingsBuffer" , Uint32Array, settings_buffer);
1167+ SET_STATE_TYPEDARRAY (" optionsBuffer" , Uint32Array, options_buffer);
1168+ #undef SET_STATE_TYPEDARRAY
11881169
11891170 // Method to fetch the nghttp2 string description of an nghttp2 error code
11901171 env->SetMethod (target, " nghttp2ErrorString" , HttpErrorString);
0 commit comments