/src/node/src/node_http2_state.h
Line | Count | Source (jump to first uncovered line) |
1 | | #ifndef SRC_NODE_HTTP2_STATE_H_ |
2 | | #define SRC_NODE_HTTP2_STATE_H_ |
3 | | |
4 | | #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
5 | | |
6 | | #include "aliased_buffer.h" |
7 | | |
8 | | struct nghttp2_rcbuf; |
9 | | |
10 | | namespace node { |
11 | | namespace http2 { |
12 | | |
13 | | enum Http2SettingsIndex { |
14 | | IDX_SETTINGS_HEADER_TABLE_SIZE, |
15 | | IDX_SETTINGS_ENABLE_PUSH, |
16 | | IDX_SETTINGS_INITIAL_WINDOW_SIZE, |
17 | | IDX_SETTINGS_MAX_FRAME_SIZE, |
18 | | IDX_SETTINGS_MAX_CONCURRENT_STREAMS, |
19 | | IDX_SETTINGS_MAX_HEADER_LIST_SIZE, |
20 | | IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL, |
21 | | IDX_SETTINGS_COUNT |
22 | | }; |
23 | | |
24 | | // number of max additional settings, thus settings not implemented by nghttp2 |
25 | | const size_t MAX_ADDITIONAL_SETTINGS = 10; |
26 | | |
27 | | enum Http2SessionStateIndex { |
28 | | IDX_SESSION_STATE_EFFECTIVE_LOCAL_WINDOW_SIZE, |
29 | | IDX_SESSION_STATE_EFFECTIVE_RECV_DATA_LENGTH, |
30 | | IDX_SESSION_STATE_NEXT_STREAM_ID, |
31 | | IDX_SESSION_STATE_LOCAL_WINDOW_SIZE, |
32 | | IDX_SESSION_STATE_LAST_PROC_STREAM_ID, |
33 | | IDX_SESSION_STATE_REMOTE_WINDOW_SIZE, |
34 | | IDX_SESSION_STATE_OUTBOUND_QUEUE_SIZE, |
35 | | IDX_SESSION_STATE_HD_DEFLATE_DYNAMIC_TABLE_SIZE, |
36 | | IDX_SESSION_STATE_HD_INFLATE_DYNAMIC_TABLE_SIZE, |
37 | | IDX_SESSION_STATE_COUNT |
38 | | }; |
39 | | |
40 | | enum Http2StreamStateIndex { |
41 | | IDX_STREAM_STATE, |
42 | | IDX_STREAM_STATE_WEIGHT, |
43 | | IDX_STREAM_STATE_SUM_DEPENDENCY_WEIGHT, |
44 | | IDX_STREAM_STATE_LOCAL_CLOSE, |
45 | | IDX_STREAM_STATE_REMOTE_CLOSE, |
46 | | IDX_STREAM_STATE_LOCAL_WINDOW_SIZE, |
47 | | IDX_STREAM_STATE_COUNT |
48 | | }; |
49 | | |
50 | | enum Http2OptionsIndex { |
51 | | IDX_OPTIONS_MAX_DEFLATE_DYNAMIC_TABLE_SIZE, |
52 | | IDX_OPTIONS_MAX_RESERVED_REMOTE_STREAMS, |
53 | | IDX_OPTIONS_MAX_SEND_HEADER_BLOCK_LENGTH, |
54 | | IDX_OPTIONS_PEER_MAX_CONCURRENT_STREAMS, |
55 | | IDX_OPTIONS_PADDING_STRATEGY, |
56 | | IDX_OPTIONS_MAX_HEADER_LIST_PAIRS, |
57 | | IDX_OPTIONS_MAX_OUTSTANDING_PINGS, |
58 | | IDX_OPTIONS_MAX_OUTSTANDING_SETTINGS, |
59 | | IDX_OPTIONS_MAX_SESSION_MEMORY, |
60 | | IDX_OPTIONS_MAX_SETTINGS, |
61 | | IDX_OPTIONS_FLAGS |
62 | | }; |
63 | | |
64 | | enum Http2StreamStatisticsIndex { |
65 | | IDX_STREAM_STATS_ID, |
66 | | IDX_STREAM_STATS_TIMETOFIRSTBYTE, |
67 | | IDX_STREAM_STATS_TIMETOFIRSTHEADER, |
68 | | IDX_STREAM_STATS_TIMETOFIRSTBYTESENT, |
69 | | IDX_STREAM_STATS_SENTBYTES, |
70 | | IDX_STREAM_STATS_RECEIVEDBYTES, |
71 | | IDX_STREAM_STATS_COUNT |
72 | | }; |
73 | | |
74 | | enum Http2SessionStatisticsIndex { |
75 | | IDX_SESSION_STATS_TYPE, |
76 | | IDX_SESSION_STATS_PINGRTT, |
77 | | IDX_SESSION_STATS_FRAMESRECEIVED, |
78 | | IDX_SESSION_STATS_FRAMESSENT, |
79 | | IDX_SESSION_STATS_STREAMCOUNT, |
80 | | IDX_SESSION_STATS_STREAMAVERAGEDURATION, |
81 | | IDX_SESSION_STATS_DATA_SENT, |
82 | | IDX_SESSION_STATS_DATA_RECEIVED, |
83 | | IDX_SESSION_STATS_MAX_CONCURRENT_STREAMS, |
84 | | IDX_SESSION_STATS_COUNT |
85 | | }; |
86 | | |
87 | | class Http2State : public BaseObject { |
88 | | public: |
89 | | Http2State(Realm* realm, v8::Local<v8::Object> obj) |
90 | 0 | : BaseObject(realm, obj), |
91 | 0 | root_buffer(realm->isolate(), sizeof(http2_state_internal)), |
92 | 0 | session_state_buffer( |
93 | 0 | realm->isolate(), |
94 | 0 | offsetof(http2_state_internal, session_state_buffer), |
95 | 0 | IDX_SESSION_STATE_COUNT, |
96 | 0 | root_buffer), |
97 | 0 | stream_state_buffer(realm->isolate(), |
98 | 0 | offsetof(http2_state_internal, stream_state_buffer), |
99 | 0 | IDX_STREAM_STATE_COUNT, |
100 | 0 | root_buffer), |
101 | 0 | stream_stats_buffer(realm->isolate(), |
102 | 0 | offsetof(http2_state_internal, stream_stats_buffer), |
103 | 0 | IDX_STREAM_STATS_COUNT, |
104 | 0 | root_buffer), |
105 | 0 | session_stats_buffer( |
106 | 0 | realm->isolate(), |
107 | 0 | offsetof(http2_state_internal, session_stats_buffer), |
108 | 0 | IDX_SESSION_STATS_COUNT, |
109 | 0 | root_buffer), |
110 | 0 | options_buffer(realm->isolate(), |
111 | 0 | offsetof(http2_state_internal, options_buffer), |
112 | 0 | IDX_OPTIONS_FLAGS + 1, |
113 | 0 | root_buffer), |
114 | 0 | settings_buffer( |
115 | 0 | realm->isolate(), |
116 | 0 | offsetof(http2_state_internal, settings_buffer), |
117 | 0 | IDX_SETTINGS_COUNT + 1 + 1 + 2 * MAX_ADDITIONAL_SETTINGS, |
118 | 0 | root_buffer) {} |
119 | | |
120 | | AliasedUint8Array root_buffer; |
121 | | AliasedFloat64Array session_state_buffer; |
122 | | AliasedFloat64Array stream_state_buffer; |
123 | | AliasedFloat64Array stream_stats_buffer; |
124 | | AliasedFloat64Array session_stats_buffer; |
125 | | AliasedUint32Array options_buffer; |
126 | | AliasedUint32Array settings_buffer; |
127 | | |
128 | | void MemoryInfo(MemoryTracker* tracker) const override; |
129 | | SET_SELF_SIZE(Http2State) |
130 | | SET_MEMORY_INFO_NAME(Http2State) |
131 | | |
132 | | SET_BINDING_ID(http2_binding_data) |
133 | | |
134 | | private: |
135 | | struct http2_state_internal { |
136 | | // doubles first so that they are always sizeof(double)-aligned |
137 | | double session_state_buffer[IDX_SESSION_STATE_COUNT]; |
138 | | double stream_state_buffer[IDX_STREAM_STATE_COUNT]; |
139 | | double stream_stats_buffer[IDX_STREAM_STATS_COUNT]; |
140 | | double session_stats_buffer[IDX_SESSION_STATS_COUNT]; |
141 | | uint32_t options_buffer[IDX_OPTIONS_FLAGS + 1]; |
142 | | // first + 1: number of actual nghttp2 supported settings |
143 | | // second + 1: number of additional settings not supported by nghttp2 |
144 | | // 2 * MAX_ADDITIONAL_SETTINGS: settings id and value for each |
145 | | // additional setting |
146 | | uint32_t settings_buffer[IDX_SETTINGS_COUNT + 1 + 1 + |
147 | | 2 * MAX_ADDITIONAL_SETTINGS]; |
148 | | }; |
149 | | }; |
150 | | |
151 | | } // namespace http2 |
152 | | } // namespace node |
153 | | |
154 | | #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
155 | | |
156 | | #endif // SRC_NODE_HTTP2_STATE_H_ |