nikcli-remote 1.0.9 → 1.0.11
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/dist/chunk-5ANLFHJV.js +1145 -0
- package/dist/chunk-GI5RMYH6.js +37 -0
- package/dist/index.cjs +4683 -6082
- package/dist/index.d.cts +98 -60
- package/dist/index.d.ts +98 -60
- package/dist/index.js +228 -7
- package/dist/{localtunnel-XT32JGNN.js → localtunnel-6DCQIYU6.js} +1 -1
- package/dist/server-VOW4RWJA.js +7 -0
- package/package.json +1 -1
- package/src/index.ts +57 -12
- package/src/server.ts +113 -108
- package/src/tunnel.ts +24 -0
- package/dist/chunk-3IFHAOGG.js +0 -2747
- package/dist/chunk-MCKGQKYU.js +0 -15
- package/dist/server-MBJQBTJF.js +0 -7
package/dist/index.d.cts
CHANGED
|
@@ -71,22 +71,6 @@ interface ClientMessage {
|
|
|
71
71
|
type: string;
|
|
72
72
|
[key: string]: unknown;
|
|
73
73
|
}
|
|
74
|
-
interface ServerMessage {
|
|
75
|
-
type: string;
|
|
76
|
-
payload?: unknown;
|
|
77
|
-
timestamp: number;
|
|
78
|
-
}
|
|
79
|
-
interface TerminalData {
|
|
80
|
-
data: string;
|
|
81
|
-
}
|
|
82
|
-
interface TerminalResize {
|
|
83
|
-
cols: number;
|
|
84
|
-
rows: number;
|
|
85
|
-
}
|
|
86
|
-
interface CommandMessage {
|
|
87
|
-
command: string;
|
|
88
|
-
args?: string[];
|
|
89
|
-
}
|
|
90
74
|
interface ClientConnection {
|
|
91
75
|
id: string;
|
|
92
76
|
authenticated: boolean;
|
|
@@ -118,8 +102,8 @@ declare const MessageTypes: {
|
|
|
118
102
|
};
|
|
119
103
|
|
|
120
104
|
/**
|
|
121
|
-
* @nikcli/remote -
|
|
122
|
-
* WebSocket
|
|
105
|
+
* @nikcli/remote - Direct Terminal Streaming Server
|
|
106
|
+
* Proxies NikCLI's stdin/stdout to WebSocket clients for true real-time terminal access
|
|
123
107
|
*/
|
|
124
108
|
|
|
125
109
|
interface RemoteServerEvents {
|
|
@@ -130,13 +114,9 @@ interface RemoteServerEvents {
|
|
|
130
114
|
'client:error': (clientId: string, error: Error) => void;
|
|
131
115
|
'tunnel:connected': (url: string) => void;
|
|
132
116
|
'tunnel:error': (error: Error) => void;
|
|
133
|
-
command: (cmd: {
|
|
134
|
-
clientId: string;
|
|
135
|
-
command: string;
|
|
136
|
-
args?: string[];
|
|
137
|
-
}) => void;
|
|
138
117
|
message: (client: ClientConnection, message: ClientMessage) => void;
|
|
139
118
|
error: (error: Error) => void;
|
|
119
|
+
'terminal:output': (data: string) => void;
|
|
140
120
|
}
|
|
141
121
|
declare class RemoteServer extends EventEmitter {
|
|
142
122
|
private config;
|
|
@@ -144,19 +124,35 @@ declare class RemoteServer extends EventEmitter {
|
|
|
144
124
|
private wss;
|
|
145
125
|
private clients;
|
|
146
126
|
private session;
|
|
147
|
-
private terminal;
|
|
148
|
-
private tunnel;
|
|
149
127
|
private heartbeatTimer;
|
|
150
128
|
private sessionTimeoutTimer;
|
|
151
129
|
private isRunning;
|
|
152
130
|
private sessionSecret;
|
|
131
|
+
private originalStdoutWrite;
|
|
132
|
+
private originalStdinOn;
|
|
153
133
|
constructor(config?: Partial<ServerConfig>);
|
|
154
134
|
/**
|
|
155
|
-
*
|
|
135
|
+
* Generate a random secret
|
|
136
|
+
*/
|
|
137
|
+
private generateSecret;
|
|
138
|
+
/**
|
|
139
|
+
* Start the remote server - creates WebSocket server that proxies stdin/stdout
|
|
156
140
|
*/
|
|
157
141
|
start(options?: {
|
|
158
142
|
name?: string;
|
|
143
|
+
processForStreaming?: {
|
|
144
|
+
stdout: NodeJS.WriteStream;
|
|
145
|
+
stdin: NodeJS.ReadStream;
|
|
146
|
+
};
|
|
159
147
|
}): Promise<RemoteSession>;
|
|
148
|
+
/**
|
|
149
|
+
* Setup stdin/stdout proxy to forward to WebSocket clients
|
|
150
|
+
*/
|
|
151
|
+
private setupStdioProxy;
|
|
152
|
+
/**
|
|
153
|
+
* Clean output for mobile display - remove ANSI codes and TUI artifacts
|
|
154
|
+
*/
|
|
155
|
+
private cleanOutputForMobile;
|
|
160
156
|
/**
|
|
161
157
|
* Stop the server
|
|
162
158
|
*/
|
|
@@ -164,6 +160,10 @@ declare class RemoteServer extends EventEmitter {
|
|
|
164
160
|
/**
|
|
165
161
|
* Broadcast message to all authenticated clients
|
|
166
162
|
*/
|
|
163
|
+
private broadcastToAll;
|
|
164
|
+
/**
|
|
165
|
+
* Public broadcast method for compatibility
|
|
166
|
+
*/
|
|
167
167
|
broadcast(message: BroadcastMessage): void;
|
|
168
168
|
/**
|
|
169
169
|
* Send notification to clients
|
|
@@ -182,11 +182,15 @@ declare class RemoteServer extends EventEmitter {
|
|
|
182
182
|
*/
|
|
183
183
|
getConnectedCount(): number;
|
|
184
184
|
/**
|
|
185
|
-
* Write to
|
|
185
|
+
* Write data to all connected clients (for manual output streaming)
|
|
186
|
+
*/
|
|
187
|
+
writeToClients(data: string): void;
|
|
188
|
+
/**
|
|
189
|
+
* Alias for writeToClients - for compatibility
|
|
186
190
|
*/
|
|
187
191
|
writeToTerminal(data: string): void;
|
|
188
192
|
/**
|
|
189
|
-
* Resize terminal
|
|
193
|
+
* Resize terminal (for compatibility - not used in direct streaming mode)
|
|
190
194
|
*/
|
|
191
195
|
resizeTerminal(cols: number, rows: number): void;
|
|
192
196
|
/**
|
|
@@ -229,59 +233,65 @@ declare class RemoteServer extends EventEmitter {
|
|
|
229
233
|
* Generate client ID
|
|
230
234
|
*/
|
|
231
235
|
private generateClientId;
|
|
232
|
-
/**
|
|
233
|
-
* Generate secret
|
|
234
|
-
*/
|
|
235
|
-
private generateSecret;
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
/**
|
|
239
|
-
* @nikcli/remote -
|
|
240
|
-
*
|
|
239
|
+
* @nikcli/remote - Tunnel Manager
|
|
240
|
+
* Provides public URL access via various tunnel providers
|
|
241
241
|
*/
|
|
242
242
|
|
|
243
|
-
interface
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
cwd?: string;
|
|
248
|
-
env?: Record<string, string>;
|
|
243
|
+
interface TunnelResult {
|
|
244
|
+
url: string;
|
|
245
|
+
provider: TunnelProvider;
|
|
246
|
+
close: () => Promise<void>;
|
|
249
247
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
248
|
+
/**
|
|
249
|
+
* Create a tunnel for the given port using the specified provider
|
|
250
|
+
*/
|
|
251
|
+
declare function createTunnel(port: number, provider?: TunnelProvider): Promise<TunnelResult>;
|
|
252
|
+
declare class TunnelManager {
|
|
253
|
+
private provider;
|
|
253
254
|
private process;
|
|
254
|
-
private
|
|
255
|
-
|
|
255
|
+
private url;
|
|
256
|
+
private tunnelInstance;
|
|
257
|
+
constructor(provider: TunnelProvider);
|
|
256
258
|
/**
|
|
257
|
-
*
|
|
259
|
+
* Create tunnel and return public URL
|
|
258
260
|
*/
|
|
259
|
-
|
|
261
|
+
create(port: number): Promise<string>;
|
|
260
262
|
/**
|
|
261
|
-
*
|
|
263
|
+
* Close tunnel
|
|
262
264
|
*/
|
|
263
|
-
|
|
265
|
+
close(): Promise<void>;
|
|
264
266
|
/**
|
|
265
|
-
*
|
|
267
|
+
* Get tunnel URL
|
|
266
268
|
*/
|
|
267
|
-
|
|
269
|
+
getUrl(): string | null;
|
|
268
270
|
/**
|
|
269
|
-
*
|
|
271
|
+
* Create localtunnel
|
|
270
272
|
*/
|
|
271
|
-
|
|
273
|
+
private createLocaltunnel;
|
|
272
274
|
/**
|
|
273
|
-
*
|
|
275
|
+
* Create localtunnel via CLI
|
|
274
276
|
*/
|
|
275
|
-
|
|
277
|
+
private createLocaltunnelCli;
|
|
276
278
|
/**
|
|
277
|
-
*
|
|
279
|
+
* Create cloudflared tunnel
|
|
278
280
|
*/
|
|
279
|
-
|
|
281
|
+
private createCloudflared;
|
|
280
282
|
/**
|
|
281
|
-
*
|
|
283
|
+
* Create ngrok tunnel
|
|
282
284
|
*/
|
|
283
|
-
|
|
285
|
+
private createNgrok;
|
|
284
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Check if a tunnel provider is available
|
|
289
|
+
*/
|
|
290
|
+
declare function checkTunnelAvailability(provider: TunnelProvider): Promise<boolean>;
|
|
291
|
+
/**
|
|
292
|
+
* Find best available tunnel provider
|
|
293
|
+
*/
|
|
294
|
+
declare function findAvailableTunnel(): Promise<TunnelProvider | null>;
|
|
285
295
|
|
|
286
296
|
/**
|
|
287
297
|
* @nikcli/remote - Mobile Web Client
|
|
@@ -289,9 +299,37 @@ declare class TerminalManager extends EventEmitter {
|
|
|
289
299
|
*/
|
|
290
300
|
declare function getWebClient(): string;
|
|
291
301
|
|
|
302
|
+
/**
|
|
303
|
+
* @nikcli/remote - Enterprise Terminal Streaming
|
|
304
|
+
*
|
|
305
|
+
* Direct stdin/stdout streaming for true real-time terminal access.
|
|
306
|
+
* No fake PTY - mobile sees your actual NikCLI terminal.
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* ```typescript
|
|
310
|
+
* import { RemoteServer, createTunnel } from '@nikcli/remote'
|
|
311
|
+
*
|
|
312
|
+
* const server = new RemoteServer()
|
|
313
|
+
* const session = await server.start({
|
|
314
|
+
* name: 'my-terminal',
|
|
315
|
+
* processForStreaming: {
|
|
316
|
+
* stdout: process.stdout,
|
|
317
|
+
* stdin: process.stdin,
|
|
318
|
+
* },
|
|
319
|
+
* })
|
|
320
|
+
*
|
|
321
|
+
* // Create public tunnel
|
|
322
|
+
* const tunnelUrl = await createTunnel(session.port, 'cloudflared')
|
|
323
|
+
* console.log('Access your terminal:', tunnelUrl)
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Create a remote server with streaming in one call
|
|
329
|
+
*/
|
|
292
330
|
declare function createRemoteServer(config?: Partial<ServerConfig>): Promise<{
|
|
293
331
|
server: RemoteServer;
|
|
294
332
|
session: RemoteSession;
|
|
295
333
|
}>;
|
|
296
334
|
|
|
297
|
-
export { type BroadcastMessage, type ClientMessage,
|
|
335
|
+
export { type BroadcastMessage, type ClientMessage, DEFAULT_CONFIG, type DeviceInfo, MessageTypes, type RemoteNotification, RemoteServer, type RemoteServerEvents, type RemoteSession, type ServerConfig, type SessionStatus, TunnelManager, type TunnelProvider, type TunnelResult, checkTunnelAvailability, createRemoteServer, createTunnel, findAvailableTunnel, getWebClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -71,22 +71,6 @@ interface ClientMessage {
|
|
|
71
71
|
type: string;
|
|
72
72
|
[key: string]: unknown;
|
|
73
73
|
}
|
|
74
|
-
interface ServerMessage {
|
|
75
|
-
type: string;
|
|
76
|
-
payload?: unknown;
|
|
77
|
-
timestamp: number;
|
|
78
|
-
}
|
|
79
|
-
interface TerminalData {
|
|
80
|
-
data: string;
|
|
81
|
-
}
|
|
82
|
-
interface TerminalResize {
|
|
83
|
-
cols: number;
|
|
84
|
-
rows: number;
|
|
85
|
-
}
|
|
86
|
-
interface CommandMessage {
|
|
87
|
-
command: string;
|
|
88
|
-
args?: string[];
|
|
89
|
-
}
|
|
90
74
|
interface ClientConnection {
|
|
91
75
|
id: string;
|
|
92
76
|
authenticated: boolean;
|
|
@@ -118,8 +102,8 @@ declare const MessageTypes: {
|
|
|
118
102
|
};
|
|
119
103
|
|
|
120
104
|
/**
|
|
121
|
-
* @nikcli/remote -
|
|
122
|
-
* WebSocket
|
|
105
|
+
* @nikcli/remote - Direct Terminal Streaming Server
|
|
106
|
+
* Proxies NikCLI's stdin/stdout to WebSocket clients for true real-time terminal access
|
|
123
107
|
*/
|
|
124
108
|
|
|
125
109
|
interface RemoteServerEvents {
|
|
@@ -130,13 +114,9 @@ interface RemoteServerEvents {
|
|
|
130
114
|
'client:error': (clientId: string, error: Error) => void;
|
|
131
115
|
'tunnel:connected': (url: string) => void;
|
|
132
116
|
'tunnel:error': (error: Error) => void;
|
|
133
|
-
command: (cmd: {
|
|
134
|
-
clientId: string;
|
|
135
|
-
command: string;
|
|
136
|
-
args?: string[];
|
|
137
|
-
}) => void;
|
|
138
117
|
message: (client: ClientConnection, message: ClientMessage) => void;
|
|
139
118
|
error: (error: Error) => void;
|
|
119
|
+
'terminal:output': (data: string) => void;
|
|
140
120
|
}
|
|
141
121
|
declare class RemoteServer extends EventEmitter {
|
|
142
122
|
private config;
|
|
@@ -144,19 +124,35 @@ declare class RemoteServer extends EventEmitter {
|
|
|
144
124
|
private wss;
|
|
145
125
|
private clients;
|
|
146
126
|
private session;
|
|
147
|
-
private terminal;
|
|
148
|
-
private tunnel;
|
|
149
127
|
private heartbeatTimer;
|
|
150
128
|
private sessionTimeoutTimer;
|
|
151
129
|
private isRunning;
|
|
152
130
|
private sessionSecret;
|
|
131
|
+
private originalStdoutWrite;
|
|
132
|
+
private originalStdinOn;
|
|
153
133
|
constructor(config?: Partial<ServerConfig>);
|
|
154
134
|
/**
|
|
155
|
-
*
|
|
135
|
+
* Generate a random secret
|
|
136
|
+
*/
|
|
137
|
+
private generateSecret;
|
|
138
|
+
/**
|
|
139
|
+
* Start the remote server - creates WebSocket server that proxies stdin/stdout
|
|
156
140
|
*/
|
|
157
141
|
start(options?: {
|
|
158
142
|
name?: string;
|
|
143
|
+
processForStreaming?: {
|
|
144
|
+
stdout: NodeJS.WriteStream;
|
|
145
|
+
stdin: NodeJS.ReadStream;
|
|
146
|
+
};
|
|
159
147
|
}): Promise<RemoteSession>;
|
|
148
|
+
/**
|
|
149
|
+
* Setup stdin/stdout proxy to forward to WebSocket clients
|
|
150
|
+
*/
|
|
151
|
+
private setupStdioProxy;
|
|
152
|
+
/**
|
|
153
|
+
* Clean output for mobile display - remove ANSI codes and TUI artifacts
|
|
154
|
+
*/
|
|
155
|
+
private cleanOutputForMobile;
|
|
160
156
|
/**
|
|
161
157
|
* Stop the server
|
|
162
158
|
*/
|
|
@@ -164,6 +160,10 @@ declare class RemoteServer extends EventEmitter {
|
|
|
164
160
|
/**
|
|
165
161
|
* Broadcast message to all authenticated clients
|
|
166
162
|
*/
|
|
163
|
+
private broadcastToAll;
|
|
164
|
+
/**
|
|
165
|
+
* Public broadcast method for compatibility
|
|
166
|
+
*/
|
|
167
167
|
broadcast(message: BroadcastMessage): void;
|
|
168
168
|
/**
|
|
169
169
|
* Send notification to clients
|
|
@@ -182,11 +182,15 @@ declare class RemoteServer extends EventEmitter {
|
|
|
182
182
|
*/
|
|
183
183
|
getConnectedCount(): number;
|
|
184
184
|
/**
|
|
185
|
-
* Write to
|
|
185
|
+
* Write data to all connected clients (for manual output streaming)
|
|
186
|
+
*/
|
|
187
|
+
writeToClients(data: string): void;
|
|
188
|
+
/**
|
|
189
|
+
* Alias for writeToClients - for compatibility
|
|
186
190
|
*/
|
|
187
191
|
writeToTerminal(data: string): void;
|
|
188
192
|
/**
|
|
189
|
-
* Resize terminal
|
|
193
|
+
* Resize terminal (for compatibility - not used in direct streaming mode)
|
|
190
194
|
*/
|
|
191
195
|
resizeTerminal(cols: number, rows: number): void;
|
|
192
196
|
/**
|
|
@@ -229,59 +233,65 @@ declare class RemoteServer extends EventEmitter {
|
|
|
229
233
|
* Generate client ID
|
|
230
234
|
*/
|
|
231
235
|
private generateClientId;
|
|
232
|
-
/**
|
|
233
|
-
* Generate secret
|
|
234
|
-
*/
|
|
235
|
-
private generateSecret;
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
/**
|
|
239
|
-
* @nikcli/remote -
|
|
240
|
-
*
|
|
239
|
+
* @nikcli/remote - Tunnel Manager
|
|
240
|
+
* Provides public URL access via various tunnel providers
|
|
241
241
|
*/
|
|
242
242
|
|
|
243
|
-
interface
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
cwd?: string;
|
|
248
|
-
env?: Record<string, string>;
|
|
243
|
+
interface TunnelResult {
|
|
244
|
+
url: string;
|
|
245
|
+
provider: TunnelProvider;
|
|
246
|
+
close: () => Promise<void>;
|
|
249
247
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
248
|
+
/**
|
|
249
|
+
* Create a tunnel for the given port using the specified provider
|
|
250
|
+
*/
|
|
251
|
+
declare function createTunnel(port: number, provider?: TunnelProvider): Promise<TunnelResult>;
|
|
252
|
+
declare class TunnelManager {
|
|
253
|
+
private provider;
|
|
253
254
|
private process;
|
|
254
|
-
private
|
|
255
|
-
|
|
255
|
+
private url;
|
|
256
|
+
private tunnelInstance;
|
|
257
|
+
constructor(provider: TunnelProvider);
|
|
256
258
|
/**
|
|
257
|
-
*
|
|
259
|
+
* Create tunnel and return public URL
|
|
258
260
|
*/
|
|
259
|
-
|
|
261
|
+
create(port: number): Promise<string>;
|
|
260
262
|
/**
|
|
261
|
-
*
|
|
263
|
+
* Close tunnel
|
|
262
264
|
*/
|
|
263
|
-
|
|
265
|
+
close(): Promise<void>;
|
|
264
266
|
/**
|
|
265
|
-
*
|
|
267
|
+
* Get tunnel URL
|
|
266
268
|
*/
|
|
267
|
-
|
|
269
|
+
getUrl(): string | null;
|
|
268
270
|
/**
|
|
269
|
-
*
|
|
271
|
+
* Create localtunnel
|
|
270
272
|
*/
|
|
271
|
-
|
|
273
|
+
private createLocaltunnel;
|
|
272
274
|
/**
|
|
273
|
-
*
|
|
275
|
+
* Create localtunnel via CLI
|
|
274
276
|
*/
|
|
275
|
-
|
|
277
|
+
private createLocaltunnelCli;
|
|
276
278
|
/**
|
|
277
|
-
*
|
|
279
|
+
* Create cloudflared tunnel
|
|
278
280
|
*/
|
|
279
|
-
|
|
281
|
+
private createCloudflared;
|
|
280
282
|
/**
|
|
281
|
-
*
|
|
283
|
+
* Create ngrok tunnel
|
|
282
284
|
*/
|
|
283
|
-
|
|
285
|
+
private createNgrok;
|
|
284
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Check if a tunnel provider is available
|
|
289
|
+
*/
|
|
290
|
+
declare function checkTunnelAvailability(provider: TunnelProvider): Promise<boolean>;
|
|
291
|
+
/**
|
|
292
|
+
* Find best available tunnel provider
|
|
293
|
+
*/
|
|
294
|
+
declare function findAvailableTunnel(): Promise<TunnelProvider | null>;
|
|
285
295
|
|
|
286
296
|
/**
|
|
287
297
|
* @nikcli/remote - Mobile Web Client
|
|
@@ -289,9 +299,37 @@ declare class TerminalManager extends EventEmitter {
|
|
|
289
299
|
*/
|
|
290
300
|
declare function getWebClient(): string;
|
|
291
301
|
|
|
302
|
+
/**
|
|
303
|
+
* @nikcli/remote - Enterprise Terminal Streaming
|
|
304
|
+
*
|
|
305
|
+
* Direct stdin/stdout streaming for true real-time terminal access.
|
|
306
|
+
* No fake PTY - mobile sees your actual NikCLI terminal.
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* ```typescript
|
|
310
|
+
* import { RemoteServer, createTunnel } from '@nikcli/remote'
|
|
311
|
+
*
|
|
312
|
+
* const server = new RemoteServer()
|
|
313
|
+
* const session = await server.start({
|
|
314
|
+
* name: 'my-terminal',
|
|
315
|
+
* processForStreaming: {
|
|
316
|
+
* stdout: process.stdout,
|
|
317
|
+
* stdin: process.stdin,
|
|
318
|
+
* },
|
|
319
|
+
* })
|
|
320
|
+
*
|
|
321
|
+
* // Create public tunnel
|
|
322
|
+
* const tunnelUrl = await createTunnel(session.port, 'cloudflared')
|
|
323
|
+
* console.log('Access your terminal:', tunnelUrl)
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Create a remote server with streaming in one call
|
|
329
|
+
*/
|
|
292
330
|
declare function createRemoteServer(config?: Partial<ServerConfig>): Promise<{
|
|
293
331
|
server: RemoteServer;
|
|
294
332
|
session: RemoteSession;
|
|
295
333
|
}>;
|
|
296
334
|
|
|
297
|
-
export { type BroadcastMessage, type ClientMessage,
|
|
335
|
+
export { type BroadcastMessage, type ClientMessage, DEFAULT_CONFIG, type DeviceInfo, MessageTypes, type RemoteNotification, RemoteServer, type RemoteServerEvents, type RemoteSession, type ServerConfig, type SessionStatus, TunnelManager, type TunnelProvider, type TunnelResult, checkTunnelAvailability, createRemoteServer, createTunnel, findAvailableTunnel, getWebClient };
|