@gjsify/http2 0.1.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.
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # @gjsify/http2
2
+
3
+ GJS stub implementation of the Node.js `http2` module. Currently provides constants only.
4
+
5
+ Part of the [gjsify](https://github.com/gjsify/gjsify) project — Node.js and Web APIs for GJS (GNOME JavaScript).
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @gjsify/http2
11
+ # or
12
+ yarn add @gjsify/http2
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```typescript
18
+ import { constants } from '@gjsify/http2';
19
+
20
+ console.log(constants.HTTP2_HEADER_STATUS);
21
+ ```
22
+
23
+ ## License
24
+
25
+ MIT
@@ -0,0 +1,575 @@
1
+ import { EventEmitter } from "node:events";
2
+ const constants = {
3
+ // NGHTTP2 Error Codes (RFC 7540 §7)
4
+ NGHTTP2_NO_ERROR: 0,
5
+ NGHTTP2_PROTOCOL_ERROR: 1,
6
+ NGHTTP2_INTERNAL_ERROR: 2,
7
+ NGHTTP2_FLOW_CONTROL_ERROR: 3,
8
+ NGHTTP2_SETTINGS_TIMEOUT: 4,
9
+ NGHTTP2_STREAM_CLOSED: 5,
10
+ NGHTTP2_FRAME_SIZE_ERROR: 6,
11
+ NGHTTP2_REFUSED_STREAM: 7,
12
+ NGHTTP2_CANCEL: 8,
13
+ NGHTTP2_COMPRESSION_ERROR: 9,
14
+ NGHTTP2_CONNECT_ERROR: 10,
15
+ NGHTTP2_ENHANCE_YOUR_CALM: 11,
16
+ NGHTTP2_INADEQUATE_SECURITY: 12,
17
+ NGHTTP2_HTTP_1_1_REQUIRED: 13,
18
+ NGHTTP2_ERR_FRAME_SIZE_ERROR: -522,
19
+ NGHTTP2_ERR_DEFERRED: -508,
20
+ NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE: -509,
21
+ NGHTTP2_ERR_INVALID_ARGUMENT: -501,
22
+ NGHTTP2_ERR_STREAM_CLOSED: -510,
23
+ NGHTTP2_ERR_NOMEM: -901,
24
+ NGHTTP2_SESSION_SERVER: 0,
25
+ NGHTTP2_SESSION_CLIENT: 1,
26
+ NGHTTP2_STREAM_STATE_IDLE: 1,
27
+ NGHTTP2_STREAM_STATE_OPEN: 2,
28
+ NGHTTP2_STREAM_STATE_RESERVED_LOCAL: 3,
29
+ NGHTTP2_STREAM_STATE_RESERVED_REMOTE: 4,
30
+ NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: 5,
31
+ NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: 6,
32
+ NGHTTP2_STREAM_STATE_CLOSED: 7,
33
+ NGHTTP2_FLAG_NONE: 0,
34
+ NGHTTP2_FLAG_END_STREAM: 1,
35
+ NGHTTP2_FLAG_END_HEADERS: 4,
36
+ NGHTTP2_FLAG_ACK: 1,
37
+ NGHTTP2_FLAG_PADDED: 8,
38
+ NGHTTP2_FLAG_PRIORITY: 32,
39
+ NGHTTP2_HCAT_REQUEST: 0,
40
+ NGHTTP2_HCAT_RESPONSE: 1,
41
+ NGHTTP2_HCAT_PUSH_RESPONSE: 2,
42
+ NGHTTP2_HCAT_HEADERS: 3,
43
+ NGHTTP2_NV_FLAG_NONE: 0,
44
+ NGHTTP2_NV_FLAG_NO_INDEX: 1,
45
+ NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: 1,
46
+ NGHTTP2_SETTINGS_ENABLE_PUSH: 2,
47
+ NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: 3,
48
+ NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: 4,
49
+ NGHTTP2_SETTINGS_MAX_FRAME_SIZE: 5,
50
+ NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: 6,
51
+ NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL: 8,
52
+ DEFAULT_SETTINGS_HEADER_TABLE_SIZE: 4096,
53
+ DEFAULT_SETTINGS_ENABLE_PUSH: 1,
54
+ DEFAULT_SETTINGS_MAX_CONCURRENT_STREAMS: 4294967295,
55
+ DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: 65535,
56
+ DEFAULT_SETTINGS_MAX_FRAME_SIZE: 16384,
57
+ DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE: 65535,
58
+ DEFAULT_SETTINGS_ENABLE_CONNECT_PROTOCOL: 0,
59
+ MAX_MAX_FRAME_SIZE: 16777215,
60
+ MIN_MAX_FRAME_SIZE: 16384,
61
+ MAX_INITIAL_WINDOW_SIZE: 2147483647,
62
+ NGHTTP2_DEFAULT_WEIGHT: 16,
63
+ PADDING_STRATEGY_NONE: 0,
64
+ PADDING_STRATEGY_ALIGNED: 1,
65
+ PADDING_STRATEGY_MAX: 2,
66
+ PADDING_STRATEGY_CALLBACK: 1,
67
+ HTTP2_HEADER_STATUS: ":status",
68
+ HTTP2_HEADER_METHOD: ":method",
69
+ HTTP2_HEADER_AUTHORITY: ":authority",
70
+ HTTP2_HEADER_SCHEME: ":scheme",
71
+ HTTP2_HEADER_PATH: ":path",
72
+ HTTP2_HEADER_PROTOCOL: ":protocol",
73
+ HTTP2_HEADER_ACCEPT: "accept",
74
+ HTTP2_HEADER_ACCEPT_CHARSET: "accept-charset",
75
+ HTTP2_HEADER_ACCEPT_ENCODING: "accept-encoding",
76
+ HTTP2_HEADER_ACCEPT_LANGUAGE: "accept-language",
77
+ HTTP2_HEADER_ACCEPT_RANGES: "accept-ranges",
78
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS: "access-control-allow-credentials",
79
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_HEADERS: "access-control-allow-headers",
80
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_METHODS: "access-control-allow-methods",
81
+ HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: "access-control-allow-origin",
82
+ HTTP2_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS: "access-control-expose-headers",
83
+ HTTP2_HEADER_ACCESS_CONTROL_MAX_AGE: "access-control-max-age",
84
+ HTTP2_HEADER_ACCESS_CONTROL_REQUEST_HEADERS: "access-control-request-headers",
85
+ HTTP2_HEADER_ACCESS_CONTROL_REQUEST_METHOD: "access-control-request-method",
86
+ HTTP2_HEADER_AGE: "age",
87
+ HTTP2_HEADER_ALLOW: "allow",
88
+ HTTP2_HEADER_ALT_SVC: "alt-svc",
89
+ HTTP2_HEADER_AUTHORIZATION: "authorization",
90
+ HTTP2_HEADER_CACHE_CONTROL: "cache-control",
91
+ HTTP2_HEADER_CONNECTION: "connection",
92
+ HTTP2_HEADER_CONTENT_DISPOSITION: "content-disposition",
93
+ HTTP2_HEADER_CONTENT_ENCODING: "content-encoding",
94
+ HTTP2_HEADER_CONTENT_LANGUAGE: "content-language",
95
+ HTTP2_HEADER_CONTENT_LENGTH: "content-length",
96
+ HTTP2_HEADER_CONTENT_LOCATION: "content-location",
97
+ HTTP2_HEADER_CONTENT_MD5: "content-md5",
98
+ HTTP2_HEADER_CONTENT_RANGE: "content-range",
99
+ HTTP2_HEADER_CONTENT_SECURITY_POLICY: "content-security-policy",
100
+ HTTP2_HEADER_CONTENT_TYPE: "content-type",
101
+ HTTP2_HEADER_COOKIE: "cookie",
102
+ HTTP2_HEADER_DATE: "date",
103
+ HTTP2_HEADER_DNT: "dnt",
104
+ HTTP2_HEADER_EARLY_DATA: "early-data",
105
+ HTTP2_HEADER_ETAG: "etag",
106
+ HTTP2_HEADER_EXPECT: "expect",
107
+ HTTP2_HEADER_EXPECT_CT: "expect-ct",
108
+ HTTP2_HEADER_EXPIRES: "expires",
109
+ HTTP2_HEADER_FORWARDED: "forwarded",
110
+ HTTP2_HEADER_FROM: "from",
111
+ HTTP2_HEADER_HOST: "host",
112
+ HTTP2_HEADER_HTTP2_SETTINGS: "http2-settings",
113
+ HTTP2_HEADER_IF_MATCH: "if-match",
114
+ HTTP2_HEADER_IF_MODIFIED_SINCE: "if-modified-since",
115
+ HTTP2_HEADER_IF_NONE_MATCH: "if-none-match",
116
+ HTTP2_HEADER_IF_RANGE: "if-range",
117
+ HTTP2_HEADER_IF_UNMODIFIED_SINCE: "if-unmodified-since",
118
+ HTTP2_HEADER_KEEP_ALIVE: "keep-alive",
119
+ HTTP2_HEADER_LAST_MODIFIED: "last-modified",
120
+ HTTP2_HEADER_LINK: "link",
121
+ HTTP2_HEADER_LOCATION: "location",
122
+ HTTP2_HEADER_MAX_FORWARDS: "max-forwards",
123
+ HTTP2_HEADER_ORIGIN: "origin",
124
+ HTTP2_HEADER_PREFER: "prefer",
125
+ HTTP2_HEADER_PRIORITY: "priority",
126
+ HTTP2_HEADER_PROXY_AUTHENTICATE: "proxy-authenticate",
127
+ HTTP2_HEADER_PROXY_AUTHORIZATION: "proxy-authorization",
128
+ HTTP2_HEADER_PROXY_CONNECTION: "proxy-connection",
129
+ HTTP2_HEADER_RANGE: "range",
130
+ HTTP2_HEADER_REFERER: "referer",
131
+ HTTP2_HEADER_REFRESH: "refresh",
132
+ HTTP2_HEADER_RETRY_AFTER: "retry-after",
133
+ HTTP2_HEADER_SERVER: "server",
134
+ HTTP2_HEADER_SET_COOKIE: "set-cookie",
135
+ HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: "strict-transport-security",
136
+ HTTP2_HEADER_TE: "te",
137
+ HTTP2_HEADER_TIMING_ALLOW_ORIGIN: "timing-allow-origin",
138
+ HTTP2_HEADER_TRAILER: "trailer",
139
+ HTTP2_HEADER_TRANSFER_ENCODING: "transfer-encoding",
140
+ HTTP2_HEADER_TK: "tk",
141
+ HTTP2_HEADER_UPGRADE: "upgrade",
142
+ HTTP2_HEADER_UPGRADE_INSECURE_REQUESTS: "upgrade-insecure-requests",
143
+ HTTP2_HEADER_USER_AGENT: "user-agent",
144
+ HTTP2_HEADER_VARY: "vary",
145
+ HTTP2_HEADER_VIA: "via",
146
+ HTTP2_HEADER_WARNING: "warning",
147
+ HTTP2_HEADER_WWW_AUTHENTICATE: "www-authenticate",
148
+ HTTP2_HEADER_X_CONTENT_TYPE_OPTIONS: "x-content-type-options",
149
+ HTTP2_HEADER_X_FORWARDED_FOR: "x-forwarded-for",
150
+ HTTP2_HEADER_X_FRAME_OPTIONS: "x-frame-options",
151
+ HTTP2_HEADER_X_XSS_PROTECTION: "x-xss-protection",
152
+ HTTP2_HEADER_PURPOSE: "purpose",
153
+ HTTP2_METHOD_ACL: "ACL",
154
+ HTTP2_METHOD_BASELINE_CONTROL: "BASELINE-CONTROL",
155
+ HTTP2_METHOD_BIND: "BIND",
156
+ HTTP2_METHOD_CHECKIN: "CHECKIN",
157
+ HTTP2_METHOD_CHECKOUT: "CHECKOUT",
158
+ HTTP2_METHOD_CONNECT: "CONNECT",
159
+ HTTP2_METHOD_COPY: "COPY",
160
+ HTTP2_METHOD_DELETE: "DELETE",
161
+ HTTP2_METHOD_GET: "GET",
162
+ HTTP2_METHOD_HEAD: "HEAD",
163
+ HTTP2_METHOD_LABEL: "LABEL",
164
+ HTTP2_METHOD_LINK: "LINK",
165
+ HTTP2_METHOD_LOCK: "LOCK",
166
+ HTTP2_METHOD_MERGE: "MERGE",
167
+ HTTP2_METHOD_MKACTIVITY: "MKACTIVITY",
168
+ HTTP2_METHOD_MKCALENDAR: "MKCALENDAR",
169
+ HTTP2_METHOD_MKCOL: "MKCOL",
170
+ HTTP2_METHOD_MKREDIRECTREF: "MKREDIRECTREF",
171
+ HTTP2_METHOD_MKWORKSPACE: "MKWORKSPACE",
172
+ HTTP2_METHOD_MOVE: "MOVE",
173
+ HTTP2_METHOD_OPTIONS: "OPTIONS",
174
+ HTTP2_METHOD_ORDERPATCH: "ORDERPATCH",
175
+ HTTP2_METHOD_PATCH: "PATCH",
176
+ HTTP2_METHOD_POST: "POST",
177
+ HTTP2_METHOD_PRI: "PRI",
178
+ HTTP2_METHOD_PROPFIND: "PROPFIND",
179
+ HTTP2_METHOD_PROPPATCH: "PROPPATCH",
180
+ HTTP2_METHOD_PUT: "PUT",
181
+ HTTP2_METHOD_REBIND: "REBIND",
182
+ HTTP2_METHOD_REPORT: "REPORT",
183
+ HTTP2_METHOD_SEARCH: "SEARCH",
184
+ HTTP2_METHOD_TRACE: "TRACE",
185
+ HTTP2_METHOD_UNBIND: "UNBIND",
186
+ HTTP2_METHOD_UNCHECKOUT: "UNCHECKOUT",
187
+ HTTP2_METHOD_UNLINK: "UNLINK",
188
+ HTTP2_METHOD_UNLOCK: "UNLOCK",
189
+ HTTP2_METHOD_UPDATE: "UPDATE",
190
+ HTTP2_METHOD_UPDATEREDIRECTREF: "UPDATEREDIRECTREF",
191
+ HTTP2_METHOD_VERSION_CONTROL: "VERSION-CONTROL",
192
+ HTTP_STATUS_CONTINUE: 100,
193
+ HTTP_STATUS_SWITCHING_PROTOCOLS: 101,
194
+ HTTP_STATUS_PROCESSING: 102,
195
+ HTTP_STATUS_EARLY_HINTS: 103,
196
+ HTTP_STATUS_OK: 200,
197
+ HTTP_STATUS_CREATED: 201,
198
+ HTTP_STATUS_ACCEPTED: 202,
199
+ HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: 203,
200
+ HTTP_STATUS_NO_CONTENT: 204,
201
+ HTTP_STATUS_RESET_CONTENT: 205,
202
+ HTTP_STATUS_PARTIAL_CONTENT: 206,
203
+ HTTP_STATUS_MULTI_STATUS: 207,
204
+ HTTP_STATUS_ALREADY_REPORTED: 208,
205
+ HTTP_STATUS_IM_USED: 226,
206
+ HTTP_STATUS_MULTIPLE_CHOICES: 300,
207
+ HTTP_STATUS_MOVED_PERMANENTLY: 301,
208
+ HTTP_STATUS_FOUND: 302,
209
+ HTTP_STATUS_SEE_OTHER: 303,
210
+ HTTP_STATUS_NOT_MODIFIED: 304,
211
+ HTTP_STATUS_USE_PROXY: 305,
212
+ HTTP_STATUS_TEMPORARY_REDIRECT: 307,
213
+ HTTP_STATUS_PERMANENT_REDIRECT: 308,
214
+ HTTP_STATUS_BAD_REQUEST: 400,
215
+ HTTP_STATUS_UNAUTHORIZED: 401,
216
+ HTTP_STATUS_PAYMENT_REQUIRED: 402,
217
+ HTTP_STATUS_FORBIDDEN: 403,
218
+ HTTP_STATUS_NOT_FOUND: 404,
219
+ HTTP_STATUS_METHOD_NOT_ALLOWED: 405,
220
+ HTTP_STATUS_NOT_ACCEPTABLE: 406,
221
+ HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: 407,
222
+ HTTP_STATUS_REQUEST_TIMEOUT: 408,
223
+ HTTP_STATUS_CONFLICT: 409,
224
+ HTTP_STATUS_GONE: 410,
225
+ HTTP_STATUS_LENGTH_REQUIRED: 411,
226
+ HTTP_STATUS_PRECONDITION_FAILED: 412,
227
+ HTTP_STATUS_PAYLOAD_TOO_LARGE: 413,
228
+ HTTP_STATUS_URI_TOO_LONG: 414,
229
+ HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: 415,
230
+ HTTP_STATUS_RANGE_NOT_SATISFIABLE: 416,
231
+ HTTP_STATUS_EXPECTATION_FAILED: 417,
232
+ HTTP_STATUS_TEAPOT: 418,
233
+ HTTP_STATUS_MISDIRECTED_REQUEST: 421,
234
+ HTTP_STATUS_UNPROCESSABLE_ENTITY: 422,
235
+ HTTP_STATUS_LOCKED: 423,
236
+ HTTP_STATUS_FAILED_DEPENDENCY: 424,
237
+ HTTP_STATUS_TOO_EARLY: 425,
238
+ HTTP_STATUS_UPGRADE_REQUIRED: 426,
239
+ HTTP_STATUS_PRECONDITION_REQUIRED: 428,
240
+ HTTP_STATUS_TOO_MANY_REQUESTS: 429,
241
+ HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
242
+ HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: 451,
243
+ HTTP_STATUS_INTERNAL_SERVER_ERROR: 500,
244
+ HTTP_STATUS_NOT_IMPLEMENTED: 501,
245
+ HTTP_STATUS_BAD_GATEWAY: 502,
246
+ HTTP_STATUS_SERVICE_UNAVAILABLE: 503,
247
+ HTTP_STATUS_GATEWAY_TIMEOUT: 504,
248
+ HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: 505,
249
+ HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: 506,
250
+ HTTP_STATUS_INSUFFICIENT_STORAGE: 507,
251
+ HTTP_STATUS_LOOP_DETECTED: 508,
252
+ HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: 509,
253
+ HTTP_STATUS_NOT_EXTENDED: 510,
254
+ HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: 511
255
+ };
256
+ const SETTINGS_MAP = [
257
+ [1, "headerTableSize", false],
258
+ [2, "enablePush", true],
259
+ [3, "maxConcurrentStreams", false],
260
+ [4, "initialWindowSize", false],
261
+ [5, "maxFrameSize", false],
262
+ [6, "maxHeaderListSize", false],
263
+ [8, "enableConnectProtocol", true]
264
+ ];
265
+ function getDefaultSettings() {
266
+ return {
267
+ headerTableSize: 4096,
268
+ enablePush: true,
269
+ maxConcurrentStreams: 4294967295,
270
+ initialWindowSize: 65535,
271
+ maxFrameSize: 16384,
272
+ maxHeaderListSize: 65535,
273
+ enableConnectProtocol: false
274
+ };
275
+ }
276
+ function getPackedSettings(settings) {
277
+ if (!settings) return new Uint8Array(0);
278
+ const pairs = [];
279
+ for (const [id, key, isBool] of SETTINGS_MAP) {
280
+ const val = settings[key];
281
+ if (val !== void 0) {
282
+ pairs.push([id, isBool ? val ? 1 : 0 : val]);
283
+ }
284
+ }
285
+ const buf = new Uint8Array(pairs.length * 6);
286
+ const view = new DataView(buf.buffer);
287
+ for (let i = 0; i < pairs.length; i++) {
288
+ const offset = i * 6;
289
+ view.setUint16(offset, pairs[i][0], false);
290
+ view.setUint32(offset + 2, pairs[i][1], false);
291
+ }
292
+ return buf;
293
+ }
294
+ function getUnpackedSettings(buf) {
295
+ const data = buf instanceof ArrayBuffer ? new Uint8Array(buf) : buf;
296
+ if (data.byteLength % 6 !== 0) {
297
+ throw new RangeError("Invalid packed settings length");
298
+ }
299
+ const result = {};
300
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
301
+ for (let i = 0; i < data.byteLength; i += 6) {
302
+ const id = view.getUint16(i, false);
303
+ const value = view.getUint32(i + 2, false);
304
+ for (const [settingId, key, isBool] of SETTINGS_MAP) {
305
+ if (id === settingId) {
306
+ result[key] = isBool ? value !== 0 : value;
307
+ break;
308
+ }
309
+ }
310
+ }
311
+ return result;
312
+ }
313
+ class Http2Session extends EventEmitter {
314
+ alpnProtocol = void 0;
315
+ encrypted = false;
316
+ type = constants.NGHTTP2_SESSION_CLIENT;
317
+ _closed = false;
318
+ _destroyed = false;
319
+ _settings;
320
+ constructor() {
321
+ super();
322
+ this._settings = getDefaultSettings();
323
+ }
324
+ get closed() {
325
+ return this._closed;
326
+ }
327
+ get destroyed() {
328
+ return this._destroyed;
329
+ }
330
+ get connecting() {
331
+ return false;
332
+ }
333
+ get pendingSettingsAck() {
334
+ return false;
335
+ }
336
+ get localSettings() {
337
+ return { ...this._settings };
338
+ }
339
+ get remoteSettings() {
340
+ return getDefaultSettings();
341
+ }
342
+ settings(settings, callback) {
343
+ Object.assign(this._settings, settings);
344
+ if (callback) Promise.resolve().then(callback);
345
+ }
346
+ goaway(code, _lastStreamId, _data) {
347
+ this.emit("goaway", code ?? constants.NGHTTP2_NO_ERROR);
348
+ }
349
+ ping(payload, callback) {
350
+ const buf = payload || new Uint8Array(8);
351
+ if (callback) Promise.resolve().then(() => callback(null, 0, buf));
352
+ return true;
353
+ }
354
+ close(callback) {
355
+ if (this._closed) return;
356
+ this._closed = true;
357
+ this.emit("close");
358
+ if (callback) callback();
359
+ }
360
+ destroy(error, code) {
361
+ if (this._destroyed) return;
362
+ this._destroyed = true;
363
+ this._closed = true;
364
+ if (error) this.emit("error", error);
365
+ this.emit("close");
366
+ if (code !== void 0) {
367
+ this.goaway(code);
368
+ }
369
+ }
370
+ ref() {
371
+ }
372
+ unref() {
373
+ }
374
+ }
375
+ class ServerHttp2Session extends Http2Session {
376
+ type = constants.NGHTTP2_SESSION_SERVER;
377
+ altsvc(_alt, _originOrStream) {
378
+ }
379
+ origin(..._origins) {
380
+ }
381
+ }
382
+ class ClientHttp2Session extends Http2Session {
383
+ request(_headers, _options) {
384
+ throw new Error("http2 client requests are not yet implemented in GJS");
385
+ }
386
+ }
387
+ class Http2Stream extends EventEmitter {
388
+ id = 0;
389
+ session = null;
390
+ sentHeaders = {};
391
+ sentInfoHeaders = [];
392
+ _closed = false;
393
+ _destroyed = false;
394
+ _state = constants.NGHTTP2_STREAM_STATE_IDLE;
395
+ get closed() {
396
+ return this._closed;
397
+ }
398
+ get destroyed() {
399
+ return this._destroyed;
400
+ }
401
+ get pending() {
402
+ return this.id === 0;
403
+ }
404
+ get state() {
405
+ return this._state;
406
+ }
407
+ get endAfterHeaders() {
408
+ return false;
409
+ }
410
+ get bufferSize() {
411
+ return 0;
412
+ }
413
+ get rstCode() {
414
+ return constants.NGHTTP2_NO_ERROR;
415
+ }
416
+ close(code, callback) {
417
+ if (this._closed) return;
418
+ this._closed = true;
419
+ this._state = constants.NGHTTP2_STREAM_STATE_CLOSED;
420
+ this.emit("close", code ?? constants.NGHTTP2_NO_ERROR);
421
+ if (callback) callback();
422
+ }
423
+ destroy(error) {
424
+ if (this._destroyed) return;
425
+ this._destroyed = true;
426
+ this._closed = true;
427
+ this._state = constants.NGHTTP2_STREAM_STATE_CLOSED;
428
+ if (error) this.emit("error", error);
429
+ this.emit("close");
430
+ }
431
+ priority(_options) {
432
+ }
433
+ setTimeout(msecs, callback) {
434
+ if (callback) setTimeout(callback, msecs);
435
+ }
436
+ }
437
+ class ServerHttp2Stream extends Http2Stream {
438
+ headersSent = false;
439
+ pushAllowed = false;
440
+ respond(_headers, _options) {
441
+ throw new Error("http2 server respond is not yet implemented in GJS");
442
+ }
443
+ respondWithFD(_fd, _headers, _options) {
444
+ throw new Error("http2 respondWithFD is not yet implemented in GJS");
445
+ }
446
+ respondWithFile(_path, _headers, _options) {
447
+ throw new Error("http2 respondWithFile is not yet implemented in GJS");
448
+ }
449
+ pushStream(_headers, _options, _callback) {
450
+ throw new Error("http2 server push is not yet implemented in GJS");
451
+ }
452
+ additionalHeaders(_headers) {
453
+ }
454
+ }
455
+ class ClientHttp2Stream extends Http2Stream {
456
+ }
457
+ class Http2ServerRequest extends EventEmitter {
458
+ headers = {};
459
+ httpVersion = "2.0";
460
+ method = "GET";
461
+ url = "/";
462
+ stream = null;
463
+ authority = "";
464
+ scheme = "https";
465
+ get complete() {
466
+ return true;
467
+ }
468
+ setTimeout(msecs, callback) {
469
+ if (callback) setTimeout(callback, msecs);
470
+ return this;
471
+ }
472
+ }
473
+ class Http2ServerResponse extends EventEmitter {
474
+ statusCode = 200;
475
+ stream = null;
476
+ headersSent = false;
477
+ _headers = {};
478
+ setHeader(name, value) {
479
+ this._headers[name.toLowerCase()] = value;
480
+ return this;
481
+ }
482
+ getHeader(name) {
483
+ return this._headers[name.toLowerCase()];
484
+ }
485
+ getHeaders() {
486
+ return { ...this._headers };
487
+ }
488
+ removeHeader(name) {
489
+ delete this._headers[name.toLowerCase()];
490
+ }
491
+ hasHeader(name) {
492
+ return name.toLowerCase() in this._headers;
493
+ }
494
+ writeHead(statusCode, headers) {
495
+ this.statusCode = statusCode;
496
+ if (headers) {
497
+ for (const [name, value] of Object.entries(headers)) {
498
+ this._headers[name.toLowerCase()] = value;
499
+ }
500
+ }
501
+ return this;
502
+ }
503
+ end(_data, _encoding, _callback) {
504
+ this.emit("finish");
505
+ return this;
506
+ }
507
+ write(_chunk, _encoding, _callback) {
508
+ return true;
509
+ }
510
+ createPushResponse(_headers, _callback) {
511
+ throw new Error("http2 server push is not yet implemented in GJS");
512
+ }
513
+ setTimeout(msecs, callback) {
514
+ if (callback) setTimeout(callback, msecs);
515
+ return this;
516
+ }
517
+ }
518
+ function createServer(_options, _onRequestHandler) {
519
+ throw new Error(
520
+ "http2.createServer() is not yet implemented in GJS. Soup 3.0 handles HTTP/2 transparently but does not expose multiplexed streams. Use http.createServer() for HTTP/1.1 or consider a future nghttp2-based implementation."
521
+ );
522
+ }
523
+ function createSecureServer(_options, _onRequestHandler) {
524
+ throw new Error(
525
+ "http2.createSecureServer() is not yet implemented in GJS. Requires TLS server support combined with HTTP/2 multiplexing."
526
+ );
527
+ }
528
+ function connect(_authority, _options, _listener) {
529
+ throw new Error(
530
+ "http2.connect() is not yet implemented in GJS. Soup 3.0 can negotiate HTTP/2 transparently via Soup.Session, but does not expose the session/stream API needed for http2.connect()."
531
+ );
532
+ }
533
+ const sensitiveHeaders = /* @__PURE__ */ Symbol("http2.sensitiveHeaders");
534
+ function performServerHandshake(_socket) {
535
+ throw new Error("http2.performServerHandshake() is not yet implemented in GJS");
536
+ }
537
+ var index_default = {
538
+ constants,
539
+ createServer,
540
+ createSecureServer,
541
+ connect,
542
+ getDefaultSettings,
543
+ getPackedSettings,
544
+ getUnpackedSettings,
545
+ sensitiveHeaders,
546
+ performServerHandshake,
547
+ Http2Session,
548
+ Http2Stream,
549
+ ServerHttp2Session,
550
+ ClientHttp2Session,
551
+ ServerHttp2Stream,
552
+ ClientHttp2Stream,
553
+ Http2ServerRequest,
554
+ Http2ServerResponse
555
+ };
556
+ export {
557
+ ClientHttp2Session,
558
+ ClientHttp2Stream,
559
+ Http2ServerRequest,
560
+ Http2ServerResponse,
561
+ Http2Session,
562
+ Http2Stream,
563
+ ServerHttp2Session,
564
+ ServerHttp2Stream,
565
+ connect,
566
+ constants,
567
+ createSecureServer,
568
+ createServer,
569
+ index_default as default,
570
+ getDefaultSettings,
571
+ getPackedSettings,
572
+ getUnpackedSettings,
573
+ performServerHandshake,
574
+ sensitiveHeaders
575
+ };