@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.
- package/README.md +10 -1
- package/dist/_http.d.ts +24 -5
- package/dist/_http.d.ts.map +1 -1
- package/dist/_http.js +21 -11
- package/dist/_http.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/inkbox.d.ts +4 -0
- package/dist/inkbox.d.ts.map +1 -1
- package/dist/inkbox.js +5 -0
- package/dist/inkbox.js.map +1 -1
- package/dist/tunnels/_validation.d.ts +7 -0
- package/dist/tunnels/_validation.d.ts.map +1 -0
- package/dist/tunnels/_validation.js +27 -0
- package/dist/tunnels/_validation.js.map +1 -0
- package/dist/tunnels/client/_bridge.d.ts +35 -0
- package/dist/tunnels/client/_bridge.d.ts.map +1 -0
- package/dist/tunnels/client/_bridge.js +52 -0
- package/dist/tunnels/client/_bridge.js.map +1 -0
- package/dist/tunnels/client/_callable_streaming.d.ts +25 -0
- package/dist/tunnels/client/_callable_streaming.d.ts.map +1 -0
- package/dist/tunnels/client/_callable_streaming.js +158 -0
- package/dist/tunnels/client/_callable_streaming.js.map +1 -0
- package/dist/tunnels/client/_cert.d.ts +45 -0
- package/dist/tunnels/client/_cert.d.ts.map +1 -0
- package/dist/tunnels/client/_cert.js +193 -0
- package/dist/tunnels/client/_cert.js.map +1 -0
- package/dist/tunnels/client/_dispatch.d.ts +109 -0
- package/dist/tunnels/client/_dispatch.d.ts.map +1 -0
- package/dist/tunnels/client/_dispatch.js +314 -0
- package/dist/tunnels/client/_dispatch.js.map +1 -0
- package/dist/tunnels/client/_envelope.d.ts +55 -0
- package/dist/tunnels/client/_envelope.d.ts.map +1 -0
- package/dist/tunnels/client/_envelope.js +97 -0
- package/dist/tunnels/client/_envelope.js.map +1 -0
- package/dist/tunnels/client/_h1_server.d.ts +37 -0
- package/dist/tunnels/client/_h1_server.d.ts.map +1 -0
- package/dist/tunnels/client/_h1_server.js +433 -0
- package/dist/tunnels/client/_h1_server.js.map +1 -0
- package/dist/tunnels/client/_h2_transcode.d.ts +43 -0
- package/dist/tunnels/client/_h2_transcode.d.ts.map +1 -0
- package/dist/tunnels/client/_h2_transcode.js +488 -0
- package/dist/tunnels/client/_h2_transcode.js.map +1 -0
- package/dist/tunnels/client/_handler.d.ts +62 -0
- package/dist/tunnels/client/_handler.d.ts.map +1 -0
- package/dist/tunnels/client/_handler.js +121 -0
- package/dist/tunnels/client/_handler.js.map +1 -0
- package/dist/tunnels/client/_listener.d.ts +64 -0
- package/dist/tunnels/client/_listener.d.ts.map +1 -0
- package/dist/tunnels/client/_listener.js +113 -0
- package/dist/tunnels/client/_listener.js.map +1 -0
- package/dist/tunnels/client/_protocol.d.ts +67 -0
- package/dist/tunnels/client/_protocol.d.ts.map +1 -0
- package/dist/tunnels/client/_protocol.js +86 -0
- package/dist/tunnels/client/_protocol.js.map +1 -0
- package/dist/tunnels/client/_runtime.d.ts +143 -0
- package/dist/tunnels/client/_runtime.d.ts.map +1 -0
- package/dist/tunnels/client/_runtime.js +1679 -0
- package/dist/tunnels/client/_runtime.js.map +1 -0
- package/dist/tunnels/client/_state.d.ts +45 -0
- package/dist/tunnels/client/_state.d.ts.map +1 -0
- package/dist/tunnels/client/_state.js +165 -0
- package/dist/tunnels/client/_state.js.map +1 -0
- package/dist/tunnels/client/_tls.d.ts +50 -0
- package/dist/tunnels/client/_tls.d.ts.map +1 -0
- package/dist/tunnels/client/_tls.js +139 -0
- package/dist/tunnels/client/_tls.js.map +1 -0
- package/dist/tunnels/client/_upstream_tls.d.ts +25 -0
- package/dist/tunnels/client/_upstream_tls.d.ts.map +1 -0
- package/dist/tunnels/client/_upstream_tls.js +24 -0
- package/dist/tunnels/client/_upstream_tls.js.map +1 -0
- package/dist/tunnels/client/_url_forward.d.ts +92 -0
- package/dist/tunnels/client/_url_forward.d.ts.map +1 -0
- package/dist/tunnels/client/_url_forward.js +255 -0
- package/dist/tunnels/client/_url_forward.js.map +1 -0
- package/dist/tunnels/client/_validation.d.ts +27 -0
- package/dist/tunnels/client/_validation.d.ts.map +1 -0
- package/dist/tunnels/client/_validation.js +96 -0
- package/dist/tunnels/client/_validation.js.map +1 -0
- package/dist/tunnels/client/_ws.d.ts +149 -0
- package/dist/tunnels/client/_ws.d.ts.map +1 -0
- package/dist/tunnels/client/_ws.js +351 -0
- package/dist/tunnels/client/_ws.js.map +1 -0
- package/dist/tunnels/client/_ws_passthrough.d.ts +129 -0
- package/dist/tunnels/client/_ws_passthrough.d.ts.map +1 -0
- package/dist/tunnels/client/_ws_passthrough.js +432 -0
- package/dist/tunnels/client/_ws_passthrough.js.map +1 -0
- package/dist/tunnels/client/_ws_url_bridge.d.ts +71 -0
- package/dist/tunnels/client/_ws_url_bridge.d.ts.map +1 -0
- package/dist/tunnels/client/_ws_url_bridge.js +474 -0
- package/dist/tunnels/client/_ws_url_bridge.js.map +1 -0
- package/dist/tunnels/client/_ws_url_edge_bridge.d.ts +26 -0
- package/dist/tunnels/client/_ws_url_edge_bridge.d.ts.map +1 -0
- package/dist/tunnels/client/_ws_url_edge_bridge.js +256 -0
- package/dist/tunnels/client/_ws_url_edge_bridge.js.map +1 -0
- package/dist/tunnels/client/_wsframe.d.ts +142 -0
- package/dist/tunnels/client/_wsframe.d.ts.map +1 -0
- package/dist/tunnels/client/_wsframe.js +282 -0
- package/dist/tunnels/client/_wsframe.js.map +1 -0
- package/dist/tunnels/client/index.d.ts +101 -0
- package/dist/tunnels/client/index.d.ts.map +1 -0
- package/dist/tunnels/client/index.js +242 -0
- package/dist/tunnels/client/index.js.map +1 -0
- package/dist/tunnels/exceptions.d.ts +31 -0
- package/dist/tunnels/exceptions.d.ts.map +1 -0
- package/dist/tunnels/exceptions.js +68 -0
- package/dist/tunnels/exceptions.js.map +1 -0
- package/dist/tunnels/resources/tunnels.d.ts +73 -0
- package/dist/tunnels/resources/tunnels.d.ts.map +1 -0
- package/dist/tunnels/resources/tunnels.js +173 -0
- package/dist/tunnels/resources/tunnels.js.map +1 -0
- package/dist/tunnels/types.d.ts +99 -0
- package/dist/tunnels/types.d.ts.map +1 -0
- package/dist/tunnels/types.js +76 -0
- package/dist/tunnels/types.js.map +1 -0
- package/package.json +14 -5
- 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"}
|