@inkbox/sdk 0.2.16 → 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.
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,314 @@
1
+ /**
2
+ * inkbox-tunnels/client/_dispatch.ts
3
+ *
4
+ * The Dispatch interface — both the in-process h1 parser and the h2
5
+ * transcoder hand parsed requests to a Dispatch impl. The interface is
6
+ * transport-neutral; the same impl serves an h1 inbound and an h2 inbound.
7
+ *
8
+ * UpstreamUrlDispatch forwards requests to a customer-supplied URL via
9
+ * undici (one Pool per dispatcher). CallableDispatch invokes an
10
+ * in-process Fetch-style handler. ``dispatchWebSocket`` on either impl
11
+ * routes WS upgrades (h1 ``Upgrade: websocket`` or h2 Extended CONNECT)
12
+ * without going through the HTTP response sink.
13
+ */
14
+ import { Readable } from "node:stream";
15
+ import { Pool } from "undici";
16
+ import { HOP_BY_HOP_REQUEST } from "./_protocol.js";
17
+ import { validateEnvelopePath } from "./_validation.js";
18
+ import { joinForwardPath } from "./_url_forward.js";
19
+ import { buildUpstreamTlsConnectOpts } from "./_upstream_tls.js";
20
+ function logDispatch(line) {
21
+ // Single structured info line per dispatch outcome. Matches the
22
+ // pattern used elsewhere in `_runtime.ts` (console-based until the
23
+ // SDK gets a pluggable logger).
24
+ // eslint-disable-next-line no-console
25
+ console.info(line);
26
+ }
27
+ /**
28
+ * Forward requests to a customer-supplied URL via undici.
29
+ *
30
+ * One ``undici.Pool`` per dispatcher. The pool's connect options carry
31
+ * the upstream-TLS options when the URL is https://. We always speak
32
+ * h1 to the upstream — we transcode at this boundary.
33
+ */
34
+ export class UpstreamUrlDispatch {
35
+ pool;
36
+ forwardTo;
37
+ publicHost;
38
+ maxOutboundBodyBytes;
39
+ maxInboundBodyBytes;
40
+ verifyTls;
41
+ caBundle;
42
+ constructor(opts) {
43
+ this.forwardTo = new URL(opts.forwardTo);
44
+ this.publicHost = opts.publicHost;
45
+ this.maxOutboundBodyBytes = opts.maxOutboundBodyBytes;
46
+ this.maxInboundBodyBytes = opts.maxInboundBodyBytes;
47
+ this.verifyTls = opts.verifyTls ?? true;
48
+ this.caBundle = opts.caBundle ?? null;
49
+ const origin = `${this.forwardTo.protocol}//${this.forwardTo.host}`;
50
+ const connect = this.forwardTo.protocol === "https:"
51
+ ? buildUpstreamTlsConnectOpts({
52
+ verify: opts.verifyTls,
53
+ caBundle: opts.caBundle,
54
+ })
55
+ : {};
56
+ this.pool = new Pool(origin, {
57
+ connections: 16,
58
+ pipelining: 1,
59
+ connect,
60
+ });
61
+ }
62
+ async aclose() {
63
+ try {
64
+ await this.pool.close();
65
+ }
66
+ catch {
67
+ /* swallow */
68
+ }
69
+ }
70
+ async dispatch(request, response) {
71
+ // Path validation — same rule as edge URL forwarding.
72
+ const reason = validateEnvelopePath(request.path);
73
+ if (reason !== null) {
74
+ await sendSimple(response, 400, "invalid path");
75
+ return;
76
+ }
77
+ const targetPath = joinForwardPath(this.forwardTo.toString(), request.path);
78
+ // joinForwardPath returns a full URL; we need just the path+query for undici.
79
+ const targetUrl = new URL(targetPath);
80
+ const targetPathOnly = targetUrl.pathname + targetUrl.search;
81
+ const targetHost = this.forwardTo.host;
82
+ const outHeaders = [];
83
+ outHeaders.push(["host", targetHost]);
84
+ outHeaders.push(["x-forwarded-host", this.publicHost]);
85
+ outHeaders.push(["x-forwarded-proto", "https"]);
86
+ if (request.forwardedForIp != null) {
87
+ outHeaders.push(["x-forwarded-for", request.forwardedForIp]);
88
+ outHeaders.push(["forwarded", `for=${request.forwardedForIp}`]);
89
+ }
90
+ const seen = new Set([
91
+ "host",
92
+ "x-forwarded-host",
93
+ "x-forwarded-proto",
94
+ "x-forwarded-for",
95
+ "forwarded",
96
+ ]);
97
+ for (const [k, v] of request.headers) {
98
+ const kl = k.toLowerCase();
99
+ if (kl.startsWith(":"))
100
+ continue;
101
+ if (HOP_BY_HOP_REQUEST.has(kl))
102
+ continue;
103
+ if (seen.has(kl))
104
+ continue;
105
+ outHeaders.push([k, v]);
106
+ }
107
+ const transport = request.transport ?? "h1";
108
+ try {
109
+ const headersObj = {};
110
+ for (const [k, v] of outHeaders) {
111
+ const existing = headersObj[k];
112
+ if (existing === undefined) {
113
+ headersObj[k] = v;
114
+ }
115
+ else if (Array.isArray(existing)) {
116
+ existing.push(v);
117
+ }
118
+ else {
119
+ headersObj[k] = [existing, v];
120
+ }
121
+ }
122
+ const resp = await this.pool.request({
123
+ method: request.method,
124
+ path: targetPathOnly,
125
+ headers: headersObj,
126
+ body: Readable.from(asAsyncBytes(request.body)),
127
+ bodyTimeout: 60_000,
128
+ });
129
+ const respHeaders = [];
130
+ for (const [k, v] of Object.entries(resp.headers)) {
131
+ if (Array.isArray(v)) {
132
+ for (const item of v)
133
+ respHeaders.push([k, item]);
134
+ }
135
+ else if (typeof v === "string") {
136
+ respHeaders.push([k, v]);
137
+ }
138
+ }
139
+ await response.sendHead({
140
+ status: resp.statusCode,
141
+ headers: respHeaders,
142
+ });
143
+ let bytesOut = 0;
144
+ try {
145
+ for await (const chunk of resp.body) {
146
+ const buf = Buffer.isBuffer(chunk)
147
+ ? chunk
148
+ : Buffer.from(chunk);
149
+ bytesOut += buf.length;
150
+ if (bytesOut > this.maxOutboundBodyBytes) {
151
+ await response.reset("response-too-large");
152
+ logDispatch(`dispatch=url-${transport} status=${resp.statusCode} ` +
153
+ `method=${request.method} path=${request.path} ` +
154
+ `bytes_out=${bytesOut} outcome=reset reason=response-too-large`);
155
+ return;
156
+ }
157
+ await response.sendBody(buf);
158
+ }
159
+ await response.endBody();
160
+ logDispatch(`dispatch=url-${transport} status=${resp.statusCode} ` +
161
+ `method=${request.method} path=${request.path} ` +
162
+ `bytes_out=${bytesOut} outcome=ok`);
163
+ }
164
+ catch {
165
+ await response.reset("upstream-error");
166
+ logDispatch(`dispatch=url-${transport} status=${resp.statusCode} ` +
167
+ `method=${request.method} path=${request.path} ` +
168
+ `outcome=upstream-error`);
169
+ }
170
+ }
171
+ catch {
172
+ logDispatch(`dispatch=url-${transport} status=502 method=${request.method} ` +
173
+ `path=${request.path} outcome=upstream-error`);
174
+ try {
175
+ await sendSimple(response, 502, "upstream error");
176
+ }
177
+ catch {
178
+ /* swallow */
179
+ }
180
+ }
181
+ }
182
+ async dispatchWebSocket(request, ws) {
183
+ const reason = validateEnvelopePath(request.path);
184
+ if (reason !== null) {
185
+ try {
186
+ await ws.reject({ status: 400 });
187
+ }
188
+ catch {
189
+ /* swallow */
190
+ }
191
+ return;
192
+ }
193
+ const { bridgeWsUpgradeToUrl } = await import("./_ws_url_bridge.js");
194
+ await bridgeWsUpgradeToUrl({
195
+ forwardTo: this.forwardTo,
196
+ publicHost: this.publicHost,
197
+ verifyTls: this.verifyTls,
198
+ caBundle: this.caBundle,
199
+ request,
200
+ ws,
201
+ });
202
+ }
203
+ }
204
+ async function* asAsyncBytes(body) {
205
+ for await (const chunk of body) {
206
+ if (chunk.length > 0)
207
+ yield chunk;
208
+ }
209
+ }
210
+ async function sendSimple(response, status, body) {
211
+ const buf = Buffer.from(body);
212
+ await response.sendHead({
213
+ status,
214
+ headers: [
215
+ ["content-type", "text/plain"],
216
+ ["content-length", String(buf.length)],
217
+ ],
218
+ });
219
+ if (buf.length > 0)
220
+ await response.sendBody(buf);
221
+ await response.endBody();
222
+ }
223
+ /**
224
+ * Dispatch impl that invokes an in-process `InkboxHandler` (Fetch-style).
225
+ * Used by passthrough mode when the user supplied a `handler` instead
226
+ * of a `forwardTo` URL. When `wsHandler` is also supplied, WebSocket
227
+ * upgrades route through `dispatchWebSocket`.
228
+ */
229
+ export class CallableDispatch {
230
+ opts;
231
+ constructor(opts) {
232
+ this.opts = opts;
233
+ }
234
+ async aclose() {
235
+ /* nothing to clean up — handler doesn't own runtime resources */
236
+ }
237
+ async dispatch(request, response) {
238
+ if (request.isWebSocket) {
239
+ // Transports that recognize ``dispatchWebSocket`` route WS
240
+ // upgrades there directly. If we get here it means either the
241
+ // transport is older or no ws handler is configured; refuse.
242
+ const status = this.opts.wsHandler === undefined ? 501 : 501;
243
+ await sendSimple(response, status, "websocket dispatch routed to http path");
244
+ return;
245
+ }
246
+ const reason = validateEnvelopePath(request.path);
247
+ if (reason !== null) {
248
+ await sendSimple(response, 400, "invalid path");
249
+ return;
250
+ }
251
+ const { invokeHandlerStreaming } = await import("./_callable_streaming.js");
252
+ const transport = request.transport ?? "h1";
253
+ try {
254
+ await invokeHandlerStreaming({
255
+ handler: this.opts.handler,
256
+ request,
257
+ response,
258
+ publicHost: this.opts.publicHost,
259
+ maxOutboundBodyBytes: this.opts.maxOutboundBodyBytes,
260
+ });
261
+ logDispatch(`dispatch=callable-${transport} method=${request.method} ` +
262
+ `path=${request.path} outcome=ok`);
263
+ }
264
+ catch (err) {
265
+ logDispatch(`dispatch=callable-${transport} method=${request.method} ` +
266
+ `path=${request.path} outcome=handler-error`);
267
+ throw err;
268
+ }
269
+ }
270
+ async dispatchWebSocket(request, ws) {
271
+ const wsHandler = this.opts.wsHandler;
272
+ if (wsHandler === undefined) {
273
+ // Caller checked ``in`` and routed here, but no ws handler is
274
+ // configured — refuse cleanly.
275
+ try {
276
+ await ws.reject({ status: 501 });
277
+ }
278
+ catch {
279
+ /* swallow */
280
+ }
281
+ return;
282
+ }
283
+ const reason = validateEnvelopePath(request.path);
284
+ if (reason !== null) {
285
+ await ws.reject({ status: 400 });
286
+ return;
287
+ }
288
+ const headersMap = new Map();
289
+ const offered = [];
290
+ for (const [k, v] of request.headers) {
291
+ const kl = k.toLowerCase();
292
+ headersMap.set(kl, v);
293
+ if (kl === "sec-websocket-protocol") {
294
+ for (const piece of v.split(",")) {
295
+ const trimmed = piece.trim();
296
+ if (trimmed)
297
+ offered.push(trimmed);
298
+ }
299
+ }
300
+ }
301
+ const url = `wss://${this.opts.publicHost}${request.path}`;
302
+ const { bridgeWsHandlerOverSink } = await import("./_ws_passthrough.js");
303
+ await bridgeWsHandlerOverSink({
304
+ handler: wsHandler,
305
+ sink: ws,
306
+ meta: {
307
+ url,
308
+ headers: headersMap,
309
+ offeredSubprotocols: offered,
310
+ },
311
+ });
312
+ }
313
+ }
314
+ //# sourceMappingURL=_dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dispatch.js","sourceRoot":"","sources":["../../../src/tunnels/client/_dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * inkbox-tunnels/client/_envelope.ts
3
+ *
4
+ * Pure synchronous envelope parser. Mirrors Python `_envelope.py` line
5
+ * for line. No I/O. The `inkbox-body-uri` materialization step lives in
6
+ * `_runtime.ts` so this module stays trivially unit-testable.
7
+ */
8
+ import { TunnelRouteKind } from "./_protocol.js";
9
+ export type RouteKind = TunnelRouteKind;
10
+ export interface Envelope {
11
+ requestId: string;
12
+ method: string;
13
+ path: string;
14
+ routeKind: RouteKind;
15
+ wsId: string | null;
16
+ forwardedHeaders: Array<[string, string]>;
17
+ body: Buffer;
18
+ bodyUri: string | null;
19
+ forwardedForIp: string | null;
20
+ tcpId: string | null;
21
+ sniHost: string | null;
22
+ extraMeta: Record<string, string>;
23
+ }
24
+ /**
25
+ * `Envelope` exposed read-only on `InkboxRequestContext`. Same shape;
26
+ * separate type so callers see immutability at the type level.
27
+ */
28
+ export type ReadonlyEnvelope = Readonly<{
29
+ requestId: string;
30
+ method: string;
31
+ path: string;
32
+ routeKind: RouteKind;
33
+ wsId: string | null;
34
+ forwardedHeaders: ReadonlyArray<readonly [string, string]>;
35
+ body: Buffer;
36
+ bodyUri: string | null;
37
+ forwardedForIp: string | null;
38
+ tcpId: string | null;
39
+ sniHost: string | null;
40
+ extraMeta: Readonly<Record<string, string>>;
41
+ }>;
42
+ /**
43
+ * Parse a `/_system/intake` response into an {@link Envelope}.
44
+ *
45
+ * Returns `null` if the headers are missing the required
46
+ * `inkbox-request-id` field.
47
+ *
48
+ * The returned envelope's `body` may be empty when the server has
49
+ * offloaded the body to an out-of-band fetch URL — in that case
50
+ * `bodyUri` is set and the runtime materializes it before dispatch.
51
+ */
52
+ export declare function parseEnvelope(headers: Array<[string, string]>, body: Buffer): Envelope | null;
53
+ /** Drop hop-by-hop headers from an upstream response before forwarding. */
54
+ export declare function filterResponseHeaders(headers: Array<[string, string]>): Array<[string, string]>;
55
+ //# sourceMappingURL=_envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_envelope.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_envelope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAKL,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,eAAe,CAAC;AAExC,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,GACX,QAAQ,GAAG,IAAI,CA2EjB;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC/B,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEzB"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * inkbox-tunnels/client/_envelope.ts
3
+ *
4
+ * Pure synchronous envelope parser. Mirrors Python `_envelope.py` line
5
+ * for line. No I/O. The `inkbox-body-uri` materialization step lives in
6
+ * `_runtime.ts` so this module stays trivially unit-testable.
7
+ */
8
+ import { HOP_BY_HOP_RESPONSE, INKBOX_FORWARDED_HEADER_PREFIX, INKBOX_NAMESPACE_PREFIX, TunnelMetaHeader, TunnelRouteKind, } from "./_protocol.js";
9
+ /**
10
+ * Parse a `/_system/intake` response into an {@link Envelope}.
11
+ *
12
+ * Returns `null` if the headers are missing the required
13
+ * `inkbox-request-id` field.
14
+ *
15
+ * The returned envelope's `body` may be empty when the server has
16
+ * offloaded the body to an out-of-band fetch URL — in that case
17
+ * `bodyUri` is set and the runtime materializes it before dispatch.
18
+ */
19
+ export function parseEnvelope(headers, body) {
20
+ let requestId = "";
21
+ let method = "GET";
22
+ let path = "/";
23
+ let routeKind = TunnelRouteKind.WEBHOOK;
24
+ let wsId = null;
25
+ let tcpId = null;
26
+ let sniHost = null;
27
+ let bodyUri = null;
28
+ let forwardedForIp = null;
29
+ const forwarded = [];
30
+ const extra = {};
31
+ for (const [k, v] of headers) {
32
+ const kl = k.toLowerCase();
33
+ switch (kl) {
34
+ case TunnelMetaHeader.REQUEST_ID:
35
+ requestId = v;
36
+ break;
37
+ case TunnelMetaHeader.METHOD:
38
+ method = v;
39
+ break;
40
+ case TunnelMetaHeader.PATH:
41
+ path = v;
42
+ break;
43
+ case TunnelMetaHeader.ROUTE_KIND:
44
+ if (v === TunnelRouteKind.WEBHOOK ||
45
+ v === TunnelRouteKind.WS_UPGRADE ||
46
+ v === TunnelRouteKind.TCP_STREAM) {
47
+ routeKind = v;
48
+ }
49
+ break;
50
+ case TunnelMetaHeader.WS_ID:
51
+ wsId = v;
52
+ break;
53
+ case TunnelMetaHeader.TCP_ID:
54
+ tcpId = v;
55
+ break;
56
+ case TunnelMetaHeader.SNI_HOST:
57
+ sniHost = v;
58
+ break;
59
+ case TunnelMetaHeader.BODY_URI:
60
+ bodyUri = v;
61
+ break;
62
+ case TunnelMetaHeader.FORWARDED_FOR:
63
+ forwardedForIp = v;
64
+ extra[kl] = v;
65
+ break;
66
+ default:
67
+ if (kl.startsWith(INKBOX_FORWARDED_HEADER_PREFIX)) {
68
+ forwarded.push([kl.slice(INKBOX_FORWARDED_HEADER_PREFIX.length), v]);
69
+ }
70
+ else if (kl.startsWith(INKBOX_NAMESPACE_PREFIX)) {
71
+ extra[kl] = v;
72
+ }
73
+ break;
74
+ }
75
+ }
76
+ if (!requestId)
77
+ return null;
78
+ return {
79
+ requestId,
80
+ method,
81
+ path,
82
+ routeKind,
83
+ wsId,
84
+ forwardedHeaders: forwarded,
85
+ body,
86
+ bodyUri,
87
+ forwardedForIp,
88
+ tcpId,
89
+ sniHost,
90
+ extraMeta: extra,
91
+ };
92
+ }
93
+ /** Drop hop-by-hop headers from an upstream response before forwarding. */
94
+ export function filterResponseHeaders(headers) {
95
+ return headers.filter(([k]) => !HOP_BY_HOP_RESPONSE.has(k.toLowerCase()));
96
+ }
97
+ //# sourceMappingURL=_envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_envelope.js","sourceRoot":"","sources":["../../../src/tunnels/client/_envelope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAsCxB;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgC,EAChC,IAAY;IAEZ,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,SAAS,GAAc,eAAe,CAAC,OAAO,CAAC;IACnD,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,SAAS,GAAG,CAAC,CAAC;gBACd,MAAM;YACR,KAAK,gBAAgB,CAAC,MAAM;gBAC1B,MAAM,GAAG,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,gBAAgB,CAAC,IAAI;gBACxB,IAAI,GAAG,CAAC,CAAC;gBACT,MAAM;YACR,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,IACE,CAAC,KAAK,eAAe,CAAC,OAAO;oBAC7B,CAAC,KAAK,eAAe,CAAC,UAAU;oBAChC,CAAC,KAAK,eAAe,CAAC,UAAU,EAChC,CAAC;oBACD,SAAS,GAAG,CAAC,CAAC;gBAChB,CAAC;gBACD,MAAM;YACR,KAAK,gBAAgB,CAAC,KAAK;gBACzB,IAAI,GAAG,CAAC,CAAC;gBACT,MAAM;YACR,KAAK,gBAAgB,CAAC,MAAM;gBAC1B,KAAK,GAAG,CAAC,CAAC;gBACV,MAAM;YACR,KAAK,gBAAgB,CAAC,QAAQ;gBAC5B,OAAO,GAAG,CAAC,CAAC;gBACZ,MAAM;YACR,KAAK,gBAAgB,CAAC,QAAQ;gBAC5B,OAAO,GAAG,CAAC,CAAC;gBACZ,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,cAAc,GAAG,CAAC,CAAC;gBACnB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM;YACR;gBACE,IAAI,EAAE,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;oBAClD,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvE,CAAC;qBAAM,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;oBAClD,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO;QACL,SAAS;QACT,MAAM;QACN,IAAI;QACJ,SAAS;QACT,IAAI;QACJ,gBAAgB,EAAE,SAAS;QAC3B,IAAI;QACJ,OAAO;QACP,cAAc;QACd,KAAK;QACL,OAAO;QACP,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CACnC,OAAgC;IAEhC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,37 @@
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 type { Dispatch } from "./_dispatch.js";
15
+ export interface InProcH1ParserPlaintextOpts {
16
+ dispatch: Dispatch;
17
+ maxInboundBodyBytes: number;
18
+ forwardedForIp: string | null;
19
+ sniHost: string | null;
20
+ }
21
+ /**
22
+ * h1 parser exposed as a Plaintext adapter. One instance per third-
23
+ * party TLS session.
24
+ */
25
+ export declare class InProcH1ParserPlaintext {
26
+ private readonly wire;
27
+ private readonly server;
28
+ private readonly maxInboundBodyBytes;
29
+ private closed;
30
+ constructor(opts: InProcH1ParserPlaintextOpts);
31
+ feed(plaintext: Buffer): Promise<void>;
32
+ pumpOutbound(send: (chunk: Buffer) => Promise<void>): Promise<void>;
33
+ aclose(): Promise<void>;
34
+ private handleUpgrade;
35
+ private handleRequest;
36
+ }
37
+ //# sourceMappingURL=_h1_server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_h1_server.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_h1_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,gBAAgB,CAAC;AA4FxB,MAAM,WAAW,2BAA2B;IAC1C,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,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,2BAA2B;IAiBvC,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,aAAa;YA2Ib,aAAa;CA2G5B"}