@gjsify/http2 0.1.15 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,317 @@
1
+ const constants = {
2
+ // NGHTTP2 Error Codes (RFC 7540 §7)
3
+ NGHTTP2_NO_ERROR: 0,
4
+ NGHTTP2_PROTOCOL_ERROR: 1,
5
+ NGHTTP2_INTERNAL_ERROR: 2,
6
+ NGHTTP2_FLOW_CONTROL_ERROR: 3,
7
+ NGHTTP2_SETTINGS_TIMEOUT: 4,
8
+ NGHTTP2_STREAM_CLOSED: 5,
9
+ NGHTTP2_FRAME_SIZE_ERROR: 6,
10
+ NGHTTP2_REFUSED_STREAM: 7,
11
+ NGHTTP2_CANCEL: 8,
12
+ NGHTTP2_COMPRESSION_ERROR: 9,
13
+ NGHTTP2_CONNECT_ERROR: 10,
14
+ NGHTTP2_ENHANCE_YOUR_CALM: 11,
15
+ NGHTTP2_INADEQUATE_SECURITY: 12,
16
+ NGHTTP2_HTTP_1_1_REQUIRED: 13,
17
+ NGHTTP2_ERR_FRAME_SIZE_ERROR: -522,
18
+ NGHTTP2_ERR_DEFERRED: -508,
19
+ NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE: -509,
20
+ NGHTTP2_ERR_INVALID_ARGUMENT: -501,
21
+ NGHTTP2_ERR_STREAM_CLOSED: -510,
22
+ NGHTTP2_ERR_NOMEM: -901,
23
+ NGHTTP2_SESSION_SERVER: 0,
24
+ NGHTTP2_SESSION_CLIENT: 1,
25
+ NGHTTP2_STREAM_STATE_IDLE: 1,
26
+ NGHTTP2_STREAM_STATE_OPEN: 2,
27
+ NGHTTP2_STREAM_STATE_RESERVED_LOCAL: 3,
28
+ NGHTTP2_STREAM_STATE_RESERVED_REMOTE: 4,
29
+ NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: 5,
30
+ NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: 6,
31
+ NGHTTP2_STREAM_STATE_CLOSED: 7,
32
+ NGHTTP2_FLAG_NONE: 0,
33
+ NGHTTP2_FLAG_END_STREAM: 1,
34
+ NGHTTP2_FLAG_END_HEADERS: 4,
35
+ NGHTTP2_FLAG_ACK: 1,
36
+ NGHTTP2_FLAG_PADDED: 8,
37
+ NGHTTP2_FLAG_PRIORITY: 32,
38
+ NGHTTP2_HCAT_REQUEST: 0,
39
+ NGHTTP2_HCAT_RESPONSE: 1,
40
+ NGHTTP2_HCAT_PUSH_RESPONSE: 2,
41
+ NGHTTP2_HCAT_HEADERS: 3,
42
+ NGHTTP2_NV_FLAG_NONE: 0,
43
+ NGHTTP2_NV_FLAG_NO_INDEX: 1,
44
+ NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: 1,
45
+ NGHTTP2_SETTINGS_ENABLE_PUSH: 2,
46
+ NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: 3,
47
+ NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: 4,
48
+ NGHTTP2_SETTINGS_MAX_FRAME_SIZE: 5,
49
+ NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: 6,
50
+ NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL: 8,
51
+ DEFAULT_SETTINGS_HEADER_TABLE_SIZE: 4096,
52
+ DEFAULT_SETTINGS_ENABLE_PUSH: 1,
53
+ DEFAULT_SETTINGS_MAX_CONCURRENT_STREAMS: 4294967295,
54
+ DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: 65535,
55
+ DEFAULT_SETTINGS_MAX_FRAME_SIZE: 16384,
56
+ DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE: 65535,
57
+ DEFAULT_SETTINGS_ENABLE_CONNECT_PROTOCOL: 0,
58
+ MAX_MAX_FRAME_SIZE: 16777215,
59
+ MIN_MAX_FRAME_SIZE: 16384,
60
+ MAX_INITIAL_WINDOW_SIZE: 2147483647,
61
+ NGHTTP2_DEFAULT_WEIGHT: 16,
62
+ PADDING_STRATEGY_NONE: 0,
63
+ PADDING_STRATEGY_ALIGNED: 1,
64
+ PADDING_STRATEGY_MAX: 2,
65
+ PADDING_STRATEGY_CALLBACK: 1,
66
+ HTTP2_HEADER_STATUS: ":status",
67
+ HTTP2_HEADER_METHOD: ":method",
68
+ HTTP2_HEADER_AUTHORITY: ":authority",
69
+ HTTP2_HEADER_SCHEME: ":scheme",
70
+ HTTP2_HEADER_PATH: ":path",
71
+ HTTP2_HEADER_PROTOCOL: ":protocol",
72
+ HTTP2_HEADER_ACCEPT: "accept",
73
+ HTTP2_HEADER_ACCEPT_CHARSET: "accept-charset",
74
+ HTTP2_HEADER_ACCEPT_ENCODING: "accept-encoding",
75
+ HTTP2_HEADER_ACCEPT_LANGUAGE: "accept-language",
76
+ HTTP2_HEADER_ACCEPT_RANGES: "accept-ranges",
77
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS: "access-control-allow-credentials",
78
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_HEADERS: "access-control-allow-headers",
79
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_METHODS: "access-control-allow-methods",
80
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: "access-control-allow-origin",
81
+ HTTP2_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS: "access-control-expose-headers",
82
+ HTTP2_HEADER_ACCESS_CONTROL_MAX_AGE: "access-control-max-age",
83
+ HTTP2_HEADER_ACCESS_CONTROL_REQUEST_HEADERS: "access-control-request-headers",
84
+ HTTP2_HEADER_ACCESS_CONTROL_REQUEST_METHOD: "access-control-request-method",
85
+ HTTP2_HEADER_AGE: "age",
86
+ HTTP2_HEADER_ALLOW: "allow",
87
+ HTTP2_HEADER_ALT_SVC: "alt-svc",
88
+ HTTP2_HEADER_AUTHORIZATION: "authorization",
89
+ HTTP2_HEADER_CACHE_CONTROL: "cache-control",
90
+ HTTP2_HEADER_CONNECTION: "connection",
91
+ HTTP2_HEADER_CONTENT_DISPOSITION: "content-disposition",
92
+ HTTP2_HEADER_CONTENT_ENCODING: "content-encoding",
93
+ HTTP2_HEADER_CONTENT_LANGUAGE: "content-language",
94
+ HTTP2_HEADER_CONTENT_LENGTH: "content-length",
95
+ HTTP2_HEADER_CONTENT_LOCATION: "content-location",
96
+ HTTP2_HEADER_CONTENT_MD5: "content-md5",
97
+ HTTP2_HEADER_CONTENT_RANGE: "content-range",
98
+ HTTP2_HEADER_CONTENT_SECURITY_POLICY: "content-security-policy",
99
+ HTTP2_HEADER_CONTENT_TYPE: "content-type",
100
+ HTTP2_HEADER_COOKIE: "cookie",
101
+ HTTP2_HEADER_DATE: "date",
102
+ HTTP2_HEADER_DNT: "dnt",
103
+ HTTP2_HEADER_EARLY_DATA: "early-data",
104
+ HTTP2_HEADER_ETAG: "etag",
105
+ HTTP2_HEADER_EXPECT: "expect",
106
+ HTTP2_HEADER_EXPECT_CT: "expect-ct",
107
+ HTTP2_HEADER_EXPIRES: "expires",
108
+ HTTP2_HEADER_FORWARDED: "forwarded",
109
+ HTTP2_HEADER_FROM: "from",
110
+ HTTP2_HEADER_HOST: "host",
111
+ HTTP2_HEADER_HTTP2_SETTINGS: "http2-settings",
112
+ HTTP2_HEADER_IF_MATCH: "if-match",
113
+ HTTP2_HEADER_IF_MODIFIED_SINCE: "if-modified-since",
114
+ HTTP2_HEADER_IF_NONE_MATCH: "if-none-match",
115
+ HTTP2_HEADER_IF_RANGE: "if-range",
116
+ HTTP2_HEADER_IF_UNMODIFIED_SINCE: "if-unmodified-since",
117
+ HTTP2_HEADER_KEEP_ALIVE: "keep-alive",
118
+ HTTP2_HEADER_LAST_MODIFIED: "last-modified",
119
+ HTTP2_HEADER_LINK: "link",
120
+ HTTP2_HEADER_LOCATION: "location",
121
+ HTTP2_HEADER_MAX_FORWARDS: "max-forwards",
122
+ HTTP2_HEADER_ORIGIN: "origin",
123
+ HTTP2_HEADER_PREFER: "prefer",
124
+ HTTP2_HEADER_PRIORITY: "priority",
125
+ HTTP2_HEADER_PROXY_AUTHENTICATE: "proxy-authenticate",
126
+ HTTP2_HEADER_PROXY_AUTHORIZATION: "proxy-authorization",
127
+ HTTP2_HEADER_PROXY_CONNECTION: "proxy-connection",
128
+ HTTP2_HEADER_RANGE: "range",
129
+ HTTP2_HEADER_REFERER: "referer",
130
+ HTTP2_HEADER_REFRESH: "refresh",
131
+ HTTP2_HEADER_RETRY_AFTER: "retry-after",
132
+ HTTP2_HEADER_SERVER: "server",
133
+ HTTP2_HEADER_SET_COOKIE: "set-cookie",
134
+ HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: "strict-transport-security",
135
+ HTTP2_HEADER_TE: "te",
136
+ HTTP2_HEADER_TIMING_ALLOW_ORIGIN: "timing-allow-origin",
137
+ HTTP2_HEADER_TRAILER: "trailer",
138
+ HTTP2_HEADER_TRANSFER_ENCODING: "transfer-encoding",
139
+ HTTP2_HEADER_TK: "tk",
140
+ HTTP2_HEADER_UPGRADE: "upgrade",
141
+ HTTP2_HEADER_UPGRADE_INSECURE_REQUESTS: "upgrade-insecure-requests",
142
+ HTTP2_HEADER_USER_AGENT: "user-agent",
143
+ HTTP2_HEADER_VARY: "vary",
144
+ HTTP2_HEADER_VIA: "via",
145
+ HTTP2_HEADER_WARNING: "warning",
146
+ HTTP2_HEADER_WWW_AUTHENTICATE: "www-authenticate",
147
+ HTTP2_HEADER_X_CONTENT_TYPE_OPTIONS: "x-content-type-options",
148
+ HTTP2_HEADER_X_FORWARDED_FOR: "x-forwarded-for",
149
+ HTTP2_HEADER_X_FRAME_OPTIONS: "x-frame-options",
150
+ HTTP2_HEADER_X_XSS_PROTECTION: "x-xss-protection",
151
+ HTTP2_HEADER_PURPOSE: "purpose",
152
+ HTTP2_METHOD_ACL: "ACL",
153
+ HTTP2_METHOD_BASELINE_CONTROL: "BASELINE-CONTROL",
154
+ HTTP2_METHOD_BIND: "BIND",
155
+ HTTP2_METHOD_CHECKIN: "CHECKIN",
156
+ HTTP2_METHOD_CHECKOUT: "CHECKOUT",
157
+ HTTP2_METHOD_CONNECT: "CONNECT",
158
+ HTTP2_METHOD_COPY: "COPY",
159
+ HTTP2_METHOD_DELETE: "DELETE",
160
+ HTTP2_METHOD_GET: "GET",
161
+ HTTP2_METHOD_HEAD: "HEAD",
162
+ HTTP2_METHOD_LABEL: "LABEL",
163
+ HTTP2_METHOD_LINK: "LINK",
164
+ HTTP2_METHOD_LOCK: "LOCK",
165
+ HTTP2_METHOD_MERGE: "MERGE",
166
+ HTTP2_METHOD_MKACTIVITY: "MKACTIVITY",
167
+ HTTP2_METHOD_MKCALENDAR: "MKCALENDAR",
168
+ HTTP2_METHOD_MKCOL: "MKCOL",
169
+ HTTP2_METHOD_MKREDIRECTREF: "MKREDIRECTREF",
170
+ HTTP2_METHOD_MKWORKSPACE: "MKWORKSPACE",
171
+ HTTP2_METHOD_MOVE: "MOVE",
172
+ HTTP2_METHOD_OPTIONS: "OPTIONS",
173
+ HTTP2_METHOD_ORDERPATCH: "ORDERPATCH",
174
+ HTTP2_METHOD_PATCH: "PATCH",
175
+ HTTP2_METHOD_POST: "POST",
176
+ HTTP2_METHOD_PRI: "PRI",
177
+ HTTP2_METHOD_PROPFIND: "PROPFIND",
178
+ HTTP2_METHOD_PROPPATCH: "PROPPATCH",
179
+ HTTP2_METHOD_PUT: "PUT",
180
+ HTTP2_METHOD_REBIND: "REBIND",
181
+ HTTP2_METHOD_REPORT: "REPORT",
182
+ HTTP2_METHOD_SEARCH: "SEARCH",
183
+ HTTP2_METHOD_TRACE: "TRACE",
184
+ HTTP2_METHOD_UNBIND: "UNBIND",
185
+ HTTP2_METHOD_UNCHECKOUT: "UNCHECKOUT",
186
+ HTTP2_METHOD_UNLINK: "UNLINK",
187
+ HTTP2_METHOD_UNLOCK: "UNLOCK",
188
+ HTTP2_METHOD_UPDATE: "UPDATE",
189
+ HTTP2_METHOD_UPDATEREDIRECTREF: "UPDATEREDIRECTREF",
190
+ HTTP2_METHOD_VERSION_CONTROL: "VERSION-CONTROL",
191
+ HTTP_STATUS_CONTINUE: 100,
192
+ HTTP_STATUS_SWITCHING_PROTOCOLS: 101,
193
+ HTTP_STATUS_PROCESSING: 102,
194
+ HTTP_STATUS_EARLY_HINTS: 103,
195
+ HTTP_STATUS_OK: 200,
196
+ HTTP_STATUS_CREATED: 201,
197
+ HTTP_STATUS_ACCEPTED: 202,
198
+ HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: 203,
199
+ HTTP_STATUS_NO_CONTENT: 204,
200
+ HTTP_STATUS_RESET_CONTENT: 205,
201
+ HTTP_STATUS_PARTIAL_CONTENT: 206,
202
+ HTTP_STATUS_MULTI_STATUS: 207,
203
+ HTTP_STATUS_ALREADY_REPORTED: 208,
204
+ HTTP_STATUS_IM_USED: 226,
205
+ HTTP_STATUS_MULTIPLE_CHOICES: 300,
206
+ HTTP_STATUS_MOVED_PERMANENTLY: 301,
207
+ HTTP_STATUS_FOUND: 302,
208
+ HTTP_STATUS_SEE_OTHER: 303,
209
+ HTTP_STATUS_NOT_MODIFIED: 304,
210
+ HTTP_STATUS_USE_PROXY: 305,
211
+ HTTP_STATUS_TEMPORARY_REDIRECT: 307,
212
+ HTTP_STATUS_PERMANENT_REDIRECT: 308,
213
+ HTTP_STATUS_BAD_REQUEST: 400,
214
+ HTTP_STATUS_UNAUTHORIZED: 401,
215
+ HTTP_STATUS_PAYMENT_REQUIRED: 402,
216
+ HTTP_STATUS_FORBIDDEN: 403,
217
+ HTTP_STATUS_NOT_FOUND: 404,
218
+ HTTP_STATUS_METHOD_NOT_ALLOWED: 405,
219
+ HTTP_STATUS_NOT_ACCEPTABLE: 406,
220
+ HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: 407,
221
+ HTTP_STATUS_REQUEST_TIMEOUT: 408,
222
+ HTTP_STATUS_CONFLICT: 409,
223
+ HTTP_STATUS_GONE: 410,
224
+ HTTP_STATUS_LENGTH_REQUIRED: 411,
225
+ HTTP_STATUS_PRECONDITION_FAILED: 412,
226
+ HTTP_STATUS_PAYLOAD_TOO_LARGE: 413,
227
+ HTTP_STATUS_URI_TOO_LONG: 414,
228
+ HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: 415,
229
+ HTTP_STATUS_RANGE_NOT_SATISFIABLE: 416,
230
+ HTTP_STATUS_EXPECTATION_FAILED: 417,
231
+ HTTP_STATUS_TEAPOT: 418,
232
+ HTTP_STATUS_MISDIRECTED_REQUEST: 421,
233
+ HTTP_STATUS_UNPROCESSABLE_ENTITY: 422,
234
+ HTTP_STATUS_LOCKED: 423,
235
+ HTTP_STATUS_FAILED_DEPENDENCY: 424,
236
+ HTTP_STATUS_TOO_EARLY: 425,
237
+ HTTP_STATUS_UPGRADE_REQUIRED: 426,
238
+ HTTP_STATUS_PRECONDITION_REQUIRED: 428,
239
+ HTTP_STATUS_TOO_MANY_REQUESTS: 429,
240
+ HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
241
+ HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: 451,
242
+ HTTP_STATUS_INTERNAL_SERVER_ERROR: 500,
243
+ HTTP_STATUS_NOT_IMPLEMENTED: 501,
244
+ HTTP_STATUS_BAD_GATEWAY: 502,
245
+ HTTP_STATUS_SERVICE_UNAVAILABLE: 503,
246
+ HTTP_STATUS_GATEWAY_TIMEOUT: 504,
247
+ HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: 505,
248
+ HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: 506,
249
+ HTTP_STATUS_INSUFFICIENT_STORAGE: 507,
250
+ HTTP_STATUS_LOOP_DETECTED: 508,
251
+ HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: 509,
252
+ HTTP_STATUS_NOT_EXTENDED: 510,
253
+ HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: 511
254
+ };
255
+ const SETTINGS_MAP = [
256
+ [1, "headerTableSize", false],
257
+ [2, "enablePush", true],
258
+ [3, "maxConcurrentStreams", false],
259
+ [4, "initialWindowSize", false],
260
+ [5, "maxFrameSize", false],
261
+ [6, "maxHeaderListSize", false],
262
+ [8, "enableConnectProtocol", true]
263
+ ];
264
+ function getDefaultSettings() {
265
+ return {
266
+ headerTableSize: 4096,
267
+ enablePush: true,
268
+ maxConcurrentStreams: 4294967295,
269
+ initialWindowSize: 65535,
270
+ maxFrameSize: 16384,
271
+ maxHeaderListSize: 65535,
272
+ enableConnectProtocol: false
273
+ };
274
+ }
275
+ function getPackedSettings(settings) {
276
+ if (!settings) return new Uint8Array(0);
277
+ const pairs = [];
278
+ for (const [id, key, isBool] of SETTINGS_MAP) {
279
+ const val = settings[key];
280
+ if (val !== void 0) {
281
+ pairs.push([id, isBool ? val ? 1 : 0 : val]);
282
+ }
283
+ }
284
+ const buf = new Uint8Array(pairs.length * 6);
285
+ const view = new DataView(buf.buffer);
286
+ for (let i = 0; i < pairs.length; i++) {
287
+ const offset = i * 6;
288
+ view.setUint16(offset, pairs[i][0], false);
289
+ view.setUint32(offset + 2, pairs[i][1], false);
290
+ }
291
+ return buf;
292
+ }
293
+ function getUnpackedSettings(buf) {
294
+ const data = buf instanceof ArrayBuffer ? new Uint8Array(buf) : buf;
295
+ if (data.byteLength % 6 !== 0) {
296
+ throw new RangeError("Invalid packed settings length");
297
+ }
298
+ const result = {};
299
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
300
+ for (let i = 0; i < data.byteLength; i += 6) {
301
+ const id = view.getUint16(i, false);
302
+ const value = view.getUint32(i + 2, false);
303
+ for (const [settingId, key, isBool] of SETTINGS_MAP) {
304
+ if (id === settingId) {
305
+ result[key] = isBool ? value !== 0 : value;
306
+ break;
307
+ }
308
+ }
309
+ }
310
+ return result;
311
+ }
312
+ export {
313
+ constants,
314
+ getDefaultSettings,
315
+ getPackedSettings,
316
+ getUnpackedSettings
317
+ };