ssh_tunnel_proxy 2.1.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +19 -3
  2. package/MIGRATION.md +227 -0
  3. package/README.md +360 -212
  4. package/build/bridge.d.ts +14 -0
  5. package/build/bridge.d.ts.map +1 -0
  6. package/build/bridge.js +12 -0
  7. package/build/bridge.js.map +1 -0
  8. package/build/connection.d.ts +60 -0
  9. package/build/connection.d.ts.map +1 -0
  10. package/build/connection.js +198 -0
  11. package/build/connection.js.map +1 -0
  12. package/build/credentials.d.ts +24 -0
  13. package/build/credentials.d.ts.map +1 -0
  14. package/build/credentials.js +102 -0
  15. package/build/credentials.js.map +1 -0
  16. package/build/errors.d.ts +19 -0
  17. package/build/errors.d.ts.map +1 -0
  18. package/build/errors.js +64 -0
  19. package/build/errors.js.map +1 -0
  20. package/build/forward-spec.d.ts +34 -0
  21. package/build/forward-spec.d.ts.map +1 -0
  22. package/build/forward-spec.js +175 -0
  23. package/build/forward-spec.js.map +1 -0
  24. package/build/index.d.ts +19 -0
  25. package/build/index.d.ts.map +1 -0
  26. package/build/index.js +71 -0
  27. package/build/index.js.map +1 -0
  28. package/build/legacy.d.ts +70 -0
  29. package/build/legacy.d.ts.map +1 -0
  30. package/build/legacy.js +188 -0
  31. package/build/legacy.js.map +1 -0
  32. package/build/local-forward.d.ts +31 -0
  33. package/build/local-forward.d.ts.map +1 -0
  34. package/build/local-forward.js +231 -0
  35. package/build/local-forward.js.map +1 -0
  36. package/build/model.d.ts +126 -0
  37. package/build/model.d.ts.map +1 -0
  38. package/build/model.js +55 -0
  39. package/build/model.js.map +1 -0
  40. package/build/port-policy.d.ts +43 -0
  41. package/build/port-policy.d.ts.map +1 -0
  42. package/build/port-policy.js +138 -0
  43. package/build/port-policy.js.map +1 -0
  44. package/build/remote-forward.d.ts +40 -0
  45. package/build/remote-forward.d.ts.map +1 -0
  46. package/build/remote-forward.js +226 -0
  47. package/build/remote-forward.js.map +1 -0
  48. package/build/tunnel.d.ts +121 -0
  49. package/build/tunnel.d.ts.map +1 -0
  50. package/build/tunnel.js +599 -0
  51. package/build/tunnel.js.map +1 -0
  52. package/examples/config.example.json +86 -0
  53. package/examples/setup_ssh.sh +12 -0
  54. package/examples/tunnel-cli.js +461 -0
  55. package/examples/tunnel-worker.js +98 -0
  56. package/examples/zrok-termux.ts +147 -0
  57. package/package.json +43 -53
  58. package/proto/sshtunnel/v1/tunnel.proto +343 -0
  59. package/dist/TestMessage.d.ts +0 -13
  60. package/dist/TestMessage.js +0 -32
  61. package/dist/TestMessage.js.map +0 -1
  62. package/dist/cjs/TestMessage.d.ts +0 -13
  63. package/dist/cjs/TestMessage.js +0 -32
  64. package/dist/cjs/TestMessage.js.map +0 -1
  65. package/dist/cjs/index.d.ts +0 -73
  66. package/dist/cjs/index.js +0 -621
  67. package/dist/cjs/index.js.map +0 -1
  68. package/dist/cjs/keypair_storage.d.ts +0 -12
  69. package/dist/cjs/keypair_storage.js +0 -143
  70. package/dist/cjs/keypair_storage.js.map +0 -1
  71. package/dist/cjs/ngrok_service.d.ts +0 -11
  72. package/dist/cjs/ngrok_service.js +0 -40
  73. package/dist/cjs/ngrok_service.js.map +0 -1
  74. package/dist/cjs/ssh2-node.d.ts +0 -1
  75. package/dist/cjs/ssh2-node.js +0 -221
  76. package/dist/cjs/ssh2-node.js.map +0 -1
  77. package/dist/esm/TestMessage.d.ts +0 -13
  78. package/dist/esm/TestMessage.js +0 -29
  79. package/dist/esm/TestMessage.js.map +0 -1
  80. package/dist/esm/index.d.ts +0 -73
  81. package/dist/esm/index.js +0 -616
  82. package/dist/esm/index.js.map +0 -1
  83. package/dist/esm/keypair_storage.d.ts +0 -12
  84. package/dist/esm/keypair_storage.js +0 -117
  85. package/dist/esm/keypair_storage.js.map +0 -1
  86. package/dist/esm/ngrok_service.d.ts +0 -11
  87. package/dist/esm/ngrok_service.js +0 -37
  88. package/dist/esm/ngrok_service.js.map +0 -1
  89. package/dist/esm/ssh2-node.d.ts +0 -1
  90. package/dist/esm/ssh2-node.js +0 -194
  91. package/dist/esm/ssh2-node.js.map +0 -1
  92. package/dist/index.d.ts +0 -73
  93. package/dist/index.js +0 -620
  94. package/dist/index.js.map +0 -1
  95. package/dist/keypair_storage.d.ts +0 -12
  96. package/dist/keypair_storage.js +0 -120
  97. package/dist/keypair_storage.js.map +0 -1
  98. package/dist/ngrok_service.d.ts +0 -11
  99. package/dist/ngrok_service.js +0 -40
  100. package/dist/ngrok_service.js.map +0 -1
  101. package/dist/ssh2-node.d.ts +0 -1
  102. package/dist/ssh2-node.js +0 -188
  103. package/dist/ssh2-node.js.map +0 -1
  104. package/dist/types/TestMessage.d.ts +0 -13
  105. package/dist/types/index.d.ts +0 -73
  106. package/dist/types/keypair_storage.d.ts +0 -12
  107. package/dist/types/ngrok_service.d.ts +0 -11
  108. package/dist/types/ssh2-node.d.ts +0 -1
  109. package/ssh2-node +0 -2
@@ -0,0 +1,599 @@
1
+ "use strict";
2
+ /*
3
+ * tunnel.ts — SSHTunnel, the first-class API.
4
+ *
5
+ * Scope, deliberately narrow:
6
+ * - Connect to an SSH listener that already exists at a host:port.
7
+ * - Maintain local (-L) and remote (-R) TCP forwards over that one transport.
8
+ * - Reconnect with bounded backoff and re-establish every declared forward.
9
+ * - Report state for the tunnel, each forward, and each proxied connection.
10
+ *
11
+ * Out of scope, on purpose: key generation, keychains, relay provisioning
12
+ * (ngrok/zrok), SFTP, interactive shells, HTTP proxying, config file discovery.
13
+ *
14
+ * License: MIT
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.SSHTunnel = void 0;
18
+ const node_events_1 = require("node:events");
19
+ const node_crypto_1 = require("node:crypto");
20
+ const ssh2_1 = require("ssh2");
21
+ const errors_1 = require("./errors");
22
+ const forward_spec_1 = require("./forward-spec");
23
+ const local_forward_1 = require("./local-forward");
24
+ const remote_forward_1 = require("./remote-forward");
25
+ const credentials_1 = require("./credentials");
26
+ const model_1 = require("./model");
27
+ const READY_STATES = new Set(['ready']);
28
+ class SSHTunnel extends node_events_1.EventEmitter {
29
+ tunnelId;
30
+ config;
31
+ options;
32
+ bridge;
33
+ client;
34
+ state = 'idle';
35
+ lastError;
36
+ connectedAtUnixMs;
37
+ reconnectAttempt = 0;
38
+ reconnectTimer;
39
+ connectPromise;
40
+ closing = false;
41
+ localForwards = new Map();
42
+ remoteForwards = new Map();
43
+ constructor(config, options = {}) {
44
+ super();
45
+ this.config = config;
46
+ this.options = options;
47
+ this.tunnelId = config.id ?? `${config.transport.endpoint.host}:${config.transport.endpoint.port}`;
48
+ this.bridge = {
49
+ requireClient: (forwardId) => {
50
+ if (!this.client || !READY_STATES.has(this.state)) {
51
+ throw new errors_1.TunnelError('TRANSPORT_NOT_READY', `Tunnel ${this.tunnelId} is ${this.state}`, { forwardId });
52
+ }
53
+ return this.client;
54
+ },
55
+ peekClient: () => this.client,
56
+ onConnectionChanged: (status, previous) => {
57
+ this.emit('connection', { status, previous });
58
+ },
59
+ onForwardChanged: (status, previous) => {
60
+ this.emit('forward', { status, previous });
61
+ },
62
+ onError: (error) => this.raise(error),
63
+ debug: (message, ...args) => this.emit('debug', message, ...args),
64
+ };
65
+ }
66
+ // -------------------------------------------------------------------------
67
+ // Typed event surface
68
+ // -------------------------------------------------------------------------
69
+ on(event, listener) {
70
+ return super.on(event, listener);
71
+ }
72
+ once(event, listener) {
73
+ return super.once(event, listener);
74
+ }
75
+ off(event, listener) {
76
+ return super.off(event, listener);
77
+ }
78
+ emit(event, ...args) {
79
+ return super.emit(event, ...args);
80
+ }
81
+ // -------------------------------------------------------------------------
82
+ // Status
83
+ // -------------------------------------------------------------------------
84
+ getState() {
85
+ return this.state;
86
+ }
87
+ isReady() {
88
+ return READY_STATES.has(this.state);
89
+ }
90
+ getStatus() {
91
+ return {
92
+ tunnelId: this.tunnelId,
93
+ state: this.state,
94
+ endpoint: { ...this.config.transport.endpoint },
95
+ reconnectAttempt: this.reconnectAttempt,
96
+ connectedAtUnixMs: this.connectedAtUnixMs,
97
+ forwards: [
98
+ ...[...this.localForwards.values()].map((handle) => handle.getStatus()),
99
+ ...[...this.remoteForwards.values()].map((handle) => handle.getStatus()),
100
+ ],
101
+ error: this.lastError,
102
+ };
103
+ }
104
+ listConnections() {
105
+ return [
106
+ ...[...this.localForwards.values()].flatMap((handle) => handle.listConnections()),
107
+ ...[...this.remoteForwards.values()].flatMap((handle) => handle.listConnections()),
108
+ ];
109
+ }
110
+ getForwardStatus(forwardId) {
111
+ const handle = this.localForwards.get(forwardId) ?? this.remoteForwards.get(forwardId);
112
+ if (!handle) {
113
+ throw new errors_1.TunnelError('UNKNOWN_FORWARD', `No forward with id "${forwardId}"`, { forwardId });
114
+ }
115
+ return handle.getStatus();
116
+ }
117
+ /**
118
+ * Resolve a semantic forward id to the endpoint a caller should connect to.
119
+ * This is the hook an agent-flow runtime uses instead of hard-coding ports.
120
+ */
121
+ resolveEndpoint(forwardId) {
122
+ const local = this.localForwards.get(forwardId);
123
+ if (local) {
124
+ return { endpoint: { ...local.spec.listen }, state: local.getState() };
125
+ }
126
+ const remote = this.remoteForwards.get(forwardId);
127
+ if (remote) {
128
+ return {
129
+ endpoint: { host: remote.spec.bind.host, port: remote.getBoundPort() },
130
+ state: remote.getState(),
131
+ };
132
+ }
133
+ throw new errors_1.TunnelError('UNKNOWN_FORWARD', `No forward with id "${forwardId}"`, { forwardId });
134
+ }
135
+ // -------------------------------------------------------------------------
136
+ // Connect / close
137
+ // -------------------------------------------------------------------------
138
+ /**
139
+ * Establish the transport and open every forward declared in the config.
140
+ * Concurrent calls share one attempt. Resolves when all forwards are active.
141
+ */
142
+ async connect() {
143
+ if (this.isReady())
144
+ return this.getStatus();
145
+ if (this.connectPromise)
146
+ return this.connectPromise;
147
+ this.closing = false;
148
+ this.connectPromise = this.doConnect().finally(() => {
149
+ this.connectPromise = undefined;
150
+ });
151
+ return this.connectPromise;
152
+ }
153
+ async doConnect() {
154
+ this.transition('connecting');
155
+ let connectConfig;
156
+ try {
157
+ connectConfig = await this.buildConnectConfig();
158
+ }
159
+ catch (err) {
160
+ this.lastError = err instanceof Error ? err.message : String(err);
161
+ this.transition('failed', this.lastError);
162
+ throw err;
163
+ }
164
+ const client = new ssh2_1.Client();
165
+ // ssh2 emits `error` on handshake abort. Absorb it before any other
166
+ // listener is attached or torn down so Mocha never sees an uncaught
167
+ // "Connection lost before handshake".
168
+ client.on('error', () => { });
169
+ this.client = client;
170
+ this.attachClientHandlers(client);
171
+ try {
172
+ await new Promise((resolve, reject) => {
173
+ const timeoutMs = connectConfig.readyTimeout ?? model_1.DEFAULT_READY_TIMEOUT_MS;
174
+ let settled = false;
175
+ const finish = (fn) => {
176
+ if (settled)
177
+ return;
178
+ settled = true;
179
+ clearTimeout(handshakeTimer);
180
+ fn();
181
+ };
182
+ const handshakeTimer = setTimeout(() => {
183
+ finish(() => reject(new errors_1.TunnelError('TRANSPORT_NOT_READY', `SSH handshake to ${this.config.transport.endpoint.host}:${this.config.transport.endpoint.port} timed out after ${timeoutMs}ms`)));
184
+ }, timeoutMs);
185
+ const onReady = () => {
186
+ client.removeListener('error', onError);
187
+ finish(() => resolve());
188
+ };
189
+ const onError = (err) => {
190
+ client.removeListener('ready', onReady);
191
+ const code = /All configured authentication methods failed/i.test(err.message)
192
+ ? 'AUTH_FAILED'
193
+ : 'TRANSPORT_NOT_READY';
194
+ finish(() => reject((0, errors_1.asTunnelError)(code, `Cannot establish SSH transport to ${this.config.transport.endpoint.host}:${this.config.transport.endpoint.port}`, err)));
195
+ };
196
+ client.once('ready', onReady);
197
+ client.once('error', onError);
198
+ client.connect(connectConfig);
199
+ });
200
+ }
201
+ catch (err) {
202
+ this.lastError = err instanceof Error ? err.message : String(err);
203
+ this.safeEndClient(client);
204
+ this.client = undefined;
205
+ if (this.shouldReconnect()) {
206
+ this.transition('reconnecting', this.lastError);
207
+ this.scheduleReconnect(this.lastError);
208
+ return this.getStatus();
209
+ }
210
+ this.transition('failed', this.lastError);
211
+ throw err;
212
+ }
213
+ this.connectedAtUnixMs = Date.now();
214
+ this.lastError = undefined;
215
+ this.transition('ready');
216
+ try {
217
+ await this.declareConfiguredForwards();
218
+ await this.reopenForwards();
219
+ }
220
+ catch (err) {
221
+ this.lastError = err instanceof Error ? err.message : String(err);
222
+ await this.close();
223
+ throw err;
224
+ }
225
+ this.reconnectAttempt = 0;
226
+ this.emit('ready', this.getStatus());
227
+ return this.getStatus();
228
+ }
229
+ /** Close every forward and the transport. Idempotent. */
230
+ async close() {
231
+ if (this.state === 'closed')
232
+ return this.getStatus();
233
+ this.closing = true;
234
+ this.transition('closing');
235
+ if (this.reconnectTimer) {
236
+ clearTimeout(this.reconnectTimer);
237
+ this.reconnectTimer = undefined;
238
+ }
239
+ for (const handle of [...this.remoteForwards.values()]) {
240
+ await handle.close().catch(() => undefined);
241
+ }
242
+ for (const handle of [...this.localForwards.values()]) {
243
+ await handle.close().catch(() => undefined);
244
+ }
245
+ const client = this.client;
246
+ this.client = undefined;
247
+ if (client) {
248
+ await new Promise((resolve) => {
249
+ const done = () => resolve();
250
+ client.once('close', done);
251
+ try {
252
+ client.end();
253
+ }
254
+ catch {
255
+ resolve();
256
+ return;
257
+ }
258
+ setTimeout(done, 2000);
259
+ });
260
+ this.safeEndClient(client);
261
+ }
262
+ this.transition('closed');
263
+ this.emit('close', this.getStatus());
264
+ return this.getStatus();
265
+ }
266
+ // -------------------------------------------------------------------------
267
+ // Forwards
268
+ // -------------------------------------------------------------------------
269
+ /** Declare and open one local forward. Accepts a struct or a v1 spec string. */
270
+ async addLocalForward(forward) {
271
+ const [status] = await this.addLocalForwards([forward]);
272
+ return status;
273
+ }
274
+ /**
275
+ * Declare and open several local forwards atomically: either every listener is
276
+ * bound, or none are and the partial state is rolled back.
277
+ */
278
+ async addLocalForwards(forwards) {
279
+ const handles = forwards.map((input) => this.declareLocalForward(input));
280
+ const opened = [];
281
+ try {
282
+ for (const handle of handles) {
283
+ await handle.open();
284
+ opened.push(handle);
285
+ }
286
+ }
287
+ catch (err) {
288
+ for (const handle of opened) {
289
+ await handle.close().catch(() => undefined);
290
+ this.localForwards.delete(handle.forwardId);
291
+ }
292
+ for (const handle of handles) {
293
+ if (!opened.includes(handle))
294
+ this.localForwards.delete(handle.forwardId);
295
+ }
296
+ throw err;
297
+ }
298
+ return handles.map((handle) => handle.getStatus());
299
+ }
300
+ /** Declare and open one remote forward. Accepts a struct or a v1 spec string. */
301
+ async addRemoteForward(forward) {
302
+ const [status] = await this.addRemoteForwards([forward]);
303
+ return status;
304
+ }
305
+ /** Declare and open several remote forwards atomically. */
306
+ async addRemoteForwards(forwards) {
307
+ const handles = forwards.map((input) => this.declareRemoteForward(input));
308
+ const opened = [];
309
+ try {
310
+ for (const handle of handles) {
311
+ await handle.open();
312
+ opened.push(handle);
313
+ }
314
+ }
315
+ catch (err) {
316
+ for (const handle of opened) {
317
+ await handle.close().catch(() => undefined);
318
+ this.remoteForwards.delete(handle.forwardId);
319
+ }
320
+ for (const handle of handles) {
321
+ if (!opened.includes(handle))
322
+ this.remoteForwards.delete(handle.forwardId);
323
+ }
324
+ throw err;
325
+ }
326
+ return handles.map((handle) => handle.getStatus());
327
+ }
328
+ /** Close and forget one forward. */
329
+ async removeForward(forwardId) {
330
+ const local = this.localForwards.get(forwardId);
331
+ if (local) {
332
+ const status = await local.close();
333
+ this.localForwards.delete(forwardId);
334
+ return status;
335
+ }
336
+ const remote = this.remoteForwards.get(forwardId);
337
+ if (remote) {
338
+ const status = await remote.close();
339
+ this.remoteForwards.delete(forwardId);
340
+ return status;
341
+ }
342
+ throw new errors_1.TunnelError('UNKNOWN_FORWARD', `No forward with id "${forwardId}"`, { forwardId });
343
+ }
344
+ declareLocalForward(input) {
345
+ const spec = typeof input === 'string'
346
+ ? (0, forward_spec_1.parseAndValidateLocalForward)(input, this.config.portPolicy)
347
+ : (0, forward_spec_1.validateLocalForward)(input, this.config.portPolicy);
348
+ const forwardId = spec.id ?? (0, forward_spec_1.describeLocalForward)(spec);
349
+ const existing = this.localForwards.get(forwardId);
350
+ if (existing && existing.getState() !== 'closed') {
351
+ if (spec.exclusive) {
352
+ throw new errors_1.TunnelError('DUPLICATE_FORWARD_ID', `Local forward "${forwardId}" is already declared`, { forwardId });
353
+ }
354
+ return existing;
355
+ }
356
+ const handle = new local_forward_1.LocalForwardHandle({ ...spec, id: forwardId }, this.bridge, this.options.connectionIdleTimeoutMs ?? 0);
357
+ this.localForwards.set(forwardId, handle);
358
+ return handle;
359
+ }
360
+ declareRemoteForward(input) {
361
+ const spec = typeof input === 'string'
362
+ ? (0, forward_spec_1.parseAndValidateRemoteForward)(input, this.config.portPolicy)
363
+ : (0, forward_spec_1.validateRemoteForward)(input, this.config.portPolicy);
364
+ const forwardId = spec.id ?? (0, forward_spec_1.describeRemoteForward)(spec);
365
+ const existing = this.remoteForwards.get(forwardId);
366
+ if (existing && existing.getState() !== 'closed') {
367
+ return existing;
368
+ }
369
+ const handle = new remote_forward_1.RemoteForwardHandle({ ...spec, id: forwardId }, this.bridge, this.options.connectionIdleTimeoutMs ?? 0, this.options.targetConnectTimeoutMs ?? 10000);
370
+ this.remoteForwards.set(forwardId, handle);
371
+ return handle;
372
+ }
373
+ async declareConfiguredForwards() {
374
+ for (const forward of this.config.localForwards ?? []) {
375
+ this.declareLocalForward(forward);
376
+ }
377
+ for (const forward of this.config.remoteForwards ?? []) {
378
+ this.declareRemoteForward(forward);
379
+ }
380
+ }
381
+ /** Open, or re-open after a reconnect, every declared forward. */
382
+ async reopenForwards() {
383
+ for (const handle of this.localForwards.values()) {
384
+ const state = handle.getState();
385
+ if (state === 'active')
386
+ continue;
387
+ if (state === 'degraded') {
388
+ handle.markActive();
389
+ continue;
390
+ }
391
+ if (state === 'closed' || state === 'closing')
392
+ continue;
393
+ await handle.open();
394
+ }
395
+ for (const handle of this.remoteForwards.values()) {
396
+ const state = handle.getState();
397
+ if (state === 'active')
398
+ continue;
399
+ if (state === 'closed' || state === 'closing')
400
+ continue;
401
+ await handle.open();
402
+ }
403
+ }
404
+ // -------------------------------------------------------------------------
405
+ // Optional convenience: run one non-interactive command
406
+ // -------------------------------------------------------------------------
407
+ /**
408
+ * Run a single command on the peer. Provided because verifying a tunnel almost
409
+ * always involves one command; there is deliberately no pty or shell support.
410
+ */
411
+ exec(command, streams = {}) {
412
+ const client = this.bridge.requireClient('exec');
413
+ return new Promise((resolve, reject) => {
414
+ client.exec(command, (err, stream) => {
415
+ if (err) {
416
+ reject((0, errors_1.asTunnelError)('CHANNEL_OPEN_FAILED', `exec failed: ${command}`, err));
417
+ return;
418
+ }
419
+ let stdout = '';
420
+ let stderr = '';
421
+ let code = null;
422
+ stream.on('data', (chunk) => {
423
+ stdout += chunk.toString();
424
+ streams.stdout?.write(chunk);
425
+ });
426
+ stream.stderr.on('data', (chunk) => {
427
+ stderr += chunk.toString();
428
+ streams.stderr?.write(chunk);
429
+ });
430
+ stream.once('exit', (exitCode) => {
431
+ code = exitCode;
432
+ });
433
+ stream.once('close', () => resolve({ code, stdout, stderr }));
434
+ });
435
+ });
436
+ }
437
+ // -------------------------------------------------------------------------
438
+ // Transport plumbing
439
+ // -------------------------------------------------------------------------
440
+ async buildConnectConfig() {
441
+ const transport = this.config.transport;
442
+ const privateKey = await (0, credentials_1.resolveCredential)(transport.privateKey, {
443
+ resolver: this.options.credentialResolver,
444
+ label: 'private key',
445
+ });
446
+ const passphrase = await (0, credentials_1.resolveCredential)(transport.passphrase, {
447
+ resolver: this.options.credentialResolver,
448
+ label: 'passphrase',
449
+ });
450
+ const password = await (0, credentials_1.resolveCredential)(transport.password, {
451
+ resolver: this.options.credentialResolver,
452
+ label: 'password',
453
+ });
454
+ const agent = (0, credentials_1.resolveAgentSocket)(transport.privateKey);
455
+ if (!privateKey && !password && !agent) {
456
+ throw new errors_1.TunnelError('CREDENTIAL_UNRESOLVED', 'No authentication material: supply transport.privateKey, transport.password, or an agent ref');
457
+ }
458
+ const config = {
459
+ host: transport.endpoint.host,
460
+ port: transport.endpoint.port,
461
+ username: transport.username,
462
+ keepaliveInterval: transport.keepaliveIntervalMs ?? model_1.DEFAULT_KEEPALIVE_INTERVAL_MS,
463
+ keepaliveCountMax: transport.keepaliveCountMax ?? model_1.DEFAULT_KEEPALIVE_COUNT_MAX,
464
+ readyTimeout: transport.readyTimeoutMs ?? model_1.DEFAULT_READY_TIMEOUT_MS,
465
+ };
466
+ if (privateKey)
467
+ config.privateKey = privateKey;
468
+ if (passphrase)
469
+ config.passphrase = passphrase;
470
+ if (password)
471
+ config.password = password;
472
+ if (agent)
473
+ config.agent = agent;
474
+ const fingerprints = transport.hostKeyFingerprints;
475
+ if (fingerprints && fingerprints.length > 0) {
476
+ const expected = new Set(fingerprints.map((value) => value.trim()));
477
+ config.hostVerifier = (key) => {
478
+ const buffer = typeof key === 'string' ? Buffer.from(key, 'base64') : key;
479
+ const digest = (0, node_crypto_1.createHash)('sha256').update(buffer).digest('base64').replace(/=+$/, '');
480
+ return expected.has(`sha256:${digest}`) || expected.has(digest);
481
+ };
482
+ }
483
+ if (this.options.debugSsh) {
484
+ config.debug = (message) => this.emit('debug', message);
485
+ }
486
+ return config;
487
+ }
488
+ attachClientHandlers(client) {
489
+ client.on('tcp connection', (details, accept, reject) => {
490
+ const destIP = String(details.destIP ?? '');
491
+ const destPort = Number(details.destPort ?? 0);
492
+ const handle = [...this.remoteForwards.values()].find((candidate) => candidate.matches(destIP, destPort));
493
+ if (!handle) {
494
+ this.raise(new errors_1.TunnelError('UNKNOWN_FORWARD', `Rejected unexpected inbound channel for ${destIP}:${destPort}`));
495
+ reject();
496
+ return;
497
+ }
498
+ handle.acceptChannel(accept, reject, {
499
+ host: String(details.srcIP ?? ''),
500
+ port: Number(details.srcPort ?? 0),
501
+ });
502
+ });
503
+ client.on('error', (err) => {
504
+ this.lastError = err.message;
505
+ this.raise((0, errors_1.asTunnelError)('TRANSPORT_NOT_READY', 'SSH transport error', err));
506
+ });
507
+ client.on('close', () => {
508
+ if (this.client !== client)
509
+ return;
510
+ this.handleTransportLoss('transport closed');
511
+ });
512
+ client.on('end', () => {
513
+ this.emit('debug', 'ssh transport ended');
514
+ });
515
+ }
516
+ handleTransportLoss(reason) {
517
+ if (this.closing || this.state === 'closing' || this.state === 'closed')
518
+ return;
519
+ this.client = undefined;
520
+ this.connectedAtUnixMs = undefined;
521
+ for (const handle of this.localForwards.values())
522
+ handle.markDegraded(reason);
523
+ for (const handle of this.remoteForwards.values())
524
+ handle.markDegraded(reason);
525
+ if (!this.shouldReconnect()) {
526
+ this.transition('failed', reason);
527
+ return;
528
+ }
529
+ this.transition('reconnecting', reason);
530
+ this.scheduleReconnect(reason);
531
+ }
532
+ shouldReconnect() {
533
+ if (this.closing)
534
+ return false;
535
+ const policy = { ...model_1.DEFAULT_RECONNECT_POLICY, ...(this.config.reconnect ?? {}) };
536
+ if (!policy.enabled)
537
+ return false;
538
+ if (policy.maxAttempts === 0)
539
+ return true;
540
+ return this.reconnectAttempt < policy.maxAttempts;
541
+ }
542
+ scheduleReconnect(cause) {
543
+ const policy = { ...model_1.DEFAULT_RECONNECT_POLICY, ...(this.config.reconnect ?? {}) };
544
+ this.reconnectAttempt += 1;
545
+ const base = Math.min(policy.initialDelayMs * Math.pow(policy.backoffMultiplier, this.reconnectAttempt - 1), policy.maxDelayMs);
546
+ const jitter = base * policy.jitterRatio * (Math.random() * 2 - 1);
547
+ const delayMs = Math.max(50, Math.round(base + jitter));
548
+ this.emit('reconnect', { attempt: this.reconnectAttempt, delayMs, cause });
549
+ if (this.reconnectTimer)
550
+ clearTimeout(this.reconnectTimer);
551
+ this.reconnectTimer = setTimeout(() => {
552
+ this.reconnectTimer = undefined;
553
+ if (this.closing)
554
+ return;
555
+ void this.doConnect().catch((err) => {
556
+ this.raise(err instanceof errors_1.TunnelError
557
+ ? err
558
+ : (0, errors_1.asTunnelError)('TRANSPORT_NOT_READY', 'Reconnect attempt failed', err));
559
+ if (!this.shouldReconnect()) {
560
+ this.raise(new errors_1.TunnelError('RECONNECT_EXHAUSTED', `Giving up after ${this.reconnectAttempt} reconnect attempts`));
561
+ this.transition('failed', 'reconnect exhausted');
562
+ }
563
+ });
564
+ }, delayMs);
565
+ this.reconnectTimer.unref?.();
566
+ }
567
+ safeEndClient(client) {
568
+ try {
569
+ client.removeAllListeners();
570
+ client.on('error', () => {
571
+ /* socket close after handshake abort */
572
+ });
573
+ client.end();
574
+ client.destroy();
575
+ }
576
+ catch {
577
+ // best effort
578
+ }
579
+ }
580
+ transition(next, reason) {
581
+ if (this.state === next)
582
+ return;
583
+ const previous = this.state;
584
+ this.state = next;
585
+ this.emit('state', { previous, current: next, reason });
586
+ }
587
+ /** Emit an error without the unhandled-'error' crash when nobody listens. */
588
+ raise(error) {
589
+ this.lastError = error.message;
590
+ if (this.listenerCount('error') > 0) {
591
+ this.emit('error', error);
592
+ }
593
+ else {
594
+ this.emit('debug', `unhandled tunnel error [${error.code}] ${error.message}`);
595
+ }
596
+ }
597
+ }
598
+ exports.SSHTunnel = SSHTunnel;
599
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}