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