@gjsify/http2 0.4.0 → 0.4.4

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