@inkbox/sdk 0.2.16 → 0.3.1

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.
Files changed (119) hide show
  1. package/README.md +10 -1
  2. package/dist/_http.d.ts +24 -5
  3. package/dist/_http.d.ts.map +1 -1
  4. package/dist/_http.js +21 -11
  5. package/dist/_http.js.map +1 -1
  6. package/dist/index.d.ts +4 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/inkbox.d.ts +4 -0
  11. package/dist/inkbox.d.ts.map +1 -1
  12. package/dist/inkbox.js +5 -0
  13. package/dist/inkbox.js.map +1 -1
  14. package/dist/tunnels/_validation.d.ts +7 -0
  15. package/dist/tunnels/_validation.d.ts.map +1 -0
  16. package/dist/tunnels/_validation.js +27 -0
  17. package/dist/tunnels/_validation.js.map +1 -0
  18. package/dist/tunnels/client/_bridge.d.ts +35 -0
  19. package/dist/tunnels/client/_bridge.d.ts.map +1 -0
  20. package/dist/tunnels/client/_bridge.js +52 -0
  21. package/dist/tunnels/client/_bridge.js.map +1 -0
  22. package/dist/tunnels/client/_callable_streaming.d.ts +25 -0
  23. package/dist/tunnels/client/_callable_streaming.d.ts.map +1 -0
  24. package/dist/tunnels/client/_callable_streaming.js +158 -0
  25. package/dist/tunnels/client/_callable_streaming.js.map +1 -0
  26. package/dist/tunnels/client/_cert.d.ts +45 -0
  27. package/dist/tunnels/client/_cert.d.ts.map +1 -0
  28. package/dist/tunnels/client/_cert.js +193 -0
  29. package/dist/tunnels/client/_cert.js.map +1 -0
  30. package/dist/tunnels/client/_dispatch.d.ts +109 -0
  31. package/dist/tunnels/client/_dispatch.d.ts.map +1 -0
  32. package/dist/tunnels/client/_dispatch.js +314 -0
  33. package/dist/tunnels/client/_dispatch.js.map +1 -0
  34. package/dist/tunnels/client/_envelope.d.ts +55 -0
  35. package/dist/tunnels/client/_envelope.d.ts.map +1 -0
  36. package/dist/tunnels/client/_envelope.js +97 -0
  37. package/dist/tunnels/client/_envelope.js.map +1 -0
  38. package/dist/tunnels/client/_h1_server.d.ts +37 -0
  39. package/dist/tunnels/client/_h1_server.d.ts.map +1 -0
  40. package/dist/tunnels/client/_h1_server.js +433 -0
  41. package/dist/tunnels/client/_h1_server.js.map +1 -0
  42. package/dist/tunnels/client/_h2_transcode.d.ts +43 -0
  43. package/dist/tunnels/client/_h2_transcode.d.ts.map +1 -0
  44. package/dist/tunnels/client/_h2_transcode.js +488 -0
  45. package/dist/tunnels/client/_h2_transcode.js.map +1 -0
  46. package/dist/tunnels/client/_handler.d.ts +62 -0
  47. package/dist/tunnels/client/_handler.d.ts.map +1 -0
  48. package/dist/tunnels/client/_handler.js +121 -0
  49. package/dist/tunnels/client/_handler.js.map +1 -0
  50. package/dist/tunnels/client/_listener.d.ts +64 -0
  51. package/dist/tunnels/client/_listener.d.ts.map +1 -0
  52. package/dist/tunnels/client/_listener.js +113 -0
  53. package/dist/tunnels/client/_listener.js.map +1 -0
  54. package/dist/tunnels/client/_protocol.d.ts +67 -0
  55. package/dist/tunnels/client/_protocol.d.ts.map +1 -0
  56. package/dist/tunnels/client/_protocol.js +86 -0
  57. package/dist/tunnels/client/_protocol.js.map +1 -0
  58. package/dist/tunnels/client/_runtime.d.ts +143 -0
  59. package/dist/tunnels/client/_runtime.d.ts.map +1 -0
  60. package/dist/tunnels/client/_runtime.js +1679 -0
  61. package/dist/tunnels/client/_runtime.js.map +1 -0
  62. package/dist/tunnels/client/_state.d.ts +45 -0
  63. package/dist/tunnels/client/_state.d.ts.map +1 -0
  64. package/dist/tunnels/client/_state.js +165 -0
  65. package/dist/tunnels/client/_state.js.map +1 -0
  66. package/dist/tunnels/client/_tls.d.ts +50 -0
  67. package/dist/tunnels/client/_tls.d.ts.map +1 -0
  68. package/dist/tunnels/client/_tls.js +139 -0
  69. package/dist/tunnels/client/_tls.js.map +1 -0
  70. package/dist/tunnels/client/_upstream_tls.d.ts +25 -0
  71. package/dist/tunnels/client/_upstream_tls.d.ts.map +1 -0
  72. package/dist/tunnels/client/_upstream_tls.js +24 -0
  73. package/dist/tunnels/client/_upstream_tls.js.map +1 -0
  74. package/dist/tunnels/client/_url_forward.d.ts +92 -0
  75. package/dist/tunnels/client/_url_forward.d.ts.map +1 -0
  76. package/dist/tunnels/client/_url_forward.js +255 -0
  77. package/dist/tunnels/client/_url_forward.js.map +1 -0
  78. package/dist/tunnels/client/_validation.d.ts +27 -0
  79. package/dist/tunnels/client/_validation.d.ts.map +1 -0
  80. package/dist/tunnels/client/_validation.js +96 -0
  81. package/dist/tunnels/client/_validation.js.map +1 -0
  82. package/dist/tunnels/client/_ws.d.ts +149 -0
  83. package/dist/tunnels/client/_ws.d.ts.map +1 -0
  84. package/dist/tunnels/client/_ws.js +351 -0
  85. package/dist/tunnels/client/_ws.js.map +1 -0
  86. package/dist/tunnels/client/_ws_passthrough.d.ts +129 -0
  87. package/dist/tunnels/client/_ws_passthrough.d.ts.map +1 -0
  88. package/dist/tunnels/client/_ws_passthrough.js +432 -0
  89. package/dist/tunnels/client/_ws_passthrough.js.map +1 -0
  90. package/dist/tunnels/client/_ws_url_bridge.d.ts +71 -0
  91. package/dist/tunnels/client/_ws_url_bridge.d.ts.map +1 -0
  92. package/dist/tunnels/client/_ws_url_bridge.js +474 -0
  93. package/dist/tunnels/client/_ws_url_bridge.js.map +1 -0
  94. package/dist/tunnels/client/_ws_url_edge_bridge.d.ts +26 -0
  95. package/dist/tunnels/client/_ws_url_edge_bridge.d.ts.map +1 -0
  96. package/dist/tunnels/client/_ws_url_edge_bridge.js +256 -0
  97. package/dist/tunnels/client/_ws_url_edge_bridge.js.map +1 -0
  98. package/dist/tunnels/client/_wsframe.d.ts +142 -0
  99. package/dist/tunnels/client/_wsframe.d.ts.map +1 -0
  100. package/dist/tunnels/client/_wsframe.js +282 -0
  101. package/dist/tunnels/client/_wsframe.js.map +1 -0
  102. package/dist/tunnels/client/index.d.ts +101 -0
  103. package/dist/tunnels/client/index.d.ts.map +1 -0
  104. package/dist/tunnels/client/index.js +242 -0
  105. package/dist/tunnels/client/index.js.map +1 -0
  106. package/dist/tunnels/exceptions.d.ts +31 -0
  107. package/dist/tunnels/exceptions.d.ts.map +1 -0
  108. package/dist/tunnels/exceptions.js +68 -0
  109. package/dist/tunnels/exceptions.js.map +1 -0
  110. package/dist/tunnels/resources/tunnels.d.ts +73 -0
  111. package/dist/tunnels/resources/tunnels.d.ts.map +1 -0
  112. package/dist/tunnels/resources/tunnels.js +173 -0
  113. package/dist/tunnels/resources/tunnels.js.map +1 -0
  114. package/dist/tunnels/types.d.ts +99 -0
  115. package/dist/tunnels/types.d.ts.map +1 -0
  116. package/dist/tunnels/types.js +76 -0
  117. package/dist/tunnels/types.js.map +1 -0
  118. package/package.json +14 -5
  119. package/protocol/tunnel_protocol_constants.json +65 -0
@@ -0,0 +1,433 @@
1
+ /**
2
+ * inkbox-tunnels/client/_h1_server.ts
3
+ *
4
+ * In-process HTTP/1.1 server-side parser. Drives `node:http`'s server
5
+ * over an in-memory Duplex (the "WireDuplex" pattern — the underlying
6
+ * Socket surface is mocked just enough that node:http accepts it) to
7
+ * turn plaintext bytes from the third party into `DispatchRequest`
8
+ * objects, hands them to a `Dispatch` impl, and serializes responses
9
+ * back to plaintext bytes.
10
+ *
11
+ * Implements the Plaintext adapter contract used by the runtime in
12
+ * passthrough mode after the TLS terminator.
13
+ */
14
+ import * as http from "node:http";
15
+ import { Duplex } from "node:stream";
16
+ import { HOP_BY_HOP_RESPONSE } from "./_protocol.js";
17
+ import { ByteChannelWebSocketSink, computeWsAccept, } from "./_ws_passthrough.js";
18
+ /** Sentinel pushed onto the outbound queue to signal "no more bytes". */
19
+ const OUTBOUND_END = Symbol("outbound-end");
20
+ /**
21
+ * Bidirectional in-memory pipe that we feed wire bytes into and read
22
+ * wire bytes out of. `node:http`'s server treats this as a connection
23
+ * via `server.emit("connection", duplex)`.
24
+ */
25
+ class H1WireDuplex extends Duplex {
26
+ inbound = [];
27
+ outboundQueue = [];
28
+ outboundResolvers = [];
29
+ constructor() {
30
+ super({ allowHalfOpen: true });
31
+ }
32
+ pushIncoming(buf) {
33
+ this.inbound.push(buf);
34
+ this._read(0);
35
+ }
36
+ /** Wait for one outbound chunk; returns `OUTBOUND_END` on close. */
37
+ takeOutbound() {
38
+ if (this.outboundQueue.length > 0) {
39
+ return Promise.resolve(this.outboundQueue.shift());
40
+ }
41
+ return new Promise((resolve) => this.outboundResolvers.push(resolve));
42
+ }
43
+ endOutbound() {
44
+ this._enqueueOutbound(OUTBOUND_END);
45
+ }
46
+ _read(_size) {
47
+ while (this.inbound.length > 0) {
48
+ const chunk = this.inbound.shift();
49
+ if (!this.push(chunk))
50
+ return;
51
+ }
52
+ }
53
+ _write(chunk, _enc, cb) {
54
+ const buf = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
55
+ this._enqueueOutbound(buf);
56
+ cb();
57
+ }
58
+ _final(cb) {
59
+ cb();
60
+ }
61
+ // Socket-like methods node:http's server probes for. These cover the
62
+ // surface it touches when the underlying transport isn't a real net
63
+ // socket (return self / no-ops are fine — there's no kernel socket
64
+ // to configure).
65
+ setTimeout(_ms, _cb) { return this; }
66
+ setNoDelay(_b) { return this; }
67
+ setKeepAlive(_b, _ms) { return this; }
68
+ unref() { return this; }
69
+ ref() { return this; }
70
+ address() {
71
+ return { port: 0, family: "IPv4", address: "127.0.0.1" };
72
+ }
73
+ get remoteAddress() { return "127.0.0.1"; }
74
+ get remoteFamily() { return "IPv4"; }
75
+ get remotePort() { return 0; }
76
+ get localAddress() { return "127.0.0.1"; }
77
+ get localPort() { return 0; }
78
+ _enqueueOutbound(item) {
79
+ if (this.outboundResolvers.length > 0) {
80
+ const resolve = this.outboundResolvers.shift();
81
+ resolve(item);
82
+ return;
83
+ }
84
+ this.outboundQueue.push(item);
85
+ }
86
+ }
87
+ /**
88
+ * h1 parser exposed as a Plaintext adapter. One instance per third-
89
+ * party TLS session.
90
+ */
91
+ export class InProcH1ParserPlaintext {
92
+ wire;
93
+ server;
94
+ maxInboundBodyBytes;
95
+ closed = false;
96
+ constructor(opts) {
97
+ this.wire = new H1WireDuplex();
98
+ this.maxInboundBodyBytes = opts.maxInboundBodyBytes;
99
+ this.server = http.createServer();
100
+ this.server.on("request", (req, res) => {
101
+ void this.handleRequest(opts.dispatch, opts.forwardedForIp, opts.sniHost, req, res);
102
+ });
103
+ this.server.on("upgrade", (req, socket, head) => {
104
+ void this.handleUpgrade(opts.dispatch, opts.forwardedForIp, opts.sniHost, req, socket, head);
105
+ });
106
+ this.server.emit("connection", this.wire);
107
+ }
108
+ async feed(plaintext) {
109
+ if (this.closed)
110
+ return;
111
+ this.wire.pushIncoming(plaintext);
112
+ }
113
+ async pumpOutbound(send) {
114
+ while (true) {
115
+ const item = await this.wire.takeOutbound();
116
+ if (item === OUTBOUND_END)
117
+ return;
118
+ try {
119
+ await send(item);
120
+ }
121
+ catch {
122
+ return;
123
+ }
124
+ }
125
+ }
126
+ async aclose() {
127
+ if (this.closed)
128
+ return;
129
+ this.closed = true;
130
+ try {
131
+ this.server.close();
132
+ }
133
+ catch {
134
+ /* swallow */
135
+ }
136
+ this.wire.endOutbound();
137
+ }
138
+ async handleUpgrade(dispatch, forwardedForIp, sniHost, req, socket, head) {
139
+ const headers = [];
140
+ let isWebSocket = false;
141
+ let wsSubprotocol = null;
142
+ let wsKey = null;
143
+ const rawHeaders = req.rawHeaders;
144
+ for (let i = 0; i + 1 < rawHeaders.length; i += 2) {
145
+ const name = rawHeaders[i].toLowerCase();
146
+ const value = rawHeaders[i + 1];
147
+ headers.push([name, value]);
148
+ if (name === "upgrade" && value.toLowerCase() === "websocket") {
149
+ isWebSocket = true;
150
+ }
151
+ else if (name === "sec-websocket-protocol") {
152
+ wsSubprotocol = value;
153
+ }
154
+ else if (name === "sec-websocket-key") {
155
+ wsKey = value;
156
+ }
157
+ }
158
+ if (!isWebSocket ||
159
+ wsKey === null ||
160
+ typeof dispatch.dispatchWebSocket !== "function") {
161
+ try {
162
+ socket.write("HTTP/1.1 501 Not Implemented\r\n" +
163
+ "Connection: close\r\n" +
164
+ "Content-Length: 0\r\n" +
165
+ "\r\n");
166
+ socket.end();
167
+ }
168
+ catch {
169
+ /* swallow */
170
+ }
171
+ return;
172
+ }
173
+ const acceptValue = computeWsAccept(wsKey);
174
+ const buildAccept = (subprotocol, extraHeaders) => {
175
+ const lines = [
176
+ "HTTP/1.1 101 Switching Protocols",
177
+ "Upgrade: websocket",
178
+ "Connection: Upgrade",
179
+ `Sec-WebSocket-Accept: ${acceptValue}`,
180
+ ];
181
+ if (subprotocol !== null) {
182
+ lines.push(`Sec-WebSocket-Protocol: ${subprotocol}`);
183
+ }
184
+ if (extraHeaders !== null) {
185
+ for (const [hk, hv] of extraHeaders) {
186
+ lines.push(`${hk}: ${hv}`);
187
+ }
188
+ }
189
+ return Buffer.from(lines.join("\r\n") + "\r\n\r\n", "ascii");
190
+ };
191
+ const buildReject = (status) => {
192
+ const phrase = status === 400
193
+ ? "Bad Request"
194
+ : status === 403
195
+ ? "Forbidden"
196
+ : status === 500
197
+ ? "Internal Server Error"
198
+ : "Error";
199
+ const body = "upgrade refused";
200
+ return Buffer.from(`HTTP/1.1 ${status} ${phrase}\r\n` +
201
+ `Content-Type: text/plain\r\n` +
202
+ `Content-Length: ${body.length}\r\n` +
203
+ `Connection: close\r\n\r\n${body}`, "ascii");
204
+ };
205
+ const sendPlaintext = async (data) => {
206
+ await new Promise((resolve, reject) => {
207
+ socket.write(data, (err) => (err ? reject(err) : resolve()));
208
+ });
209
+ };
210
+ const sink = new ByteChannelWebSocketSink({
211
+ sendPlaintext,
212
+ buildAcceptResponse: buildAccept,
213
+ buildRejectResponse: buildReject,
214
+ onClose: async () => {
215
+ try {
216
+ socket.end();
217
+ }
218
+ catch {
219
+ /* swallow */
220
+ }
221
+ },
222
+ });
223
+ socket.on("data", (chunk) => {
224
+ const buf = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
225
+ sink.feedInbound(buf);
226
+ });
227
+ socket.on("end", () => sink.signalInboundEof());
228
+ socket.on("close", () => sink.signalInboundEof());
229
+ socket.on("error", () => sink.signalInboundEof());
230
+ if (head !== undefined && head.length > 0) {
231
+ sink.feedInbound(head);
232
+ }
233
+ const dispatchRequest = {
234
+ method: req.method ?? "GET",
235
+ path: req.url ?? "/",
236
+ headers,
237
+ body: emptyAsyncIter(),
238
+ forwardedForIp,
239
+ sniHost,
240
+ isWebSocket: true,
241
+ wsSubprotocol,
242
+ transport: "h1",
243
+ };
244
+ try {
245
+ await dispatch.dispatchWebSocket(dispatchRequest, sink);
246
+ }
247
+ catch {
248
+ try {
249
+ await sink.aclose();
250
+ }
251
+ catch {
252
+ /* swallow */
253
+ }
254
+ }
255
+ }
256
+ async handleRequest(dispatch, forwardedForIp, sniHost, req, res) {
257
+ const headers = [];
258
+ let isWebSocket = false;
259
+ let wsSubprotocol = null;
260
+ const rawHeaders = req.rawHeaders;
261
+ for (let i = 0; i + 1 < rawHeaders.length; i += 2) {
262
+ const name = rawHeaders[i].toLowerCase();
263
+ const value = rawHeaders[i + 1];
264
+ headers.push([name, value]);
265
+ if (name === "upgrade" && value.toLowerCase() === "websocket") {
266
+ isWebSocket = true;
267
+ }
268
+ else if (name === "sec-websocket-protocol") {
269
+ wsSubprotocol = value;
270
+ }
271
+ }
272
+ let inboundCount = 0;
273
+ let oversize = false;
274
+ const bodyChunks = [];
275
+ const bodyResolvers = [];
276
+ const enqueue = (item) => {
277
+ if (bodyResolvers.length > 0) {
278
+ bodyResolvers.shift()(item);
279
+ return;
280
+ }
281
+ bodyChunks.push(item ?? Buffer.alloc(0));
282
+ if (item === null)
283
+ bodyChunks.push(Buffer.alloc(0)); // sentinel marker
284
+ };
285
+ req.on("data", (chunk) => {
286
+ if (oversize)
287
+ return;
288
+ const buf = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
289
+ inboundCount += buf.length;
290
+ if (inboundCount > this.maxInboundBodyBytes) {
291
+ oversize = true;
292
+ // Best-effort 413, then destroy.
293
+ if (!res.headersSent) {
294
+ res.statusCode = 413;
295
+ res.setHeader("content-type", "text/plain");
296
+ res.setHeader("content-length", String("payload too large".length));
297
+ res.setHeader("connection", "close");
298
+ res.end("payload too large");
299
+ }
300
+ req.destroy();
301
+ return;
302
+ }
303
+ enqueue(buf);
304
+ });
305
+ req.on("end", () => enqueue(null));
306
+ req.on("error", () => enqueue(null));
307
+ async function* bodyIter() {
308
+ while (true) {
309
+ if (bodyChunks.length === 0) {
310
+ const item = await new Promise((resolve) => bodyResolvers.push(resolve));
311
+ if (item === null)
312
+ return;
313
+ yield item;
314
+ continue;
315
+ }
316
+ const chunk = bodyChunks.shift();
317
+ // Empty buffer = sentinel for end.
318
+ if (chunk.length === 0 && bodyChunks.length === 0)
319
+ return;
320
+ if (chunk.length > 0)
321
+ yield chunk;
322
+ }
323
+ }
324
+ const dispatchRequest = {
325
+ method: req.method ?? "GET",
326
+ path: req.url ?? "/",
327
+ headers,
328
+ body: bodyIter(),
329
+ forwardedForIp,
330
+ sniHost,
331
+ isWebSocket,
332
+ wsSubprotocol,
333
+ transport: "h1",
334
+ };
335
+ const sink = makeResponseSink(res);
336
+ try {
337
+ await dispatch.dispatch(dispatchRequest, sink);
338
+ }
339
+ catch {
340
+ if (!res.headersSent) {
341
+ try {
342
+ res.statusCode = 502;
343
+ res.setHeader("content-type", "text/plain");
344
+ res.end("upstream error");
345
+ }
346
+ catch {
347
+ /* swallow */
348
+ }
349
+ }
350
+ }
351
+ try {
352
+ if (!res.writableEnded)
353
+ res.end();
354
+ }
355
+ catch {
356
+ /* swallow */
357
+ }
358
+ }
359
+ }
360
+ async function* emptyAsyncIter() {
361
+ if (false)
362
+ yield Buffer.alloc(0);
363
+ }
364
+ function makeResponseSink(res) {
365
+ let headSent = false;
366
+ let bodyEnded = false;
367
+ return {
368
+ async sendHead(head) {
369
+ if (headSent)
370
+ return;
371
+ headSent = true;
372
+ res.statusCode = head.status;
373
+ // Strip hop-by-hop response headers; let node:http manage
374
+ // transfer-encoding from the rest. Accumulate values per name
375
+ // before calling setHeader once: setHeader(name, value) overwrites
376
+ // the previous value, which would drop earlier Set-Cookie /
377
+ // multi-value entries when iterating one-at-a-time.
378
+ const grouped = new Map();
379
+ for (const [k, v] of head.headers) {
380
+ const kl = k.toLowerCase();
381
+ if (HOP_BY_HOP_RESPONSE.has(kl))
382
+ continue;
383
+ const list = grouped.get(kl);
384
+ if (list === undefined) {
385
+ grouped.set(kl, [v]);
386
+ }
387
+ else {
388
+ list.push(v);
389
+ }
390
+ }
391
+ for (const [kl, values] of grouped) {
392
+ try {
393
+ // node:http accepts string | string[]; passing an array of
394
+ // length 1 is equivalent to a single string, but using the
395
+ // array form keeps the multi-value Set-Cookie path correct.
396
+ res.setHeader(kl, values.length === 1 ? values[0] : values);
397
+ }
398
+ catch {
399
+ /* invalid header — skip */
400
+ }
401
+ }
402
+ // node:http calls writeHead lazily on first write; force it now
403
+ // so headers are flushed before any body bytes.
404
+ res.flushHeaders();
405
+ },
406
+ async sendBody(chunk) {
407
+ if (bodyEnded)
408
+ return;
409
+ await new Promise((resolve, reject) => {
410
+ res.write(chunk, (err) => (err ? reject(err) : resolve()));
411
+ });
412
+ },
413
+ async endBody() {
414
+ if (bodyEnded)
415
+ return;
416
+ bodyEnded = true;
417
+ await new Promise((resolve) => res.end(resolve));
418
+ },
419
+ async reset(reason) {
420
+ bodyEnded = true;
421
+ // h1 has no graceful mid-response reset — destroy the socket.
422
+ // Reason surfaces in logs only; transport closes.
423
+ void reason;
424
+ try {
425
+ res.destroy();
426
+ }
427
+ catch {
428
+ /* swallow */
429
+ }
430
+ },
431
+ };
432
+ }
433
+ //# sourceMappingURL=_h1_server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_h1_server.js","sourceRoot":"","sources":["../../../src/tunnels/client/_h1_server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * inkbox-tunnels/client/_h2_transcode.ts
3
+ *
4
+ * Server-side HTTP/2 fed by TLS plaintext via the WireDuplex pattern.
5
+ * Each h2 stream becomes a `DispatchRequest` handed to a `Dispatch`
6
+ * impl; the dispatcher's streamed response is encoded back into
7
+ * HEADERS+DATA+END_STREAM frames.
8
+ *
9
+ * Implements the Plaintext adapter contract used by the runtime in
10
+ * passthrough mode after the TLS terminator.
11
+ *
12
+ * WebSocket-over-h2 (RFC 8441 Extended CONNECT) is supported when the
13
+ * dispatcher exposes ``dispatchWebSocket``: the transcoder builds a
14
+ * byte-channel sink whose inbound DATA frames feed a frame decoder
15
+ * (unmasked per RFC 8441 §5.1) and whose outbound bytes ride h2 DATA
16
+ * frames. Dispatchers without that method respond ``:status 501``.
17
+ */
18
+ import type { Dispatch } from "./_dispatch.js";
19
+ export interface H2TranscoderPlaintextOpts {
20
+ dispatch: Dispatch;
21
+ maxInboundBodyBytes: number;
22
+ forwardedForIp: string | null;
23
+ sniHost: string | null;
24
+ }
25
+ /**
26
+ * h2 server fed by TLS plaintext; routes streams to a Dispatch impl.
27
+ * One instance per third-party TLS session.
28
+ */
29
+ export declare class H2TranscoderPlaintext {
30
+ private readonly wire;
31
+ private readonly server;
32
+ private readonly maxInboundBodyBytes;
33
+ private readonly forwardedForIp;
34
+ private readonly sniHost;
35
+ private closed;
36
+ constructor(opts: H2TranscoderPlaintextOpts);
37
+ feed(plaintext: Buffer): Promise<void>;
38
+ pumpOutbound(send: (chunk: Buffer) => Promise<void>): Promise<void>;
39
+ aclose(): Promise<void>;
40
+ private handleStream;
41
+ private handleWebSocketStream;
42
+ }
43
+ //# sourceMappingURL=_h2_transcode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_h2_transcode.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_h2_transcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,gBAAgB,CAAC;AAyFxB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,yBAAyB;IAsBrC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAWf,YAAY;YAwIZ,qBAAqB;CA2IpC"}