@limrun/api 0.48.4 → 0.49.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/CHANGELOG.md +4 -0
- package/client.d.mts +6 -3
- package/client.d.mts.map +1 -1
- package/client.d.ts +6 -3
- package/client.d.ts.map +1 -1
- package/client.js +4 -4
- package/client.js.map +1 -1
- package/client.mjs +2 -2
- package/client.mjs.map +1 -1
- package/destination-tunnel-dialer.d.mts +30 -2
- package/destination-tunnel-dialer.d.mts.map +1 -1
- package/destination-tunnel-dialer.d.ts +30 -2
- package/destination-tunnel-dialer.d.ts.map +1 -1
- package/destination-tunnel-dialer.js +349 -65
- package/destination-tunnel-dialer.js.map +1 -1
- package/destination-tunnel-dialer.mjs +345 -64
- package/destination-tunnel-dialer.mjs.map +1 -1
- package/destination-tunnel-har.d.mts +23 -0
- package/destination-tunnel-har.d.mts.map +1 -0
- package/destination-tunnel-har.d.ts +23 -0
- package/destination-tunnel-har.d.ts.map +1 -0
- package/destination-tunnel-har.js +164 -0
- package/destination-tunnel-har.js.map +1 -0
- package/destination-tunnel-har.mjs +160 -0
- package/destination-tunnel-har.mjs.map +1 -0
- package/destination-tunnel-inspection.d.mts +71 -0
- package/destination-tunnel-inspection.d.mts.map +1 -0
- package/destination-tunnel-inspection.d.ts +71 -0
- package/destination-tunnel-inspection.d.ts.map +1 -0
- package/destination-tunnel-inspection.js +267 -0
- package/destination-tunnel-inspection.js.map +1 -0
- package/destination-tunnel-inspection.mjs +261 -0
- package/destination-tunnel-inspection.mjs.map +1 -0
- package/destination-tunnel.d.mts +119 -14
- package/destination-tunnel.d.mts.map +1 -1
- package/destination-tunnel.d.ts +119 -14
- package/destination-tunnel.d.ts.map +1 -1
- package/destination-tunnel.js +407 -98
- package/destination-tunnel.js.map +1 -1
- package/destination-tunnel.mjs +374 -73
- package/destination-tunnel.mjs.map +1 -1
- package/index.d.mts +6 -0
- package/index.d.mts.map +1 -1
- package/index.d.ts +6 -0
- package/index.d.ts.map +1 -1
- package/index.js +23 -2
- package/index.js.map +1 -1
- package/index.mjs +5 -0
- package/index.mjs.map +1 -1
- package/instance-client.d.mts +105 -1
- package/instance-client.d.mts.map +1 -1
- package/instance-client.d.ts +105 -1
- package/instance-client.d.ts.map +1 -1
- package/instance-client.js +83 -1
- package/instance-client.js.map +1 -1
- package/instance-client.mjs +83 -1
- package/instance-client.mjs.map +1 -1
- package/internal/destination-tunnel-management.d.mts +4 -3
- package/internal/destination-tunnel-management.d.mts.map +1 -1
- package/internal/destination-tunnel-management.d.ts +4 -3
- package/internal/destination-tunnel-management.d.ts.map +1 -1
- package/internal/destination-tunnel-management.js +64 -46
- package/internal/destination-tunnel-management.js.map +1 -1
- package/internal/destination-tunnel-management.mjs +55 -37
- package/internal/destination-tunnel-management.mjs.map +1 -1
- package/internal/destination-tunnel-url.d.mts +2 -0
- package/internal/destination-tunnel-url.d.mts.map +1 -1
- package/internal/destination-tunnel-url.d.ts +2 -0
- package/internal/destination-tunnel-url.d.ts.map +1 -1
- package/internal/destination-tunnel-url.js +45 -5
- package/internal/destination-tunnel-url.js.map +1 -1
- package/internal/destination-tunnel-url.mjs +44 -5
- package/internal/destination-tunnel-url.mjs.map +1 -1
- package/internal/destination-tunnel-wire-reader.d.mts +23 -0
- package/internal/destination-tunnel-wire-reader.d.mts.map +1 -0
- package/internal/destination-tunnel-wire-reader.d.ts +23 -0
- package/internal/destination-tunnel-wire-reader.d.ts.map +1 -0
- package/internal/destination-tunnel-wire-reader.js +110 -0
- package/internal/destination-tunnel-wire-reader.js.map +1 -0
- package/internal/destination-tunnel-wire-reader.mjs +93 -0
- package/internal/destination-tunnel-wire-reader.mjs.map +1 -0
- package/internal/persist-option.d.mts +14 -0
- package/internal/persist-option.d.mts.map +1 -0
- package/internal/persist-option.d.ts +14 -0
- package/internal/persist-option.d.ts.map +1 -0
- package/internal/persist-option.js +18 -0
- package/internal/persist-option.js.map +1 -0
- package/internal/persist-option.mjs +15 -0
- package/internal/persist-option.mjs.map +1 -0
- package/internal/proxy-transport.d.mts +27 -0
- package/internal/proxy-transport.d.mts.map +1 -1
- package/internal/proxy-transport.d.ts +27 -0
- package/internal/proxy-transport.d.ts.map +1 -1
- package/internal/proxy-transport.js +206 -0
- package/internal/proxy-transport.js.map +1 -1
- package/internal/proxy-transport.mjs +205 -0
- package/internal/proxy-transport.mjs.map +1 -1
- package/internal/session-stream.d.mts +39 -0
- package/internal/session-stream.d.mts.map +1 -0
- package/internal/session-stream.d.ts +39 -0
- package/internal/session-stream.d.ts.map +1 -0
- package/internal/session-stream.js +144 -0
- package/internal/session-stream.js.map +1 -0
- package/internal/session-stream.mjs +139 -0
- package/internal/session-stream.mjs.map +1 -0
- package/internal/tslib.js +4 -4
- package/ios-client.d.mts +61 -4
- package/ios-client.d.mts.map +1 -1
- package/ios-client.d.ts +61 -4
- package/ios-client.d.ts.map +1 -1
- package/ios-client.js +48 -2
- package/ios-client.js.map +1 -1
- package/ios-client.mjs +48 -2
- package/ios-client.mjs.map +1 -1
- package/package.json +22 -1
- package/resources/android-instances-helpers.d.mts +25 -0
- package/resources/android-instances-helpers.d.mts.map +1 -0
- package/resources/android-instances-helpers.d.ts +25 -0
- package/resources/android-instances-helpers.d.ts.map +1 -0
- package/resources/android-instances-helpers.js +37 -0
- package/resources/android-instances-helpers.js.map +1 -0
- package/resources/android-instances-helpers.mjs +33 -0
- package/resources/android-instances-helpers.mjs.map +1 -0
- package/resources/index.d.mts +5 -2
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts +5 -2
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js +5 -5
- package/resources/index.js.map +1 -1
- package/resources/index.mjs +2 -2
- package/resources/index.mjs.map +1 -1
- package/resources/ios-instances-helpers.d.mts +25 -0
- package/resources/ios-instances-helpers.d.mts.map +1 -0
- package/resources/ios-instances-helpers.d.ts +25 -0
- package/resources/ios-instances-helpers.d.ts.map +1 -0
- package/resources/ios-instances-helpers.js +37 -0
- package/resources/ios-instances-helpers.js.map +1 -0
- package/resources/ios-instances-helpers.mjs +33 -0
- package/resources/ios-instances-helpers.mjs.map +1 -0
- package/resources/session-artifacts.d.mts +70 -0
- package/resources/session-artifacts.d.mts.map +1 -0
- package/resources/session-artifacts.d.ts +70 -0
- package/resources/session-artifacts.d.ts.map +1 -0
- package/resources/session-artifacts.js +8 -0
- package/resources/session-artifacts.js.map +1 -0
- package/resources/session-artifacts.mjs +7 -0
- package/resources/session-artifacts.mjs.map +1 -0
- package/src/client.ts +4 -2
- package/src/destination-tunnel-dialer.ts +403 -64
- package/src/destination-tunnel-har.ts +200 -0
- package/src/destination-tunnel-inspection.ts +367 -0
- package/src/destination-tunnel.ts +510 -88
- package/src/index.ts +52 -0
- package/src/instance-client.ts +271 -5
- package/src/internal/destination-tunnel-management.ts +67 -43
- package/src/internal/destination-tunnel-url.ts +61 -5
- package/src/internal/destination-tunnel-wire-reader.ts +109 -0
- package/src/internal/persist-option.ts +26 -0
- package/src/internal/proxy-transport.ts +248 -0
- package/src/internal/session-stream.ts +157 -0
- package/src/ios-client.ts +127 -8
- package/src/resources/android-instances-helpers.ts +45 -0
- package/src/resources/index.ts +9 -2
- package/src/resources/ios-instances-helpers.ts +45 -0
- package/src/resources/session-artifacts.ts +95 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.nodeProxyTransport = void 0;
|
|
4
|
+
const tslib_1 = require("./tslib.js");
|
|
5
|
+
const net_1 = tslib_1.__importDefault(require("net"));
|
|
6
|
+
const tls_1 = tslib_1.__importDefault(require("tls"));
|
|
4
7
|
const https_proxy_agent_1 = require("https-proxy-agent");
|
|
5
8
|
const proxy_from_env_1 = require("proxy-from-env");
|
|
6
9
|
const undici_1 = require("undici");
|
|
@@ -9,6 +12,7 @@ const undici_1 = require("undici");
|
|
|
9
12
|
// the first to give up. undici's defaults are 300s, which would abort e.g. an
|
|
10
13
|
// instance-side artifact upload that takes longer.
|
|
11
14
|
const longRequestTimeouts = { headersTimeout: 3600000, bodyTimeout: 3600000 };
|
|
15
|
+
const maxConnectResponseHeaderBytes = 64 * 1024;
|
|
12
16
|
class NodeProxyTransport {
|
|
13
17
|
constructor() {
|
|
14
18
|
this.websocketAgents = new Map();
|
|
@@ -52,6 +56,20 @@ class NodeProxyTransport {
|
|
|
52
56
|
}
|
|
53
57
|
return agent;
|
|
54
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Opens a paused TCP stream to a destination, tunneling through the proxy
|
|
61
|
+
* selected by proxy-from-env when applicable. The caller owns the returned
|
|
62
|
+
* socket and must resume it after installing data/end/error handlers.
|
|
63
|
+
*/
|
|
64
|
+
connectTcp(options) {
|
|
65
|
+
const lookupHost = options.proxyLookupHost ?? options.host;
|
|
66
|
+
const lookupUrl = `${options.proxyLookupProtocol}//${formatAuthority(lookupHost, options.port)}`;
|
|
67
|
+
const proxyUrl = (0, proxy_from_env_1.getProxyForUrl)(lookupUrl);
|
|
68
|
+
if (!proxyUrl) {
|
|
69
|
+
return connectDirect(options);
|
|
70
|
+
}
|
|
71
|
+
return connectThroughProxy(proxyUrl, options);
|
|
72
|
+
}
|
|
55
73
|
getEnvHttpProxyAgent() {
|
|
56
74
|
this.envHttpProxyAgent ?? (this.envHttpProxyAgent = new undici_1.EnvHttpProxyAgent());
|
|
57
75
|
return this.envHttpProxyAgent;
|
|
@@ -75,4 +93,192 @@ class NodeProxyTransport {
|
|
|
75
93
|
}
|
|
76
94
|
}
|
|
77
95
|
exports.nodeProxyTransport = new NodeProxyTransport();
|
|
96
|
+
function connectDirect(options) {
|
|
97
|
+
const startedAt = Date.now();
|
|
98
|
+
return new Promise((resolve, reject) => {
|
|
99
|
+
let settled = false;
|
|
100
|
+
const socket = net_1.default.createConnection({
|
|
101
|
+
host: options.host,
|
|
102
|
+
port: options.port,
|
|
103
|
+
allowHalfOpen: true,
|
|
104
|
+
});
|
|
105
|
+
const timer = setTimeout(() => {
|
|
106
|
+
fail(codedError(`connection to ${formatAuthority(options.host, options.port)} timed out`, 'ETIMEDOUT'));
|
|
107
|
+
}, options.timeoutMs);
|
|
108
|
+
timer.unref();
|
|
109
|
+
const cleanup = () => {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
socket.removeListener('connect', onConnect);
|
|
112
|
+
socket.removeListener('error', fail);
|
|
113
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
114
|
+
};
|
|
115
|
+
const fail = (error) => {
|
|
116
|
+
if (settled)
|
|
117
|
+
return;
|
|
118
|
+
settled = true;
|
|
119
|
+
cleanup();
|
|
120
|
+
socket.destroy();
|
|
121
|
+
reject(error);
|
|
122
|
+
};
|
|
123
|
+
const onAbort = () => fail(codedError('TCP connection cancelled', 'ECANCELED'));
|
|
124
|
+
const onConnect = () => {
|
|
125
|
+
if (settled)
|
|
126
|
+
return;
|
|
127
|
+
settled = true;
|
|
128
|
+
socket.pause();
|
|
129
|
+
cleanup();
|
|
130
|
+
resolve({
|
|
131
|
+
socket,
|
|
132
|
+
connectMs: Date.now() - startedAt,
|
|
133
|
+
...(socket.remoteAddress === undefined ? {} : { remoteAddress: socket.remoteAddress }),
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
socket.once('connect', onConnect);
|
|
137
|
+
socket.once('error', fail);
|
|
138
|
+
if (options.signal?.aborted) {
|
|
139
|
+
onAbort();
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function connectThroughProxy(proxyUrlString, options) {
|
|
147
|
+
const startedAt = Date.now();
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
let settled = false;
|
|
150
|
+
let response = Buffer.alloc(0);
|
|
151
|
+
let proxyUrl;
|
|
152
|
+
try {
|
|
153
|
+
proxyUrl = new URL(proxyUrlString);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
reject(codedError(`invalid proxy URL: ${proxyUrlString}`, 'EPROXY'));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (proxyUrl.protocol !== 'http:' && proxyUrl.protocol !== 'https:') {
|
|
160
|
+
reject(codedError(`unsupported proxy protocol ${proxyUrl.protocol}`, 'EPROXY'));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const proxyPort = proxyUrl.port ? Number(proxyUrl.port)
|
|
164
|
+
: proxyUrl.protocol === 'https:' ? 443
|
|
165
|
+
: 80;
|
|
166
|
+
const proxyHost = unbracketHost(proxyUrl.hostname);
|
|
167
|
+
const socket = proxyUrl.protocol === 'https:' ?
|
|
168
|
+
tls_1.default.connect({
|
|
169
|
+
host: proxyHost,
|
|
170
|
+
port: proxyPort,
|
|
171
|
+
rejectUnauthorized: true,
|
|
172
|
+
...(net_1.default.isIP(proxyHost) ? {} : { servername: proxyHost }),
|
|
173
|
+
ALPNProtocols: ['http/1.1'],
|
|
174
|
+
})
|
|
175
|
+
: net_1.default.createConnection({
|
|
176
|
+
host: proxyHost,
|
|
177
|
+
port: proxyPort,
|
|
178
|
+
allowHalfOpen: true,
|
|
179
|
+
});
|
|
180
|
+
socket.allowHalfOpen = true;
|
|
181
|
+
const connectedEvent = proxyUrl.protocol === 'https:' ? 'secureConnect' : 'connect';
|
|
182
|
+
const timer = setTimeout(() => {
|
|
183
|
+
fail(codedError(`proxy connection to ${formatAuthority(options.host, options.port)} timed out`, 'ETIMEDOUT'));
|
|
184
|
+
}, options.timeoutMs);
|
|
185
|
+
timer.unref();
|
|
186
|
+
const cleanup = () => {
|
|
187
|
+
clearTimeout(timer);
|
|
188
|
+
socket.removeListener(connectedEvent, onProxyConnected);
|
|
189
|
+
socket.removeListener('data', onData);
|
|
190
|
+
socket.removeListener('end', onUnexpectedClose);
|
|
191
|
+
socket.removeListener('close', onUnexpectedClose);
|
|
192
|
+
socket.removeListener('error', fail);
|
|
193
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
194
|
+
};
|
|
195
|
+
const fail = (error) => {
|
|
196
|
+
if (settled)
|
|
197
|
+
return;
|
|
198
|
+
settled = true;
|
|
199
|
+
cleanup();
|
|
200
|
+
socket.destroy();
|
|
201
|
+
reject(error);
|
|
202
|
+
};
|
|
203
|
+
const onAbort = () => fail(codedError('proxy connection cancelled', 'ECANCELED'));
|
|
204
|
+
const onUnexpectedClose = () => fail(codedError('proxy closed before completing CONNECT', 'ECONNRESET'));
|
|
205
|
+
const onProxyConnected = () => {
|
|
206
|
+
const authority = formatAuthority(options.host, options.port);
|
|
207
|
+
const headers = [`CONNECT ${authority} HTTP/1.1`, `Host: ${authority}`, 'Proxy-Connection: Keep-Alive'];
|
|
208
|
+
if (proxyUrl.username || proxyUrl.password) {
|
|
209
|
+
const username = decodeUrlCredential(proxyUrl.username);
|
|
210
|
+
const password = decodeUrlCredential(proxyUrl.password);
|
|
211
|
+
headers.push(`Proxy-Authorization: Basic ${Buffer.from(`${username}:${password}`, 'utf8').toString('base64')}`);
|
|
212
|
+
}
|
|
213
|
+
socket.write(`${headers.join('\r\n')}\r\n\r\n`);
|
|
214
|
+
};
|
|
215
|
+
const onData = (chunk) => {
|
|
216
|
+
response = Buffer.concat([response, chunk]);
|
|
217
|
+
const headerEnd = response.indexOf('\r\n\r\n');
|
|
218
|
+
if (headerEnd < 0) {
|
|
219
|
+
if (response.length > maxConnectResponseHeaderBytes) {
|
|
220
|
+
fail(codedError('proxy CONNECT response headers exceeded 65536 bytes', 'EPROXY'));
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (headerEnd + 4 > maxConnectResponseHeaderBytes) {
|
|
225
|
+
fail(codedError('proxy CONNECT response headers exceeded 65536 bytes', 'EPROXY'));
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const statusLineEnd = response.indexOf('\r\n');
|
|
229
|
+
const statusLine = response
|
|
230
|
+
.subarray(0, statusLineEnd < 0 ? headerEnd : statusLineEnd)
|
|
231
|
+
.toString('latin1');
|
|
232
|
+
const statusMatch = /^HTTP\/1\.[01] ([0-9]{3})(?: |$)/.exec(statusLine);
|
|
233
|
+
if (!statusMatch) {
|
|
234
|
+
fail(codedError(`invalid proxy CONNECT response: ${statusLine}`, 'EPROXY'));
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const statusCode = Number(statusMatch[1]);
|
|
238
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
239
|
+
fail(codedError(`proxy CONNECT failed with status ${statusCode}`, statusCode === 407 ? 'EPROXYAUTH' : 'EPROXYCONNECT'));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
settled = true;
|
|
243
|
+
socket.pause();
|
|
244
|
+
cleanup();
|
|
245
|
+
const remainder = response.subarray(headerEnd + 4);
|
|
246
|
+
if (remainder.length > 0)
|
|
247
|
+
socket.unshift(remainder);
|
|
248
|
+
resolve({
|
|
249
|
+
socket,
|
|
250
|
+
connectMs: Date.now() - startedAt,
|
|
251
|
+
remoteAddress: options.host,
|
|
252
|
+
});
|
|
253
|
+
};
|
|
254
|
+
socket.once(connectedEvent, onProxyConnected);
|
|
255
|
+
socket.on('data', onData);
|
|
256
|
+
socket.once('end', onUnexpectedClose);
|
|
257
|
+
socket.once('close', onUnexpectedClose);
|
|
258
|
+
socket.once('error', fail);
|
|
259
|
+
if (options.signal?.aborted) {
|
|
260
|
+
onAbort();
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
function formatAuthority(host, port) {
|
|
268
|
+
return `${net_1.default.isIP(host) === 6 ? `[${host}]` : host}:${port}`;
|
|
269
|
+
}
|
|
270
|
+
function unbracketHost(host) {
|
|
271
|
+
return host.startsWith('[') && host.endsWith(']') ? host.slice(1, -1) : host;
|
|
272
|
+
}
|
|
273
|
+
function decodeUrlCredential(value) {
|
|
274
|
+
try {
|
|
275
|
+
return decodeURIComponent(value);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return value;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
function codedError(message, code) {
|
|
282
|
+
return Object.assign(new Error(message), { code });
|
|
283
|
+
}
|
|
78
284
|
//# sourceMappingURL=proxy-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-transport.js","sourceRoot":"","sources":["../src/internal/proxy-transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy-transport.js","sourceRoot":"","sources":["../src/internal/proxy-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import net from 'net';
|
|
2
|
+
import tls from 'tls';
|
|
1
3
|
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
2
4
|
import { getProxyForUrl } from 'proxy-from-env';
|
|
3
5
|
import { EnvHttpProxyAgent } from 'undici';
|
|
@@ -6,6 +8,7 @@ import { EnvHttpProxyAgent } from 'undici';
|
|
|
6
8
|
// the first to give up. undici's defaults are 300s, which would abort e.g. an
|
|
7
9
|
// instance-side artifact upload that takes longer.
|
|
8
10
|
const longRequestTimeouts = { headersTimeout: 3600000, bodyTimeout: 3600000 };
|
|
11
|
+
const maxConnectResponseHeaderBytes = 64 * 1024;
|
|
9
12
|
class NodeProxyTransport {
|
|
10
13
|
constructor() {
|
|
11
14
|
this.websocketAgents = new Map();
|
|
@@ -49,6 +52,20 @@ class NodeProxyTransport {
|
|
|
49
52
|
}
|
|
50
53
|
return agent;
|
|
51
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Opens a paused TCP stream to a destination, tunneling through the proxy
|
|
57
|
+
* selected by proxy-from-env when applicable. The caller owns the returned
|
|
58
|
+
* socket and must resume it after installing data/end/error handlers.
|
|
59
|
+
*/
|
|
60
|
+
connectTcp(options) {
|
|
61
|
+
const lookupHost = options.proxyLookupHost ?? options.host;
|
|
62
|
+
const lookupUrl = `${options.proxyLookupProtocol}//${formatAuthority(lookupHost, options.port)}`;
|
|
63
|
+
const proxyUrl = getProxyForUrl(lookupUrl);
|
|
64
|
+
if (!proxyUrl) {
|
|
65
|
+
return connectDirect(options);
|
|
66
|
+
}
|
|
67
|
+
return connectThroughProxy(proxyUrl, options);
|
|
68
|
+
}
|
|
52
69
|
getEnvHttpProxyAgent() {
|
|
53
70
|
this.envHttpProxyAgent ?? (this.envHttpProxyAgent = new EnvHttpProxyAgent());
|
|
54
71
|
return this.envHttpProxyAgent;
|
|
@@ -72,4 +89,192 @@ class NodeProxyTransport {
|
|
|
72
89
|
}
|
|
73
90
|
}
|
|
74
91
|
export const nodeProxyTransport = new NodeProxyTransport();
|
|
92
|
+
function connectDirect(options) {
|
|
93
|
+
const startedAt = Date.now();
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
let settled = false;
|
|
96
|
+
const socket = net.createConnection({
|
|
97
|
+
host: options.host,
|
|
98
|
+
port: options.port,
|
|
99
|
+
allowHalfOpen: true,
|
|
100
|
+
});
|
|
101
|
+
const timer = setTimeout(() => {
|
|
102
|
+
fail(codedError(`connection to ${formatAuthority(options.host, options.port)} timed out`, 'ETIMEDOUT'));
|
|
103
|
+
}, options.timeoutMs);
|
|
104
|
+
timer.unref();
|
|
105
|
+
const cleanup = () => {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
socket.removeListener('connect', onConnect);
|
|
108
|
+
socket.removeListener('error', fail);
|
|
109
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
110
|
+
};
|
|
111
|
+
const fail = (error) => {
|
|
112
|
+
if (settled)
|
|
113
|
+
return;
|
|
114
|
+
settled = true;
|
|
115
|
+
cleanup();
|
|
116
|
+
socket.destroy();
|
|
117
|
+
reject(error);
|
|
118
|
+
};
|
|
119
|
+
const onAbort = () => fail(codedError('TCP connection cancelled', 'ECANCELED'));
|
|
120
|
+
const onConnect = () => {
|
|
121
|
+
if (settled)
|
|
122
|
+
return;
|
|
123
|
+
settled = true;
|
|
124
|
+
socket.pause();
|
|
125
|
+
cleanup();
|
|
126
|
+
resolve({
|
|
127
|
+
socket,
|
|
128
|
+
connectMs: Date.now() - startedAt,
|
|
129
|
+
...(socket.remoteAddress === undefined ? {} : { remoteAddress: socket.remoteAddress }),
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
socket.once('connect', onConnect);
|
|
133
|
+
socket.once('error', fail);
|
|
134
|
+
if (options.signal?.aborted) {
|
|
135
|
+
onAbort();
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function connectThroughProxy(proxyUrlString, options) {
|
|
143
|
+
const startedAt = Date.now();
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
let settled = false;
|
|
146
|
+
let response = Buffer.alloc(0);
|
|
147
|
+
let proxyUrl;
|
|
148
|
+
try {
|
|
149
|
+
proxyUrl = new URL(proxyUrlString);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
reject(codedError(`invalid proxy URL: ${proxyUrlString}`, 'EPROXY'));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (proxyUrl.protocol !== 'http:' && proxyUrl.protocol !== 'https:') {
|
|
156
|
+
reject(codedError(`unsupported proxy protocol ${proxyUrl.protocol}`, 'EPROXY'));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const proxyPort = proxyUrl.port ? Number(proxyUrl.port)
|
|
160
|
+
: proxyUrl.protocol === 'https:' ? 443
|
|
161
|
+
: 80;
|
|
162
|
+
const proxyHost = unbracketHost(proxyUrl.hostname);
|
|
163
|
+
const socket = proxyUrl.protocol === 'https:' ?
|
|
164
|
+
tls.connect({
|
|
165
|
+
host: proxyHost,
|
|
166
|
+
port: proxyPort,
|
|
167
|
+
rejectUnauthorized: true,
|
|
168
|
+
...(net.isIP(proxyHost) ? {} : { servername: proxyHost }),
|
|
169
|
+
ALPNProtocols: ['http/1.1'],
|
|
170
|
+
})
|
|
171
|
+
: net.createConnection({
|
|
172
|
+
host: proxyHost,
|
|
173
|
+
port: proxyPort,
|
|
174
|
+
allowHalfOpen: true,
|
|
175
|
+
});
|
|
176
|
+
socket.allowHalfOpen = true;
|
|
177
|
+
const connectedEvent = proxyUrl.protocol === 'https:' ? 'secureConnect' : 'connect';
|
|
178
|
+
const timer = setTimeout(() => {
|
|
179
|
+
fail(codedError(`proxy connection to ${formatAuthority(options.host, options.port)} timed out`, 'ETIMEDOUT'));
|
|
180
|
+
}, options.timeoutMs);
|
|
181
|
+
timer.unref();
|
|
182
|
+
const cleanup = () => {
|
|
183
|
+
clearTimeout(timer);
|
|
184
|
+
socket.removeListener(connectedEvent, onProxyConnected);
|
|
185
|
+
socket.removeListener('data', onData);
|
|
186
|
+
socket.removeListener('end', onUnexpectedClose);
|
|
187
|
+
socket.removeListener('close', onUnexpectedClose);
|
|
188
|
+
socket.removeListener('error', fail);
|
|
189
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
190
|
+
};
|
|
191
|
+
const fail = (error) => {
|
|
192
|
+
if (settled)
|
|
193
|
+
return;
|
|
194
|
+
settled = true;
|
|
195
|
+
cleanup();
|
|
196
|
+
socket.destroy();
|
|
197
|
+
reject(error);
|
|
198
|
+
};
|
|
199
|
+
const onAbort = () => fail(codedError('proxy connection cancelled', 'ECANCELED'));
|
|
200
|
+
const onUnexpectedClose = () => fail(codedError('proxy closed before completing CONNECT', 'ECONNRESET'));
|
|
201
|
+
const onProxyConnected = () => {
|
|
202
|
+
const authority = formatAuthority(options.host, options.port);
|
|
203
|
+
const headers = [`CONNECT ${authority} HTTP/1.1`, `Host: ${authority}`, 'Proxy-Connection: Keep-Alive'];
|
|
204
|
+
if (proxyUrl.username || proxyUrl.password) {
|
|
205
|
+
const username = decodeUrlCredential(proxyUrl.username);
|
|
206
|
+
const password = decodeUrlCredential(proxyUrl.password);
|
|
207
|
+
headers.push(`Proxy-Authorization: Basic ${Buffer.from(`${username}:${password}`, 'utf8').toString('base64')}`);
|
|
208
|
+
}
|
|
209
|
+
socket.write(`${headers.join('\r\n')}\r\n\r\n`);
|
|
210
|
+
};
|
|
211
|
+
const onData = (chunk) => {
|
|
212
|
+
response = Buffer.concat([response, chunk]);
|
|
213
|
+
const headerEnd = response.indexOf('\r\n\r\n');
|
|
214
|
+
if (headerEnd < 0) {
|
|
215
|
+
if (response.length > maxConnectResponseHeaderBytes) {
|
|
216
|
+
fail(codedError('proxy CONNECT response headers exceeded 65536 bytes', 'EPROXY'));
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (headerEnd + 4 > maxConnectResponseHeaderBytes) {
|
|
221
|
+
fail(codedError('proxy CONNECT response headers exceeded 65536 bytes', 'EPROXY'));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const statusLineEnd = response.indexOf('\r\n');
|
|
225
|
+
const statusLine = response
|
|
226
|
+
.subarray(0, statusLineEnd < 0 ? headerEnd : statusLineEnd)
|
|
227
|
+
.toString('latin1');
|
|
228
|
+
const statusMatch = /^HTTP\/1\.[01] ([0-9]{3})(?: |$)/.exec(statusLine);
|
|
229
|
+
if (!statusMatch) {
|
|
230
|
+
fail(codedError(`invalid proxy CONNECT response: ${statusLine}`, 'EPROXY'));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const statusCode = Number(statusMatch[1]);
|
|
234
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
235
|
+
fail(codedError(`proxy CONNECT failed with status ${statusCode}`, statusCode === 407 ? 'EPROXYAUTH' : 'EPROXYCONNECT'));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
settled = true;
|
|
239
|
+
socket.pause();
|
|
240
|
+
cleanup();
|
|
241
|
+
const remainder = response.subarray(headerEnd + 4);
|
|
242
|
+
if (remainder.length > 0)
|
|
243
|
+
socket.unshift(remainder);
|
|
244
|
+
resolve({
|
|
245
|
+
socket,
|
|
246
|
+
connectMs: Date.now() - startedAt,
|
|
247
|
+
remoteAddress: options.host,
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
socket.once(connectedEvent, onProxyConnected);
|
|
251
|
+
socket.on('data', onData);
|
|
252
|
+
socket.once('end', onUnexpectedClose);
|
|
253
|
+
socket.once('close', onUnexpectedClose);
|
|
254
|
+
socket.once('error', fail);
|
|
255
|
+
if (options.signal?.aborted) {
|
|
256
|
+
onAbort();
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function formatAuthority(host, port) {
|
|
264
|
+
return `${net.isIP(host) === 6 ? `[${host}]` : host}:${port}`;
|
|
265
|
+
}
|
|
266
|
+
function unbracketHost(host) {
|
|
267
|
+
return host.startsWith('[') && host.endsWith(']') ? host.slice(1, -1) : host;
|
|
268
|
+
}
|
|
269
|
+
function decodeUrlCredential(value) {
|
|
270
|
+
try {
|
|
271
|
+
return decodeURIComponent(value);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return value;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function codedError(message, code) {
|
|
278
|
+
return Object.assign(new Error(message), { code });
|
|
279
|
+
}
|
|
75
280
|
//# sourceMappingURL=proxy-transport.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-transport.mjs","sourceRoot":"","sources":["../src/internal/proxy-transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxy-transport.mjs","sourceRoot":"","sources":["../src/internal/proxy-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Long-lived tail of a runtime session SSE stream (live app logs or the
|
|
3
|
+
* coalesced event log). The runtime replays its buffer on first connect and
|
|
4
|
+
* tags every entry with a monotonic SSE id; eventsource-client sends
|
|
5
|
+
* Last-Event-ID on reconnect, so the runtime resumes exactly where the
|
|
6
|
+
* stream broke and each entry is delivered exactly once.
|
|
7
|
+
*
|
|
8
|
+
* Stream health follows the exec client's model (and reuses its policy): the
|
|
9
|
+
* EventSource reconnects forever on its own, so a dead stream (deleted
|
|
10
|
+
* instance) would otherwise retry silently for good. Proof of life — a
|
|
11
|
+
* delivered entry, a keepalive comment, or a clean connection that stays
|
|
12
|
+
* open healthyConnectionMs — resets the give-up clock; once the stream stays
|
|
13
|
+
* broken past giveUpAfterMs, onError fires once and the stream closes.
|
|
14
|
+
*/
|
|
15
|
+
/** The session stream kept failing past the give-up window; it has been closed. */
|
|
16
|
+
export declare class SessionStreamLostError extends Error {
|
|
17
|
+
}
|
|
18
|
+
export interface SessionStreamOptions<T extends {
|
|
19
|
+
ts: number;
|
|
20
|
+
}> {
|
|
21
|
+
/** Full URL of the runtime SSE endpoint, without credentials. */
|
|
22
|
+
url: string;
|
|
23
|
+
/** Instance token; sent as a bearer Authorization header. */
|
|
24
|
+
token: string;
|
|
25
|
+
/** Called once per delivered entry, in stream order. */
|
|
26
|
+
onEntry: (entry: T) => void;
|
|
27
|
+
/** Called at most once, when the stream is given up on and closed. */
|
|
28
|
+
onError?: ((error: Error) => void) | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Connects to a session SSE endpoint and delivers parsed entries until the
|
|
32
|
+
* returned function is called (or the stream is given up on). Entries are
|
|
33
|
+
* one JSON object per SSE data frame; frames that do not parse to an object
|
|
34
|
+
* with a numeric `ts` are skipped.
|
|
35
|
+
*/
|
|
36
|
+
export declare function streamSessionEntries<T extends {
|
|
37
|
+
ts: number;
|
|
38
|
+
}>(options: SessionStreamOptions<T>): () => void;
|
|
39
|
+
//# sourceMappingURL=session-stream.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-stream.d.mts","sourceRoot":"","sources":["../src/internal/session-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,mFAAmF;AACnF,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC5D,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAmH3G"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Long-lived tail of a runtime session SSE stream (live app logs or the
|
|
3
|
+
* coalesced event log). The runtime replays its buffer on first connect and
|
|
4
|
+
* tags every entry with a monotonic SSE id; eventsource-client sends
|
|
5
|
+
* Last-Event-ID on reconnect, so the runtime resumes exactly where the
|
|
6
|
+
* stream broke and each entry is delivered exactly once.
|
|
7
|
+
*
|
|
8
|
+
* Stream health follows the exec client's model (and reuses its policy): the
|
|
9
|
+
* EventSource reconnects forever on its own, so a dead stream (deleted
|
|
10
|
+
* instance) would otherwise retry silently for good. Proof of life — a
|
|
11
|
+
* delivered entry, a keepalive comment, or a clean connection that stays
|
|
12
|
+
* open healthyConnectionMs — resets the give-up clock; once the stream stays
|
|
13
|
+
* broken past giveUpAfterMs, onError fires once and the stream closes.
|
|
14
|
+
*/
|
|
15
|
+
/** The session stream kept failing past the give-up window; it has been closed. */
|
|
16
|
+
export declare class SessionStreamLostError extends Error {
|
|
17
|
+
}
|
|
18
|
+
export interface SessionStreamOptions<T extends {
|
|
19
|
+
ts: number;
|
|
20
|
+
}> {
|
|
21
|
+
/** Full URL of the runtime SSE endpoint, without credentials. */
|
|
22
|
+
url: string;
|
|
23
|
+
/** Instance token; sent as a bearer Authorization header. */
|
|
24
|
+
token: string;
|
|
25
|
+
/** Called once per delivered entry, in stream order. */
|
|
26
|
+
onEntry: (entry: T) => void;
|
|
27
|
+
/** Called at most once, when the stream is given up on and closed. */
|
|
28
|
+
onError?: ((error: Error) => void) | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Connects to a session SSE endpoint and delivers parsed entries until the
|
|
32
|
+
* returned function is called (or the stream is given up on). Entries are
|
|
33
|
+
* one JSON object per SSE data frame; frames that do not parse to an object
|
|
34
|
+
* with a numeric `ts` are skipped.
|
|
35
|
+
*/
|
|
36
|
+
export declare function streamSessionEntries<T extends {
|
|
37
|
+
ts: number;
|
|
38
|
+
}>(options: SessionStreamOptions<T>): () => void;
|
|
39
|
+
//# sourceMappingURL=session-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../src/internal/session-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,mFAAmF;AACnF,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC5D,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAmH3G"}
|