ssh_tunnel_proxy 2.1.1 → 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.
- package/LICENSE +19 -3
- package/MIGRATION.md +227 -0
- package/README.md +360 -212
- package/build/bridge.d.ts +14 -0
- package/build/bridge.d.ts.map +1 -0
- package/build/bridge.js +12 -0
- package/build/bridge.js.map +1 -0
- package/build/connection.d.ts +60 -0
- package/build/connection.d.ts.map +1 -0
- package/build/connection.js +198 -0
- package/build/connection.js.map +1 -0
- package/build/credentials.d.ts +24 -0
- package/build/credentials.d.ts.map +1 -0
- package/build/credentials.js +102 -0
- package/build/credentials.js.map +1 -0
- package/build/errors.d.ts +19 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +64 -0
- package/build/errors.js.map +1 -0
- package/build/forward-spec.d.ts +34 -0
- package/build/forward-spec.d.ts.map +1 -0
- package/build/forward-spec.js +175 -0
- package/build/forward-spec.js.map +1 -0
- package/build/index.d.ts +19 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +71 -0
- package/build/index.js.map +1 -0
- package/build/legacy.d.ts +70 -0
- package/build/legacy.d.ts.map +1 -0
- package/build/legacy.js +188 -0
- package/build/legacy.js.map +1 -0
- package/build/local-forward.d.ts +31 -0
- package/build/local-forward.d.ts.map +1 -0
- package/build/local-forward.js +231 -0
- package/build/local-forward.js.map +1 -0
- package/build/model.d.ts +126 -0
- package/build/model.d.ts.map +1 -0
- package/build/model.js +55 -0
- package/build/model.js.map +1 -0
- package/build/port-policy.d.ts +43 -0
- package/build/port-policy.d.ts.map +1 -0
- package/build/port-policy.js +138 -0
- package/build/port-policy.js.map +1 -0
- package/build/remote-forward.d.ts +40 -0
- package/build/remote-forward.d.ts.map +1 -0
- package/build/remote-forward.js +226 -0
- package/build/remote-forward.js.map +1 -0
- package/build/tunnel.d.ts +121 -0
- package/build/tunnel.d.ts.map +1 -0
- package/build/tunnel.js +599 -0
- package/build/tunnel.js.map +1 -0
- package/examples/config.example.json +86 -0
- package/examples/setup_ssh.sh +12 -0
- package/examples/tunnel-cli.js +461 -0
- package/examples/tunnel-worker.js +98 -0
- package/examples/zrok-termux.ts +147 -0
- package/package.json +43 -53
- package/proto/sshtunnel/v1/tunnel.proto +343 -0
- package/dist/TestMessage.d.ts +0 -13
- package/dist/TestMessage.js +0 -32
- package/dist/TestMessage.js.map +0 -1
- package/dist/cjs/TestMessage.d.ts +0 -13
- package/dist/cjs/TestMessage.js +0 -32
- package/dist/cjs/TestMessage.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -73
- package/dist/cjs/index.js +0 -621
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/keypair_storage.d.ts +0 -12
- package/dist/cjs/keypair_storage.js +0 -143
- package/dist/cjs/keypair_storage.js.map +0 -1
- package/dist/cjs/ngrok_service.d.ts +0 -11
- package/dist/cjs/ngrok_service.js +0 -40
- package/dist/cjs/ngrok_service.js.map +0 -1
- package/dist/cjs/ssh2-node.d.ts +0 -1
- package/dist/cjs/ssh2-node.js +0 -211
- package/dist/cjs/ssh2-node.js.map +0 -1
- package/dist/esm/TestMessage.d.ts +0 -13
- package/dist/esm/TestMessage.js +0 -29
- package/dist/esm/TestMessage.js.map +0 -1
- package/dist/esm/index.d.ts +0 -73
- package/dist/esm/index.js +0 -616
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/keypair_storage.d.ts +0 -12
- package/dist/esm/keypair_storage.js +0 -117
- package/dist/esm/keypair_storage.js.map +0 -1
- package/dist/esm/ngrok_service.d.ts +0 -11
- package/dist/esm/ngrok_service.js +0 -37
- package/dist/esm/ngrok_service.js.map +0 -1
- package/dist/esm/ssh2-node.d.ts +0 -1
- package/dist/esm/ssh2-node.js +0 -184
- package/dist/esm/ssh2-node.js.map +0 -1
- package/dist/index.d.ts +0 -73
- package/dist/index.js +0 -620
- package/dist/index.js.map +0 -1
- package/dist/keypair_storage.d.ts +0 -12
- package/dist/keypair_storage.js +0 -120
- package/dist/keypair_storage.js.map +0 -1
- package/dist/ngrok_service.d.ts +0 -11
- package/dist/ngrok_service.js +0 -40
- package/dist/ngrok_service.js.map +0 -1
- package/dist/ssh2-node.d.ts +0 -1
- package/dist/ssh2-node.js +0 -188
- package/dist/ssh2-node.js.map +0 -1
- package/dist/types/TestMessage.d.ts +0 -13
- package/dist/types/index.d.ts +0 -73
- package/dist/types/keypair_storage.d.ts +0 -12
- package/dist/types/ngrok_service.d.ts +0 -11
- package/dist/types/ssh2-node.d.ts +0 -1
- package/ssh2-node +0 -2
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ClientChannel } from 'ssh2';
|
|
2
|
+
import type { TransportBridge } from './bridge';
|
|
3
|
+
import type { ForwardState, ForwardStatus, RemoteForward } from './model';
|
|
4
|
+
export declare class RemoteForwardHandle {
|
|
5
|
+
readonly forwardId: string;
|
|
6
|
+
readonly spec: RemoteForward;
|
|
7
|
+
private state;
|
|
8
|
+
private assignedPort?;
|
|
9
|
+
private lastError?;
|
|
10
|
+
private totalConnections;
|
|
11
|
+
private readonly connections;
|
|
12
|
+
private readonly bridge;
|
|
13
|
+
private readonly idleTimeoutMs;
|
|
14
|
+
private readonly connectTimeoutMs;
|
|
15
|
+
constructor(spec: RemoteForward, bridge: TransportBridge, idleTimeoutMs?: number, connectTimeoutMs?: number);
|
|
16
|
+
getState(): ForwardState;
|
|
17
|
+
/** The port the peer actually bound; differs from the request when 0 was asked. */
|
|
18
|
+
getBoundPort(): number;
|
|
19
|
+
getStatus(): ForwardStatus;
|
|
20
|
+
listConnections(): import("./model").ConnectionStatus[];
|
|
21
|
+
/** True when an inbound `tcp connection` event belongs to this forward. */
|
|
22
|
+
matches(destIP: string, destPort: number): boolean;
|
|
23
|
+
/** Ask the peer to bind the listener. Resolves with the bound port. */
|
|
24
|
+
open(): Promise<ForwardStatus>;
|
|
25
|
+
/**
|
|
26
|
+
* Handle an inbound channel from the peer by dialling the target with a fresh
|
|
27
|
+
* socket. Returns false if the channel was rejected.
|
|
28
|
+
*/
|
|
29
|
+
acceptChannel(accept: () => ClientChannel, reject: () => void, source: {
|
|
30
|
+
host: string;
|
|
31
|
+
port: number;
|
|
32
|
+
}): boolean;
|
|
33
|
+
markDegraded(reason: string): void;
|
|
34
|
+
markActive(): void;
|
|
35
|
+
/** Unbind on the peer. Tolerates a transport that has already gone away. */
|
|
36
|
+
close(): Promise<ForwardStatus>;
|
|
37
|
+
private closeConnections;
|
|
38
|
+
private transition;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=remote-forward.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-forward.d.ts","sourceRoot":"","sources":["../src/remote-forward.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE1E,qBAAa,mBAAmB;IAC9B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,IAAI,EAAE,aAAa,CAAC;IAEpC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAGxC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,eAAe,EACvB,aAAa,SAAI,EACjB,gBAAgB,SAAQ;IASnB,QAAQ,IAAI,YAAY;IAI/B,mFAAmF;IAC5E,YAAY,IAAI,MAAM;IAItB,SAAS,IAAI,aAAa;IAc1B,eAAe;IAItB,2EAA2E;IACpE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYzD,uEAAuE;IAC1D,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IAoC3C;;;OAGG;IACI,aAAa,CAClB,MAAM,EAAE,MAAM,aAAa,EAC3B,MAAM,EAAE,MAAM,IAAI,EAClB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO;IAqGH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOlC,UAAU,IAAI,IAAI;IAOzB,4EAA4E;IAC/D,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;IAqB5C,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,UAAU;CAMnB"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* remote-forward.ts — ssh -R, as a first-class object.
|
|
4
|
+
*
|
|
5
|
+
* The important correctness fix relative to v1: a fresh outbound TCP socket is
|
|
6
|
+
* created for every inbound channel. v1 created one socket per registration and
|
|
7
|
+
* reused it for every connection, so a second concurrent connection interleaved
|
|
8
|
+
* bytes into the same stream. All channels still share one SSH transport.
|
|
9
|
+
*
|
|
10
|
+
* License: MIT
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.RemoteForwardHandle = void 0;
|
|
14
|
+
const node_net_1 = require("node:net");
|
|
15
|
+
const connection_1 = require("./connection");
|
|
16
|
+
const errors_1 = require("./errors");
|
|
17
|
+
const forward_spec_1 = require("./forward-spec");
|
|
18
|
+
class RemoteForwardHandle {
|
|
19
|
+
forwardId;
|
|
20
|
+
spec;
|
|
21
|
+
state = 'pending';
|
|
22
|
+
assignedPort;
|
|
23
|
+
lastError;
|
|
24
|
+
totalConnections = 0;
|
|
25
|
+
connections = new Map();
|
|
26
|
+
bridge;
|
|
27
|
+
idleTimeoutMs;
|
|
28
|
+
connectTimeoutMs;
|
|
29
|
+
constructor(spec, bridge, idleTimeoutMs = 0, connectTimeoutMs = 10000) {
|
|
30
|
+
this.spec = spec;
|
|
31
|
+
this.forwardId = spec.id ?? (0, forward_spec_1.describeRemoteForward)(spec);
|
|
32
|
+
this.bridge = bridge;
|
|
33
|
+
this.idleTimeoutMs = idleTimeoutMs;
|
|
34
|
+
this.connectTimeoutMs = connectTimeoutMs;
|
|
35
|
+
}
|
|
36
|
+
getState() {
|
|
37
|
+
return this.state;
|
|
38
|
+
}
|
|
39
|
+
/** The port the peer actually bound; differs from the request when 0 was asked. */
|
|
40
|
+
getBoundPort() {
|
|
41
|
+
return this.assignedPort ?? this.spec.bind.port;
|
|
42
|
+
}
|
|
43
|
+
getStatus() {
|
|
44
|
+
return {
|
|
45
|
+
forwardId: this.forwardId,
|
|
46
|
+
direction: 'remote',
|
|
47
|
+
state: this.state,
|
|
48
|
+
listen: { host: this.spec.bind.host, port: this.getBoundPort() },
|
|
49
|
+
target: { ...this.spec.target },
|
|
50
|
+
assignedPort: this.assignedPort,
|
|
51
|
+
activeConnections: this.connections.size,
|
|
52
|
+
totalConnections: this.totalConnections,
|
|
53
|
+
error: this.lastError,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
listConnections() {
|
|
57
|
+
return [...this.connections.values()].map((connection) => connection.getStatus());
|
|
58
|
+
}
|
|
59
|
+
/** True when an inbound `tcp connection` event belongs to this forward. */
|
|
60
|
+
matches(destIP, destPort) {
|
|
61
|
+
if (destPort !== this.getBoundPort())
|
|
62
|
+
return false;
|
|
63
|
+
const bind = this.spec.bind.host;
|
|
64
|
+
if (bind === destIP)
|
|
65
|
+
return true;
|
|
66
|
+
// The peer reports the address it actually bound, which rarely matches the
|
|
67
|
+
// request verbatim: "localhost" vs "127.0.0.1", "" vs "0.0.0.0".
|
|
68
|
+
const loopback = new Set(['localhost', '127.0.0.1', '::1']);
|
|
69
|
+
if (loopback.has(bind) && loopback.has(destIP))
|
|
70
|
+
return true;
|
|
71
|
+
const wildcard = new Set(['', '*', '0.0.0.0', '::']);
|
|
72
|
+
return wildcard.has(bind) || wildcard.has(destIP);
|
|
73
|
+
}
|
|
74
|
+
/** Ask the peer to bind the listener. Resolves with the bound port. */
|
|
75
|
+
async open() {
|
|
76
|
+
if (this.state === 'active')
|
|
77
|
+
return this.getStatus();
|
|
78
|
+
this.transition('opening');
|
|
79
|
+
const client = this.bridge.requireClient(this.forwardId);
|
|
80
|
+
try {
|
|
81
|
+
this.assignedPort = await new Promise((resolve, reject) => {
|
|
82
|
+
client.forwardIn(this.spec.bind.host, this.spec.bind.port, (err, port) => {
|
|
83
|
+
if (err) {
|
|
84
|
+
reject((0, errors_1.asTunnelError)('REMOTE_BIND_FAILED', `Peer refused to bind ${this.spec.bind.host}:${this.spec.bind.port}`, err, { forwardId: this.forwardId }));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
resolve(port ?? this.spec.bind.port);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
93
|
+
this.transition('failed');
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
this.transition('active');
|
|
97
|
+
this.bridge.debug(`remote forward active peer ${this.spec.bind.host}:${this.getBoundPort()} -> ${this.spec.target.host}:${this.spec.target.port}`);
|
|
98
|
+
return this.getStatus();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Handle an inbound channel from the peer by dialling the target with a fresh
|
|
102
|
+
* socket. Returns false if the channel was rejected.
|
|
103
|
+
*/
|
|
104
|
+
acceptChannel(accept, reject, source) {
|
|
105
|
+
if (this.state !== 'active') {
|
|
106
|
+
this.bridge.onError(new errors_1.TunnelError('TRANSPORT_NOT_READY', `Remote forward ${this.forwardId} is ${this.state}; rejecting channel`, { forwardId: this.forwardId }));
|
|
107
|
+
reject();
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
const limit = this.spec.maxConnections ?? 0;
|
|
111
|
+
if (limit > 0 && this.connections.size >= limit) {
|
|
112
|
+
this.bridge.onError(new errors_1.TunnelError('CONNECTION_LIMIT', `Forward ${this.forwardId} reached maxConnections=${limit}`, { forwardId: this.forwardId }));
|
|
113
|
+
reject();
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const connection = new connection_1.ProxiedConnection({
|
|
117
|
+
forwardId: this.forwardId,
|
|
118
|
+
direction: 'remote',
|
|
119
|
+
source,
|
|
120
|
+
destination: { ...this.spec.target },
|
|
121
|
+
idleTimeoutMs: this.idleTimeoutMs,
|
|
122
|
+
onStateChange: (status, previous) => {
|
|
123
|
+
if (status.state === 'closed' || status.state === 'failed') {
|
|
124
|
+
this.connections.delete(status.connectionId);
|
|
125
|
+
}
|
|
126
|
+
this.bridge.onConnectionChanged(status, previous);
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
this.connections.set(connection.connectionId, connection);
|
|
130
|
+
this.totalConnections += 1;
|
|
131
|
+
connection.markOpening();
|
|
132
|
+
const channel = accept();
|
|
133
|
+
channel.pause();
|
|
134
|
+
// Adopt the channel now so an unreachable target still closes it, instead of
|
|
135
|
+
// leaving whoever connected on the peer waiting forever.
|
|
136
|
+
connection.adoptInbound(channel);
|
|
137
|
+
// One socket per channel. This is the concurrency fix.
|
|
138
|
+
const socket = new node_net_1.Socket();
|
|
139
|
+
let settled = false;
|
|
140
|
+
const timer = this.connectTimeoutMs > 0
|
|
141
|
+
? setTimeout(() => {
|
|
142
|
+
if (settled)
|
|
143
|
+
return;
|
|
144
|
+
settled = true;
|
|
145
|
+
const err = new errors_1.TunnelError('TARGET_UNREACHABLE', `Timed out connecting to ${this.spec.target.host}:${this.spec.target.port}`, { forwardId: this.forwardId, connectionId: connection.connectionId });
|
|
146
|
+
this.bridge.onError(err);
|
|
147
|
+
socket.destroy();
|
|
148
|
+
connection.fail(err, 'outbound');
|
|
149
|
+
}, this.connectTimeoutMs)
|
|
150
|
+
: undefined;
|
|
151
|
+
socket.once('error', (err) => {
|
|
152
|
+
if (settled)
|
|
153
|
+
return;
|
|
154
|
+
settled = true;
|
|
155
|
+
if (timer)
|
|
156
|
+
clearTimeout(timer);
|
|
157
|
+
const wrapped = (0, errors_1.asTunnelError)('TARGET_UNREACHABLE', `Cannot reach ${this.spec.target.host}:${this.spec.target.port}`, err, { forwardId: this.forwardId, connectionId: connection.connectionId });
|
|
158
|
+
this.bridge.onError(wrapped);
|
|
159
|
+
connection.fail(wrapped, 'outbound');
|
|
160
|
+
});
|
|
161
|
+
socket.once('connect', () => {
|
|
162
|
+
if (settled)
|
|
163
|
+
return;
|
|
164
|
+
settled = true;
|
|
165
|
+
if (timer)
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
connection.attach(channel, socket);
|
|
168
|
+
channel.resume();
|
|
169
|
+
});
|
|
170
|
+
socket.connect({
|
|
171
|
+
host: this.spec.target.host,
|
|
172
|
+
port: this.spec.target.port,
|
|
173
|
+
keepAlive: true,
|
|
174
|
+
});
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
markDegraded(reason) {
|
|
178
|
+
if (this.state === 'closed' || this.state === 'closing')
|
|
179
|
+
return;
|
|
180
|
+
this.lastError = reason;
|
|
181
|
+
this.closeConnections();
|
|
182
|
+
this.transition('degraded');
|
|
183
|
+
}
|
|
184
|
+
markActive() {
|
|
185
|
+
if (this.state === 'degraded') {
|
|
186
|
+
this.lastError = undefined;
|
|
187
|
+
this.transition('active');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Unbind on the peer. Tolerates a transport that has already gone away. */
|
|
191
|
+
async close() {
|
|
192
|
+
if (this.state === 'closed')
|
|
193
|
+
return this.getStatus();
|
|
194
|
+
const wasActive = this.state === 'active';
|
|
195
|
+
this.transition('closing');
|
|
196
|
+
this.closeConnections();
|
|
197
|
+
const client = this.bridge.peekClient();
|
|
198
|
+
if (client && wasActive) {
|
|
199
|
+
await new Promise((resolve) => {
|
|
200
|
+
try {
|
|
201
|
+
client.unforwardIn(this.spec.bind.host, this.getBoundPort(), () => resolve());
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
resolve();
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
this.transition('closed');
|
|
209
|
+
return this.getStatus();
|
|
210
|
+
}
|
|
211
|
+
closeConnections() {
|
|
212
|
+
for (const connection of [...this.connections.values()]) {
|
|
213
|
+
connection.close();
|
|
214
|
+
}
|
|
215
|
+
this.connections.clear();
|
|
216
|
+
}
|
|
217
|
+
transition(next) {
|
|
218
|
+
if (this.state === next)
|
|
219
|
+
return;
|
|
220
|
+
const previous = this.state;
|
|
221
|
+
this.state = next;
|
|
222
|
+
this.bridge.onForwardChanged(this.getStatus(), previous);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.RemoteForwardHandle = RemoteForwardHandle;
|
|
226
|
+
//# sourceMappingURL=remote-forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-forward.js","sourceRoot":"","sources":["../src/remote-forward.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { Writable } from 'node:stream';
|
|
3
|
+
import { TunnelError } from './errors';
|
|
4
|
+
import { type CredentialResolver } from './credentials';
|
|
5
|
+
import { type ConnectionState, type ConnectionStatus, type Endpoint, type ForwardState, type ForwardStatus, type LocalForward, type RemoteForward, type TunnelConfig, type TunnelState, type TunnelStatus } from './model';
|
|
6
|
+
export interface TunnelEvents {
|
|
7
|
+
state: (event: {
|
|
8
|
+
previous: TunnelState;
|
|
9
|
+
current: TunnelState;
|
|
10
|
+
reason?: string;
|
|
11
|
+
}) => void;
|
|
12
|
+
ready: (status: TunnelStatus) => void;
|
|
13
|
+
forward: (event: {
|
|
14
|
+
status: ForwardStatus;
|
|
15
|
+
previous: ForwardState;
|
|
16
|
+
}) => void;
|
|
17
|
+
connection: (event: {
|
|
18
|
+
status: ConnectionStatus;
|
|
19
|
+
previous: ConnectionState;
|
|
20
|
+
}) => void;
|
|
21
|
+
reconnect: (event: {
|
|
22
|
+
attempt: number;
|
|
23
|
+
delayMs: number;
|
|
24
|
+
cause?: string;
|
|
25
|
+
}) => void;
|
|
26
|
+
error: (error: TunnelError) => void;
|
|
27
|
+
close: (status: TunnelStatus) => void;
|
|
28
|
+
debug: (message: string, ...args: unknown[]) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface SSHTunnelOptions {
|
|
31
|
+
/** Resolver for `{ source: 'callback' }` credential refs. */
|
|
32
|
+
credentialResolver?: CredentialResolver;
|
|
33
|
+
/** Destroy a proxied connection after this much inactivity. 0 disables. */
|
|
34
|
+
connectionIdleTimeoutMs?: number;
|
|
35
|
+
/** Timeout for dialling a remote-forward target. */
|
|
36
|
+
targetConnectTimeoutMs?: number;
|
|
37
|
+
/** Emit ssh2 protocol-level debug through the `debug` event. */
|
|
38
|
+
debugSsh?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare class SSHTunnel extends EventEmitter {
|
|
41
|
+
readonly tunnelId: string;
|
|
42
|
+
private readonly config;
|
|
43
|
+
private readonly options;
|
|
44
|
+
private readonly bridge;
|
|
45
|
+
private client?;
|
|
46
|
+
private state;
|
|
47
|
+
private lastError?;
|
|
48
|
+
private connectedAtUnixMs?;
|
|
49
|
+
private reconnectAttempt;
|
|
50
|
+
private reconnectTimer?;
|
|
51
|
+
private connectPromise?;
|
|
52
|
+
private closing;
|
|
53
|
+
private readonly localForwards;
|
|
54
|
+
private readonly remoteForwards;
|
|
55
|
+
constructor(config: TunnelConfig, options?: SSHTunnelOptions);
|
|
56
|
+
on<E extends keyof TunnelEvents>(event: E, listener: TunnelEvents[E]): this;
|
|
57
|
+
once<E extends keyof TunnelEvents>(event: E, listener: TunnelEvents[E]): this;
|
|
58
|
+
off<E extends keyof TunnelEvents>(event: E, listener: TunnelEvents[E]): this;
|
|
59
|
+
emit<E extends keyof TunnelEvents>(event: E, ...args: Parameters<TunnelEvents[E]>): boolean;
|
|
60
|
+
getState(): TunnelState;
|
|
61
|
+
isReady(): boolean;
|
|
62
|
+
getStatus(): TunnelStatus;
|
|
63
|
+
listConnections(): ConnectionStatus[];
|
|
64
|
+
getForwardStatus(forwardId: string): ForwardStatus;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve a semantic forward id to the endpoint a caller should connect to.
|
|
67
|
+
* This is the hook an agent-flow runtime uses instead of hard-coding ports.
|
|
68
|
+
*/
|
|
69
|
+
resolveEndpoint(forwardId: string): {
|
|
70
|
+
endpoint: Endpoint;
|
|
71
|
+
state: ForwardState;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Establish the transport and open every forward declared in the config.
|
|
75
|
+
* Concurrent calls share one attempt. Resolves when all forwards are active.
|
|
76
|
+
*/
|
|
77
|
+
connect(): Promise<TunnelStatus>;
|
|
78
|
+
private doConnect;
|
|
79
|
+
/** Close every forward and the transport. Idempotent. */
|
|
80
|
+
close(): Promise<TunnelStatus>;
|
|
81
|
+
/** Declare and open one local forward. Accepts a struct or a v1 spec string. */
|
|
82
|
+
addLocalForward(forward: LocalForward | string): Promise<ForwardStatus>;
|
|
83
|
+
/**
|
|
84
|
+
* Declare and open several local forwards atomically: either every listener is
|
|
85
|
+
* bound, or none are and the partial state is rolled back.
|
|
86
|
+
*/
|
|
87
|
+
addLocalForwards(forwards: readonly (LocalForward | string)[]): Promise<ForwardStatus[]>;
|
|
88
|
+
/** Declare and open one remote forward. Accepts a struct or a v1 spec string. */
|
|
89
|
+
addRemoteForward(forward: RemoteForward | string): Promise<ForwardStatus>;
|
|
90
|
+
/** Declare and open several remote forwards atomically. */
|
|
91
|
+
addRemoteForwards(forwards: readonly (RemoteForward | string)[]): Promise<ForwardStatus[]>;
|
|
92
|
+
/** Close and forget one forward. */
|
|
93
|
+
removeForward(forwardId: string): Promise<ForwardStatus>;
|
|
94
|
+
private declareLocalForward;
|
|
95
|
+
private declareRemoteForward;
|
|
96
|
+
private declareConfiguredForwards;
|
|
97
|
+
/** Open, or re-open after a reconnect, every declared forward. */
|
|
98
|
+
private reopenForwards;
|
|
99
|
+
/**
|
|
100
|
+
* Run a single command on the peer. Provided because verifying a tunnel almost
|
|
101
|
+
* always involves one command; there is deliberately no pty or shell support.
|
|
102
|
+
*/
|
|
103
|
+
exec(command: string, streams?: {
|
|
104
|
+
stdout?: Writable;
|
|
105
|
+
stderr?: Writable;
|
|
106
|
+
}): Promise<{
|
|
107
|
+
code: number | null;
|
|
108
|
+
stdout: string;
|
|
109
|
+
stderr: string;
|
|
110
|
+
}>;
|
|
111
|
+
private buildConnectConfig;
|
|
112
|
+
private attachClientHandlers;
|
|
113
|
+
private handleTransportLoss;
|
|
114
|
+
private shouldReconnect;
|
|
115
|
+
private scheduleReconnect;
|
|
116
|
+
private safeEndClient;
|
|
117
|
+
private transition;
|
|
118
|
+
/** Emit an error without the unhandled-'error' crash when nobody listens. */
|
|
119
|
+
private raise;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
|