@limrun/api 0.47.2 → 0.48.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 (62) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/destination-tunnel-dialer.d.mts +22 -0
  3. package/destination-tunnel-dialer.d.mts.map +1 -0
  4. package/destination-tunnel-dialer.d.ts +22 -0
  5. package/destination-tunnel-dialer.d.ts.map +1 -0
  6. package/destination-tunnel-dialer.js +491 -0
  7. package/destination-tunnel-dialer.js.map +1 -0
  8. package/destination-tunnel-dialer.mjs +486 -0
  9. package/destination-tunnel-dialer.mjs.map +1 -0
  10. package/destination-tunnel.d.mts +77 -0
  11. package/destination-tunnel.d.mts.map +1 -0
  12. package/destination-tunnel.d.ts +77 -0
  13. package/destination-tunnel.d.ts.map +1 -0
  14. package/destination-tunnel.js +249 -0
  15. package/destination-tunnel.js.map +1 -0
  16. package/destination-tunnel.mjs +236 -0
  17. package/destination-tunnel.mjs.map +1 -0
  18. package/internal/destination-tunnel-management.d.mts +23 -0
  19. package/internal/destination-tunnel-management.d.mts.map +1 -0
  20. package/internal/destination-tunnel-management.d.ts +23 -0
  21. package/internal/destination-tunnel-management.d.ts.map +1 -0
  22. package/internal/destination-tunnel-management.js +122 -0
  23. package/internal/destination-tunnel-management.js.map +1 -0
  24. package/internal/destination-tunnel-management.mjs +117 -0
  25. package/internal/destination-tunnel-management.mjs.map +1 -0
  26. package/internal/destination-tunnel-url.d.mts +4 -0
  27. package/internal/destination-tunnel-url.d.mts.map +1 -0
  28. package/internal/destination-tunnel-url.d.ts +4 -0
  29. package/internal/destination-tunnel-url.d.ts.map +1 -0
  30. package/internal/destination-tunnel-url.js +28 -0
  31. package/internal/destination-tunnel-url.js.map +1 -0
  32. package/internal/destination-tunnel-url.mjs +23 -0
  33. package/internal/destination-tunnel-url.mjs.map +1 -0
  34. package/ios-client.d.mts +22 -0
  35. package/ios-client.d.mts.map +1 -1
  36. package/ios-client.d.ts +22 -0
  37. package/ios-client.d.ts.map +1 -1
  38. package/ios-client.js +18 -0
  39. package/ios-client.js.map +1 -1
  40. package/ios-client.mjs +18 -0
  41. package/ios-client.mjs.map +1 -1
  42. package/package.json +21 -1
  43. package/resources/android-instances.d.mts +1 -1
  44. package/resources/android-instances.d.ts +1 -1
  45. package/resources/xcode-instances-helpers.d.mts +2 -1
  46. package/resources/xcode-instances-helpers.d.mts.map +1 -1
  47. package/resources/xcode-instances-helpers.d.ts +2 -1
  48. package/resources/xcode-instances-helpers.d.ts.map +1 -1
  49. package/resources/xcode-instances-helpers.js.map +1 -1
  50. package/resources/xcode-instances-helpers.mjs.map +1 -1
  51. package/src/destination-tunnel-dialer.ts +554 -0
  52. package/src/destination-tunnel.ts +354 -0
  53. package/src/internal/destination-tunnel-management.ts +154 -0
  54. package/src/internal/destination-tunnel-url.ts +25 -0
  55. package/src/ios-client.ts +48 -0
  56. package/src/resources/android-instances.ts +1 -1
  57. package/src/resources/xcode-instances-helpers.ts +2 -1
  58. package/src/version.ts +1 -1
  59. package/version.d.mts +1 -1
  60. package/version.d.ts +1 -1
  61. package/version.js +1 -1
  62. package/version.mjs +1 -1
@@ -0,0 +1,486 @@
1
+ import net from 'net';
2
+ import { WebSocket } from 'ws';
3
+ import { nodeProxyTransport } from "./internal/proxy-transport.mjs";
4
+ import { DESTINATION_TUNNEL_VERSION, DestinationTunnelProtocolError, assertDestinationTunnelOpenAllowed, assertDestinationTunnelReady, decodeDestinationTunnelDataFrame, decodeDestinationTunnelServerMessage, encodeDestinationTunnelDataFrame, encodeDestinationTunnelClientMessage, validateDestinationTunnelRoutes, } from "./destination-tunnel.mjs";
5
+ export async function startDestinationTcpTunnel(remoteURL, token, options) {
6
+ const routes = validateDestinationTunnelRoutes(options.routes);
7
+ const logLevel = options.logLevel ?? 'info';
8
+ const maxConnections = positiveInteger(options.maxConnections ?? 64, 'maxConnections');
9
+ const maxPendingBytesPerConnection = positiveInteger(options.maxPendingBytesPerConnection ?? 16 * 1024 * 1024, 'maxPendingBytesPerConnection');
10
+ const maxTotalPendingBytes = positiveInteger(options.maxTotalPendingBytes ?? 16 * 1024 * 1024, 'maxTotalPendingBytes');
11
+ const maxBufferedBytes = positiveInteger(options.maxBufferedBytes ?? 4 * 1024 * 1024, 'maxBufferedBytes');
12
+ const connectTimeoutMs = positiveInteger(options.connectTimeoutMs ?? 10000, 'connectTimeoutMs');
13
+ const handshakeTimeoutMs = positiveInteger(options.handshakeTimeoutMs ?? 15000, 'handshakeTimeoutMs');
14
+ const livenessTimeoutMs = positiveInteger(options.livenessTimeoutMs ?? 90000, 'livenessTimeoutMs');
15
+ const pingIntervalMs = Math.min(30000, Math.max(1, Math.floor(livenessTimeoutMs / 3)));
16
+ const resumeBelowBufferedBytes = maxBufferedBytes / 4;
17
+ const hardMaxBufferedBytes = maxBufferedBytes + Math.max(64 * 1024, Math.floor(maxBufferedBytes / 4));
18
+ const logger = {
19
+ debug: (...args) => {
20
+ if (logLevel === 'debug')
21
+ console.log('[DestinationTunnel]', ...args);
22
+ },
23
+ info: (...args) => {
24
+ if (logLevel === 'info' || logLevel === 'debug')
25
+ console.log('[DestinationTunnel]', ...args);
26
+ },
27
+ warn: (...args) => {
28
+ if (logLevel === 'warn' || logLevel === 'info' || logLevel === 'debug') {
29
+ console.warn('[DestinationTunnel]', ...args);
30
+ }
31
+ },
32
+ error: (...args) => {
33
+ if (logLevel !== 'none')
34
+ console.error('[DestinationTunnel]', ...args);
35
+ },
36
+ };
37
+ return new Promise((resolve, reject) => {
38
+ const connections = new Map();
39
+ const recentlyClosed = new Map();
40
+ const stateChangeCallbacks = new Set();
41
+ const url = new URL(remoteURL);
42
+ const proxyAgent = nodeProxyTransport.getWebSocketAgent(url.toString());
43
+ const ws = new WebSocket(url.toString(), {
44
+ headers: { Authorization: `Bearer ${token}` },
45
+ ...(proxyAgent ? { agent: proxyAgent } : {}),
46
+ perMessageDeflate: false,
47
+ });
48
+ let connectionState = 'connecting';
49
+ let pingInterval;
50
+ let handshakeTimer;
51
+ let livenessTimer;
52
+ let tunnelReady = false;
53
+ let closed = false;
54
+ let pausedForBackpressure = false;
55
+ let totalPendingWriteBytes = 0;
56
+ const updateConnectionState = (state) => {
57
+ if (connectionState === state)
58
+ return;
59
+ connectionState = state;
60
+ for (const callback of stateChangeCallbacks) {
61
+ try {
62
+ callback(state);
63
+ }
64
+ catch (error) {
65
+ logger.error('Connection state callback failed:', error);
66
+ }
67
+ }
68
+ };
69
+ const getConnectionState = () => connectionState;
70
+ const onConnectionStateChange = (callback) => {
71
+ stateChangeCallbacks.add(callback);
72
+ return () => stateChangeCallbacks.delete(callback);
73
+ };
74
+ const markRecentlyClosed = (connId) => {
75
+ const existingTimer = recentlyClosed.get(connId);
76
+ if (existingTimer)
77
+ clearTimeout(existingTimer);
78
+ const timer = setTimeout(() => recentlyClosed.delete(connId), 30000);
79
+ timer.unref();
80
+ recentlyClosed.set(connId, timer);
81
+ };
82
+ const removeConnection = (connId, destroySocket) => {
83
+ const connection = connections.get(connId);
84
+ if (!connection)
85
+ return;
86
+ connections.delete(connId);
87
+ clearTimeout(connection.connectTimer);
88
+ markRecentlyClosed(connId);
89
+ if (destroySocket && !connection.socket.destroyed) {
90
+ connection.socket.destroy();
91
+ }
92
+ };
93
+ const closeAllConnections = () => {
94
+ for (const connId of Array.from(connections.keys())) {
95
+ removeConnection(connId, true);
96
+ }
97
+ for (const timer of recentlyClosed.values()) {
98
+ clearTimeout(timer);
99
+ }
100
+ recentlyClosed.clear();
101
+ pausedForBackpressure = false;
102
+ };
103
+ const close = () => {
104
+ if (closed)
105
+ return;
106
+ closed = true;
107
+ if (pingInterval) {
108
+ clearInterval(pingInterval);
109
+ pingInterval = undefined;
110
+ }
111
+ if (handshakeTimer) {
112
+ clearTimeout(handshakeTimer);
113
+ handshakeTimer = undefined;
114
+ }
115
+ if (livenessTimer) {
116
+ clearTimeout(livenessTimer);
117
+ livenessTimer = undefined;
118
+ }
119
+ closeAllConnections();
120
+ ws.removeAllListeners('open');
121
+ ws.removeAllListeners('message');
122
+ ws.removeAllListeners('ping');
123
+ ws.removeAllListeners('pong');
124
+ if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
125
+ ws.close(1000, 'close');
126
+ }
127
+ updateConnectionState('disconnected');
128
+ };
129
+ const failTransport = (error) => {
130
+ if (closed)
131
+ return;
132
+ logger.error(error.message);
133
+ close();
134
+ if (!tunnelReady) {
135
+ reject(error);
136
+ }
137
+ };
138
+ const pauseForBackpressure = () => {
139
+ if (pausedForBackpressure)
140
+ return;
141
+ pausedForBackpressure = true;
142
+ for (const connection of connections.values()) {
143
+ if (!connection.socket.destroyed)
144
+ connection.socket.pause();
145
+ }
146
+ };
147
+ const resumeIfDrained = () => {
148
+ if (!pausedForBackpressure || ws.bufferedAmount >= resumeBelowBufferedBytes)
149
+ return;
150
+ pausedForBackpressure = false;
151
+ for (const connection of connections.values()) {
152
+ if (!connection.socket.destroyed)
153
+ connection.socket.resume();
154
+ }
155
+ };
156
+ const frameQueued = () => {
157
+ if (ws.bufferedAmount > hardMaxBufferedBytes) {
158
+ failTransport(new Error('destination tunnel WebSocket send buffer exceeded its hard limit'));
159
+ }
160
+ else if (!pausedForBackpressure && ws.bufferedAmount > maxBufferedBytes) {
161
+ pauseForBackpressure();
162
+ }
163
+ };
164
+ const frameSent = (error) => {
165
+ if (error) {
166
+ failTransport(error);
167
+ }
168
+ else {
169
+ resumeIfDrained();
170
+ }
171
+ };
172
+ const sendControl = (message) => {
173
+ if (closed || ws.readyState !== WebSocket.OPEN) {
174
+ failTransport(new Error('destination tunnel WebSocket is not open'));
175
+ return;
176
+ }
177
+ ws.send(encodeDestinationTunnelClientMessage(message), frameSent);
178
+ frameQueued();
179
+ };
180
+ const sendData = (connId, payload) => {
181
+ if (closed || ws.readyState !== WebSocket.OPEN) {
182
+ failTransport(new Error('destination tunnel WebSocket closed while sending data'));
183
+ return;
184
+ }
185
+ ws.send(encodeDestinationTunnelDataFrame(connId, payload), { binary: true }, frameSent);
186
+ frameQueued();
187
+ };
188
+ const sendOpenFailure = (connId, reason, osCode) => {
189
+ sendControl({
190
+ type: 'openFail',
191
+ connId,
192
+ reason,
193
+ ...(osCode ? { osCode } : {}),
194
+ });
195
+ markRecentlyClosed(connId);
196
+ };
197
+ const sendReset = (connId, reason, osCode) => {
198
+ sendControl({
199
+ type: 'reset',
200
+ connId,
201
+ reason,
202
+ ...(osCode ? { osCode } : {}),
203
+ });
204
+ };
205
+ const handleOpen = (message) => {
206
+ try {
207
+ assertDestinationTunnelOpenAllowed(message, routes);
208
+ }
209
+ catch {
210
+ sendOpenFailure(message.connId, 'route_not_allowed');
211
+ return;
212
+ }
213
+ if (connections.has(message.connId) || recentlyClosed.has(message.connId)) {
214
+ throw new DestinationTunnelProtocolError(`server reused connection ID ${message.connId}`);
215
+ }
216
+ if (connections.size >= maxConnections) {
217
+ sendOpenFailure(message.connId, 'resource_exhausted');
218
+ return;
219
+ }
220
+ const socket = net.createConnection({
221
+ host: message.host,
222
+ port: message.port,
223
+ allowHalfOpen: true,
224
+ });
225
+ const connectTimer = setTimeout(() => {
226
+ if (connections.get(message.connId)?.phase !== 'connecting')
227
+ return;
228
+ sendOpenFailure(message.connId, 'connection_timed_out', 'ETIMEDOUT');
229
+ removeConnection(message.connId, true);
230
+ }, connectTimeoutMs);
231
+ connectTimer.unref();
232
+ const connection = {
233
+ socket,
234
+ phase: 'connecting',
235
+ connectTimer,
236
+ localInputEnded: false,
237
+ remoteInputEnded: false,
238
+ pendingWriteBytes: 0,
239
+ };
240
+ connections.set(message.connId, connection);
241
+ if (pausedForBackpressure) {
242
+ socket.pause();
243
+ }
244
+ socket.once('connect', () => {
245
+ if (connections.get(message.connId) !== connection)
246
+ return;
247
+ clearTimeout(connectTimer);
248
+ connection.phase = 'open';
249
+ sendControl({ type: 'openOk', connId: message.connId });
250
+ logger.debug(`Connected ${message.connId} to ${message.host}:${message.port}`);
251
+ });
252
+ socket.on('data', (payload) => {
253
+ if (connections.get(message.connId) !== connection || connection.phase !== 'open')
254
+ return;
255
+ sendData(message.connId, payload);
256
+ });
257
+ socket.once('end', () => {
258
+ if (connections.get(message.connId) !== connection || connection.phase !== 'open')
259
+ return;
260
+ connection.localInputEnded = true;
261
+ sendControl({ type: 'fin', connId: message.connId });
262
+ });
263
+ socket.once('error', (error) => {
264
+ if (connections.get(message.connId) !== connection)
265
+ return;
266
+ if (connection.phase === 'connecting') {
267
+ sendOpenFailure(message.connId, classifyOpenFailure(error), error.code);
268
+ }
269
+ else {
270
+ sendReset(message.connId, 'connection_error', error.code);
271
+ }
272
+ removeConnection(message.connId, true);
273
+ });
274
+ socket.once('close', () => {
275
+ if (connections.get(message.connId) !== connection)
276
+ return;
277
+ if (connection.phase === 'connecting') {
278
+ sendOpenFailure(message.connId, 'internal');
279
+ }
280
+ else if (!connection.localInputEnded || !connection.remoteInputEnded) {
281
+ sendReset(message.connId, 'connection_error');
282
+ }
283
+ removeConnection(message.connId, false);
284
+ });
285
+ };
286
+ const findOpenConnection = (connId) => {
287
+ const connection = connections.get(connId);
288
+ if (connection?.phase === 'open')
289
+ return connection;
290
+ if (connection) {
291
+ sendReset(connId, 'protocol_error');
292
+ removeConnection(connId, true);
293
+ }
294
+ else if (!recentlyClosed.has(connId)) {
295
+ sendReset(connId, 'protocol_error');
296
+ markRecentlyClosed(connId);
297
+ }
298
+ return undefined;
299
+ };
300
+ const handleRemoteFIN = (connId) => {
301
+ const connection = findOpenConnection(connId);
302
+ if (!connection)
303
+ return;
304
+ if (connection.remoteInputEnded) {
305
+ sendReset(connId, 'protocol_error');
306
+ removeConnection(connId, true);
307
+ return;
308
+ }
309
+ connection.remoteInputEnded = true;
310
+ connection.socket.end();
311
+ };
312
+ const handleRemoteReset = (connId) => {
313
+ if (connections.has(connId)) {
314
+ removeConnection(connId, true);
315
+ }
316
+ };
317
+ const handleBinary = (frame) => {
318
+ if (!tunnelReady) {
319
+ throw new DestinationTunnelProtocolError('received tunnel data before READY');
320
+ }
321
+ const { connId, payload } = decodeDestinationTunnelDataFrame(frame);
322
+ const connection = findOpenConnection(connId);
323
+ if (!connection)
324
+ return;
325
+ if (connection.remoteInputEnded) {
326
+ sendReset(connId, 'protocol_error');
327
+ removeConnection(connId, true);
328
+ return;
329
+ }
330
+ const nextConnectionPendingBytes = connection.pendingWriteBytes + payload.length;
331
+ const nextTotalPendingBytes = totalPendingWriteBytes + payload.length;
332
+ if (nextConnectionPendingBytes > maxPendingBytesPerConnection ||
333
+ nextTotalPendingBytes > maxTotalPendingBytes) {
334
+ sendReset(connId, 'resource_exhausted');
335
+ removeConnection(connId, true);
336
+ return;
337
+ }
338
+ connection.pendingWriteBytes = nextConnectionPendingBytes;
339
+ totalPendingWriteBytes = nextTotalPendingBytes;
340
+ connection.socket.write(payload, (error) => {
341
+ connection.pendingWriteBytes -= payload.length;
342
+ totalPendingWriteBytes -= payload.length;
343
+ if (error && connections.get(connId) === connection) {
344
+ const osCode = error.code;
345
+ sendReset(connId, 'connection_error', osCode);
346
+ removeConnection(connId, true);
347
+ }
348
+ });
349
+ };
350
+ const handleControl = (message) => {
351
+ switch (message.type) {
352
+ case 'ready':
353
+ if (tunnelReady)
354
+ throw new DestinationTunnelProtocolError('received duplicate READY');
355
+ assertDestinationTunnelReady(message);
356
+ tunnelReady = true;
357
+ if (handshakeTimer) {
358
+ clearTimeout(handshakeTimer);
359
+ handshakeTimer = undefined;
360
+ }
361
+ armLivenessDeadline();
362
+ updateConnectionState('connected');
363
+ logger.info(`Destination tunnel ready with ${routes.length} route(s)`);
364
+ resolve({
365
+ tunnelId: message.tunnelId,
366
+ close,
367
+ getConnectionState,
368
+ onConnectionStateChange,
369
+ });
370
+ return;
371
+ case 'error':
372
+ throw new Error(`destination tunnel failed: ${message.code}`);
373
+ case 'open':
374
+ if (!tunnelReady)
375
+ throw new DestinationTunnelProtocolError('received OPEN before READY');
376
+ handleOpen(message);
377
+ return;
378
+ case 'fin':
379
+ if (!tunnelReady)
380
+ throw new DestinationTunnelProtocolError('received FIN before READY');
381
+ handleRemoteFIN(message.connId);
382
+ return;
383
+ case 'reset':
384
+ if (!tunnelReady)
385
+ throw new DestinationTunnelProtocolError('received RESET before READY');
386
+ handleRemoteReset(message.connId);
387
+ }
388
+ };
389
+ const armLivenessDeadline = () => {
390
+ if (!tunnelReady || closed)
391
+ return;
392
+ if (livenessTimer)
393
+ clearTimeout(livenessTimer);
394
+ livenessTimer = setTimeout(() => {
395
+ failTransport(new Error(`destination tunnel received no frames for ${livenessTimeoutMs}ms`));
396
+ }, livenessTimeoutMs);
397
+ livenessTimer.unref();
398
+ };
399
+ handshakeTimer = setTimeout(() => {
400
+ failTransport(new Error(`destination tunnel was not ready within ${handshakeTimeoutMs}ms`));
401
+ }, handshakeTimeoutMs);
402
+ handshakeTimer.unref();
403
+ ws.on('open', () => {
404
+ sendControl({ type: 'start', version: DESTINATION_TUNNEL_VERSION, routes });
405
+ pingInterval = setInterval(() => {
406
+ if (ws.readyState === WebSocket.OPEN) {
407
+ ws.ping(undefined, true, frameSent);
408
+ frameQueued();
409
+ }
410
+ }, pingIntervalMs);
411
+ pingInterval.unref();
412
+ });
413
+ ws.on('message', (data, isBinary) => {
414
+ try {
415
+ armLivenessDeadline();
416
+ if (isBinary) {
417
+ handleBinary(toBuffer(data));
418
+ }
419
+ else {
420
+ handleControl(decodeDestinationTunnelServerMessage(JSON.parse(toBuffer(data).toString('utf8'))));
421
+ }
422
+ }
423
+ catch (error) {
424
+ failTransport(error instanceof Error ? error : new Error(String(error)));
425
+ }
426
+ });
427
+ ws.on('ping', armLivenessDeadline);
428
+ ws.on('pong', armLivenessDeadline);
429
+ ws.once('error', (error) => {
430
+ failTransport(error);
431
+ });
432
+ ws.once('close', (code, reason) => {
433
+ if (closed) {
434
+ ws.removeAllListeners();
435
+ return;
436
+ }
437
+ failTransport(new Error(`destination tunnel WebSocket closed: ${code}${reason.length ? ` ${reason.toString()}` : ''}`));
438
+ ws.removeAllListeners();
439
+ });
440
+ });
441
+ }
442
+ export function classifyOpenFailure(error) {
443
+ switch (error.code) {
444
+ case 'ENOTFOUND':
445
+ return 'dns_not_found';
446
+ case 'EAI_AGAIN':
447
+ return 'dns_temporary_failure';
448
+ case 'ECONNREFUSED':
449
+ return 'connection_refused';
450
+ case 'ECONNRESET':
451
+ return 'connection_reset';
452
+ case 'ETIMEDOUT':
453
+ return 'connection_timed_out';
454
+ case 'ENETUNREACH':
455
+ case 'EHOSTUNREACH':
456
+ return 'unreachable';
457
+ case 'EACCES':
458
+ case 'EPERM':
459
+ return 'permission_denied';
460
+ case 'EMFILE':
461
+ case 'ENFILE':
462
+ case 'ENOBUFS':
463
+ case 'ENOMEM':
464
+ return 'resource_exhausted';
465
+ case 'ECANCELED':
466
+ return 'cancelled';
467
+ default:
468
+ return 'internal';
469
+ }
470
+ }
471
+ function positiveInteger(value, name) {
472
+ if (!Number.isInteger(value) || value <= 0) {
473
+ throw new Error(`${name} must be a positive integer`);
474
+ }
475
+ return value;
476
+ }
477
+ function toBuffer(data) {
478
+ if (Buffer.isBuffer(data))
479
+ return data;
480
+ if (Array.isArray(data))
481
+ return Buffer.concat(data);
482
+ if (data instanceof ArrayBuffer)
483
+ return Buffer.from(data);
484
+ throw new DestinationTunnelProtocolError('unsupported WebSocket payload type');
485
+ }
486
+ //# sourceMappingURL=destination-tunnel-dialer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destination-tunnel-dialer.mjs","sourceRoot":"","sources":["src/destination-tunnel-dialer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export declare const DESTINATION_TUNNEL_VERSION = 1;
2
+ export declare const DESTINATION_TUNNEL_MAX_ROUTES = 10;
3
+ export declare const DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES = 4;
4
+ export interface DestinationTunnelRoute {
5
+ host: string;
6
+ port: number;
7
+ }
8
+ export type DestinationTunnelOpenFailureReason = 'dns_not_found' | 'dns_temporary_failure' | 'connection_refused' | 'connection_reset' | 'connection_timed_out' | 'unreachable' | 'permission_denied' | 'resource_exhausted' | 'route_not_allowed' | 'cancelled' | 'internal' | (string & {});
9
+ export type DestinationTunnelResetReason = 'cancelled' | 'connection_error' | 'protocol_error' | 'resource_exhausted' | 'internal' | (string & {});
10
+ export type DestinationTunnelSessionErrorCode = 'unsupported_version' | 'invalid_message' | 'invalid_route' | 'route_capacity' | 'already_active' | 'unavailable' | 'internal' | (string & {});
11
+ export type DestinationTunnelClientMessage = {
12
+ type: 'start';
13
+ version: number;
14
+ routes: DestinationTunnelRoute[];
15
+ } | {
16
+ type: 'openOk';
17
+ connId: number;
18
+ } | {
19
+ type: 'openFail';
20
+ connId: number;
21
+ reason: DestinationTunnelOpenFailureReason;
22
+ osCode?: string;
23
+ } | {
24
+ type: 'fin';
25
+ connId: number;
26
+ } | {
27
+ type: 'reset';
28
+ connId: number;
29
+ reason: DestinationTunnelResetReason;
30
+ osCode?: string;
31
+ };
32
+ export type DestinationTunnelServerMessage = {
33
+ type: 'ready';
34
+ version: number;
35
+ tunnelId: string;
36
+ } | {
37
+ type: 'open';
38
+ connId: number;
39
+ routeId: string;
40
+ host: string;
41
+ port: number;
42
+ proto: 'tcp';
43
+ } | {
44
+ type: 'fin';
45
+ connId: number;
46
+ } | {
47
+ type: 'reset';
48
+ connId: number;
49
+ reason: DestinationTunnelResetReason;
50
+ osCode?: string;
51
+ } | {
52
+ type: 'error';
53
+ code: DestinationTunnelSessionErrorCode;
54
+ };
55
+ export type DestinationTunnelRouteErrorCode = 'empty' | 'too_many' | 'invalid_host' | 'invalid_port' | 'duplicate';
56
+ export declare class DestinationTunnelRouteError extends Error {
57
+ readonly code: DestinationTunnelRouteErrorCode;
58
+ constructor(code: DestinationTunnelRouteErrorCode, message: string);
59
+ }
60
+ export declare class DestinationTunnelProtocolError extends Error {
61
+ constructor(message: string);
62
+ }
63
+ export declare function encodeDestinationTunnelDataFrame(connId: number, payload: Buffer): Buffer;
64
+ export declare function decodeDestinationTunnelDataFrame(frame: Buffer): {
65
+ connId: number;
66
+ payload: Buffer;
67
+ };
68
+ export declare function validateDestinationTunnelRoutes(routes: readonly DestinationTunnelRoute[]): DestinationTunnelRoute[];
69
+ export declare function assertDestinationTunnelOpenAllowed(message: Extract<DestinationTunnelServerMessage, {
70
+ type: 'open';
71
+ }>, routes: readonly DestinationTunnelRoute[]): void;
72
+ export declare function assertDestinationTunnelReady(message: Extract<DestinationTunnelServerMessage, {
73
+ type: 'ready';
74
+ }>): void;
75
+ export declare function encodeDestinationTunnelClientMessage(message: DestinationTunnelClientMessage): string;
76
+ export declare function decodeDestinationTunnelServerMessage(value: unknown): DestinationTunnelServerMessage;
77
+ //# sourceMappingURL=destination-tunnel.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destination-tunnel.d.mts","sourceRoot":"","sources":["src/destination-tunnel.ts"],"names":[],"mappings":"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"}