@gjsify/http2 0.1.15 → 0.2.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/lib/esm/index.js CHANGED
@@ -1,565 +1,84 @@
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
- );
1
+ import {
2
+ constants,
3
+ getDefaultSettings,
4
+ getPackedSettings,
5
+ getUnpackedSettings
6
+ } from "./protocol.js";
7
+ import { constants as constants2, getDefaultSettings as getDefaultSettings2, getPackedSettings as getPackedSettings2, getUnpackedSettings as getUnpackedSettings2 } from "./protocol.js";
8
+ import {
9
+ Http2ServerRequest,
10
+ Http2ServerResponse,
11
+ ServerHttp2Stream,
12
+ ServerHttp2Session,
13
+ Http2Server,
14
+ Http2SecureServer
15
+ } from "./server.js";
16
+ import {
17
+ Http2ServerRequest as Http2ServerRequest2,
18
+ Http2ServerResponse as Http2ServerResponse2,
19
+ ServerHttp2Stream as ServerHttp2Stream2,
20
+ ServerHttp2Session as ServerHttp2Session2,
21
+ Http2Server as Http2Server2,
22
+ Http2SecureServer as Http2SecureServer2
23
+ } from "./server.js";
24
+ import {
25
+ Http2Session,
26
+ ClientHttp2Session,
27
+ ClientHttp2Stream
28
+ } from "./client-session.js";
29
+ import {
30
+ Http2Session as Http2Session2,
31
+ ClientHttp2Session as ClientHttp2Session2,
32
+ ClientHttp2Stream as ClientHttp2Stream2
33
+ } from "./client-session.js";
34
+ function createServer(options, handler) {
35
+ return new Http2Server2(options, handler);
522
36
  }
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
- );
37
+ function createSecureServer(options, handler) {
38
+ return new Http2SecureServer2(options, handler);
527
39
  }
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
- );
40
+ function connect(authority, options, listener) {
41
+ const authorityStr = typeof authority === "string" ? authority : authority.toString();
42
+ if (typeof options === "function") {
43
+ listener = options;
44
+ options = {};
45
+ }
46
+ const session = new ClientHttp2Session2(authorityStr, options ?? {});
47
+ if (listener) session.once("connect", listener);
48
+ return session;
532
49
  }
533
- const sensitiveHeaders = /* @__PURE__ */ Symbol("http2.sensitiveHeaders");
50
+ const sensitiveHeaders = /* @__PURE__ */ Symbol.for("nodejs.http2.sensitiveHeaders");
534
51
  function performServerHandshake(_socket) {
535
52
  throw new Error("http2.performServerHandshake() is not yet implemented in GJS");
536
53
  }
537
54
  var index_default = {
538
- constants,
55
+ constants: constants2,
539
56
  createServer,
540
57
  createSecureServer,
541
58
  connect,
542
- getDefaultSettings,
543
- getPackedSettings,
544
- getUnpackedSettings,
59
+ getDefaultSettings: getDefaultSettings2,
60
+ getPackedSettings: getPackedSettings2,
61
+ getUnpackedSettings: getUnpackedSettings2,
545
62
  sensitiveHeaders,
546
63
  performServerHandshake,
547
- Http2Session,
548
- Http2Stream,
549
- ServerHttp2Session,
550
- ClientHttp2Session,
551
- ServerHttp2Stream,
552
- ClientHttp2Stream,
553
- Http2ServerRequest,
554
- Http2ServerResponse
64
+ Http2Session: Http2Session2,
65
+ Http2Server: Http2Server2,
66
+ Http2SecureServer: Http2SecureServer2,
67
+ Http2ServerRequest: Http2ServerRequest2,
68
+ Http2ServerResponse: Http2ServerResponse2,
69
+ ServerHttp2Session: ServerHttp2Session2,
70
+ ServerHttp2Stream: ServerHttp2Stream2,
71
+ ClientHttp2Session: ClientHttp2Session2,
72
+ ClientHttp2Stream: ClientHttp2Stream2
555
73
  };
556
74
  export {
557
75
  ClientHttp2Session,
558
76
  ClientHttp2Stream,
77
+ Http2SecureServer,
78
+ Http2Server,
559
79
  Http2ServerRequest,
560
80
  Http2ServerResponse,
561
81
  Http2Session,
562
- Http2Stream,
563
82
  ServerHttp2Session,
564
83
  ServerHttp2Stream,
565
84
  connect,