@@ -7,10 +7,12 @@ namespace node {
7
7
using v8::ArrayBuffer;
8
8
using v8::Boolean ;
9
9
using v8::Context;
10
+ using v8::Float64Array;
10
11
using v8::Function;
11
12
using v8::Integer;
12
13
using v8::String;
13
14
using v8::Uint32;
15
+ using v8::Uint32Array;
14
16
using v8::Undefined;
15
17
16
18
namespace http2 {
@@ -57,27 +59,18 @@ enum Http2OptionsIndex {
57
59
IDX_OPTIONS_FLAGS
58
60
};
59
61
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
+ };
76
69
77
70
Http2Options::Http2Options (Environment* env) {
78
71
nghttp2_option_new (&options_);
79
72
80
- uint32_t * buffer = http2_options_buffer ;
73
+ uint32_t * buffer = env-> http2_state_buffer ()-> options_buffer ;
81
74
uint32_t flags = buffer[IDX_OPTIONS_FLAGS];
82
75
83
76
if (flags & (1 << IDX_OPTIONS_MAX_DEFLATE_DYNAMIC_TABLE_SIZE)) {
@@ -126,7 +119,7 @@ ssize_t Http2Session::OnCallbackPadding(size_t frameLen,
126
119
Context::Scope context_scope (context);
127
120
128
121
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 ;
130
123
buffer[0 ] = frameLen;
131
124
buffer[1 ] = maxPayloadLen;
132
125
MakeCallback (env ()->ongetpadding_string (), 0 , nullptr );
@@ -167,7 +160,7 @@ void PackSettings(const FunctionCallbackInfo<Value>& args) {
167
160
std::vector<nghttp2_settings_entry> entries;
168
161
entries.reserve (6 );
169
162
170
- uint32_t * buffer = http2_settings_buffer ;
163
+ uint32_t * buffer = env-> http2_state_buffer ()-> settings_buffer ;
171
164
uint32_t flags = buffer[IDX_SETTINGS_COUNT];
172
165
173
166
if (flags & (1 << IDX_SETTINGS_HEADER_TABLE_SIZE)) {
@@ -226,7 +219,8 @@ void PackSettings(const FunctionCallbackInfo<Value>& args) {
226
219
// Used to fill in the spec defined initial values for each setting.
227
220
void RefreshDefaultSettings (const FunctionCallbackInfo<Value>& args) {
228
221
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 ;
230
224
buffer[IDX_SETTINGS_HEADER_TABLE_SIZE] =
231
225
DEFAULT_SETTINGS_HEADER_TABLE_SIZE;
232
226
buffer[IDX_SETTINGS_ENABLE_PUSH] =
@@ -245,13 +239,14 @@ void RefreshDefaultSettings(const FunctionCallbackInfo<Value>& args) {
245
239
template <get_setting fn>
246
240
void RefreshSettings (const FunctionCallbackInfo<Value>& args) {
247
241
DEBUG_HTTP2 (" Http2Session: refreshing settings for session\n " );
242
+ Environment* env = Environment::GetCurrent (args);
248
243
CHECK_EQ (args.Length (), 1 );
249
244
CHECK (args[0 ]->IsObject ());
250
245
Http2Session* session;
251
246
ASSIGN_OR_RETURN_UNWRAP (&session, args[0 ].As <Object>());
252
247
nghttp2_session* s = session->session ();
253
248
254
- uint32_t * buffer = http2_settings_buffer ;
249
+ uint32_t * buffer = env-> http2_state_buffer ()-> settings_buffer ;
255
250
buffer[IDX_SETTINGS_HEADER_TABLE_SIZE] =
256
251
fn (s, NGHTTP2_SETTINGS_HEADER_TABLE_SIZE);
257
252
buffer[IDX_SETTINGS_MAX_CONCURRENT_STREAMS] =
@@ -269,9 +264,10 @@ void RefreshSettings(const FunctionCallbackInfo<Value>& args) {
269
264
// Used to fill in the spec defined initial values for each setting.
270
265
void RefreshSessionState (const FunctionCallbackInfo<Value>& args) {
271
266
DEBUG_HTTP2 (" Http2Session: refreshing session state\n " );
267
+ Environment* env = Environment::GetCurrent (args);
272
268
CHECK_EQ (args.Length (), 1 );
273
269
CHECK (args[0 ]->IsObject ());
274
- double * buffer = http2_session_state_buffer ;
270
+ double * buffer = env-> http2_state_buffer ()-> session_state_buffer ;
275
271
Http2Session* session;
276
272
ASSIGN_OR_RETURN_UNWRAP (&session, args[0 ].As <Object>());
277
273
nghttp2_session* s = session->session ();
@@ -308,7 +304,7 @@ void RefreshStreamState(const FunctionCallbackInfo<Value>& args) {
308
304
nghttp2_session* s = session->session ();
309
305
Nghttp2Stream* stream;
310
306
311
- double * buffer = http2_stream_state_buffer ;
307
+ double * buffer = env-> http2_state_buffer ()-> stream_state_buffer ;
312
308
313
309
if ((stream = session->FindStream (id)) == nullptr ) {
314
310
buffer[IDX_STREAM_STATE] = NGHTTP2_STREAM_STATE_IDLE;
@@ -418,8 +414,9 @@ void Http2Session::SubmitPriority(const FunctionCallbackInfo<Value>& args) {
418
414
void Http2Session::SubmitSettings (const FunctionCallbackInfo<Value>& args) {
419
415
Http2Session* session;
420
416
ASSIGN_OR_RETURN_UNWRAP (&session, args.Holder ());
417
+ Environment* env = session->env ();
421
418
422
- uint32_t * buffer = http2_settings_buffer ;
419
+ uint32_t * buffer = env-> http2_state_buffer ()-> settings_buffer ;
423
420
uint32_t flags = buffer[IDX_SETTINGS_COUNT];
424
421
425
422
std::vector<nghttp2_settings_entry> entries;
@@ -1148,43 +1145,27 @@ void Initialize(Local<Object> target,
1148
1145
Isolate* isolate = env->isolate ();
1149
1146
HandleScope scope (isolate);
1150
1147
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));
1158
1151
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 ()
1166
1159
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);
1167
1164
// 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
1188
1169
1189
1170
// Method to fetch the nghttp2 string description of an nghttp2 error code
1190
1171
env->SetMethod (target, " nghttp2ErrorString" , HttpErrorString);
0 commit comments