@feng3d/cts 0.0.6

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.
@@ -0,0 +1,475 @@
1
+ /**
2
+ * @module unified-proxy
3
+ * @description 统一代理处理器模块,在指定端口上同时支持 HTTP 和 WebSocket 代理。
4
+ * 将外部 HTTP/WebSocket 请求转发给穿透客户端,实现双向数据转发。
5
+ */
6
+ import { Server as HttpServer } from 'http';
7
+ import { WebSocket, WebSocketServer } from 'ws';
8
+ import { v4 as uuidv4 } from 'uuid';
9
+ import { MessageType, createMessage, logger } from '@feng3d/chuantou-shared';
10
+ /**
11
+ * 统一代理处理器
12
+ *
13
+ * 管理多个代理服务器实例,每个代理监听一个独立端口,
14
+ * 同时支持 HTTP 请求和 WebSocket 升级请求。
15
+ * 当外部请求到达代理端口时,将请求信息通过控制通道转发给对应的穿透客户端。
16
+ */
17
+ export class UnifiedProxyHandler {
18
+ /**
19
+ * 创建统一代理处理器实例
20
+ *
21
+ * @param sessionManager - 会话管理器,用于获取客户端连接和管理连接记录
22
+ */
23
+ constructor(sessionManager) {
24
+ /**
25
+ * 待处理响应映射表
26
+ *
27
+ * 存储等待客户端响应的 Promise 回调和超时定时器,键为连接 ID。
28
+ */
29
+ this.pendingResponses = new Map();
30
+ /**
31
+ * 用户 WebSocket 连接映射表
32
+ *
33
+ * 存储外部用户的 WebSocket 连接,键为连接 ID,值为用户的 WebSocket 实例。
34
+ */
35
+ this.userConnections = new Map();
36
+ /**
37
+ * 流式 HTTP 响应映射表
38
+ *
39
+ * 存储正在进行的流式响应(如 SSE)的响应对象。
40
+ */
41
+ this.streamingResponses = new Map();
42
+ this.sessionManager = sessionManager;
43
+ this.proxies = new Map();
44
+ this.wsServers = new Map();
45
+ }
46
+ /**
47
+ * 启动代理服务器
48
+ *
49
+ * 在指定端口创建并启动一个 HTTP 服务器,该端口同时支持 HTTP 请求和 WebSocket 升级。
50
+ * 若该端口已存在代理或端口被占用,将抛出异常。
51
+ *
52
+ * @param port - 代理监听的端口号
53
+ * @param clientId - 绑定的客户端唯一标识 ID
54
+ * @returns 代理服务器启动完成的 Promise
55
+ * @throws 端口已存在代理或端口被占用时抛出错误
56
+ */
57
+ async startProxy(port, clientId) {
58
+ if (this.proxies.has(port)) {
59
+ throw new Error(`端口 ${port} 的代理已存在`);
60
+ }
61
+ const server = new HttpServer();
62
+ // 处理 HTTP 请求
63
+ server.on('request', async (req, res) => {
64
+ await this.handleHttpRequest(clientId, req, res);
65
+ });
66
+ // 处理 WebSocket 升级请求
67
+ server.on('upgrade', async (req, socket, head) => {
68
+ await this.handleWebSocketUpgrade(clientId, req, socket, head);
69
+ });
70
+ server.on('error', (error) => {
71
+ logger.error(`代理在端口 ${port} 上发生错误:`, error);
72
+ });
73
+ return new Promise((resolve, reject) => {
74
+ server.listen(port, () => {
75
+ logger.log(`代理正在端口 ${port} 上监听(HTTP + WebSocket),绑定客户端 ${clientId}`);
76
+ this.proxies.set(port, server);
77
+ resolve();
78
+ });
79
+ server.on('error', (error) => {
80
+ if (error.code === 'EADDRINUSE') {
81
+ reject(new Error(`端口 ${port} 已被占用`));
82
+ }
83
+ else {
84
+ reject(error);
85
+ }
86
+ });
87
+ });
88
+ }
89
+ /**
90
+ * 处理外部 HTTP 请求
91
+ *
92
+ * 将外部 HTTP 请求封装为消息发送给穿透客户端,等待客户端处理后返回响应。
93
+ * 支持流式响应(如 SSE)和普通 HTTP 响应。
94
+ *
95
+ * @param clientId - 处理该请求的客户端唯一标识 ID
96
+ * @param req - 收到的 HTTP 请求对象
97
+ * @param res - 用于发送响应的 HTTP 响应对象
98
+ */
99
+ async handleHttpRequest(clientId, req, res) {
100
+ const connectionId = uuidv4();
101
+ const clientSocket = this.sessionManager.getClientSocket(clientId);
102
+ if (!clientSocket || clientSocket.readyState !== WebSocket.OPEN) {
103
+ res.writeHead(502, { 'Content-Type': 'text/plain; charset=utf-8' });
104
+ res.end('网关错误:客户端未连接');
105
+ return;
106
+ }
107
+ // 记录连接
108
+ this.sessionManager.addConnection(clientId, connectionId, req.socket.remoteAddress || '', 'http');
109
+ logger.log(`HTTP 请求: ${req.method} ${req.url} -> 客户端 ${clientId} (${connectionId})`);
110
+ try {
111
+ // 构建请求头
112
+ const headers = {};
113
+ for (const [key, value] of Object.entries(req.headers)) {
114
+ if (value !== undefined) {
115
+ headers[key] = Array.isArray(value) ? value.join(', ') : value;
116
+ }
117
+ }
118
+ // 读取请求体
119
+ let body;
120
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
121
+ body = await this.readRequestBody(req);
122
+ }
123
+ // 发送新连接消息给客户端
124
+ const newConnMsg = createMessage(MessageType.NEW_CONNECTION, {
125
+ connectionId,
126
+ protocol: 'http',
127
+ method: req.method,
128
+ url: req.url || '/',
129
+ headers,
130
+ body: body?.toString('base64'),
131
+ });
132
+ clientSocket.send(JSON.stringify(newConnMsg));
133
+ // 等待客户端响应头(第一个消息)
134
+ const firstResponse = await this.waitForResponse(connectionId, clientId);
135
+ // 检查是否为流式响应(仅根据 Content-Type 判断)
136
+ const contentType = String(firstResponse.headers['content-type'] || '').toLowerCase();
137
+ const isStreaming = contentType.includes('text/event-stream') ||
138
+ contentType.includes('stream');
139
+ if (isStreaming) {
140
+ // 流式响应模式(SSE)
141
+ logger.log(`HTTP 流式响应: ${req.url} (${connectionId})`);
142
+ this.streamingResponses.set(connectionId, res);
143
+ // 发送响应头
144
+ res.writeHead(firstResponse.statusCode, firstResponse.headers);
145
+ res.flushHeaders();
146
+ // 如果有初始 body,先发送
147
+ if (firstResponse.body) {
148
+ const bodyBuffer = Buffer.isBuffer(firstResponse.body)
149
+ ? firstResponse.body
150
+ : Buffer.from(firstResponse.body, 'base64');
151
+ res.write(bodyBuffer);
152
+ }
153
+ // 等待流结束,不清理连接(由流结束事件处理)
154
+ this.pendingResponses.delete(connectionId);
155
+ }
156
+ else {
157
+ // 普通 HTTP 响应模式
158
+ res.writeHead(firstResponse.statusCode, firstResponse.headers);
159
+ if (firstResponse.body) {
160
+ const bodyBuffer = Buffer.isBuffer(firstResponse.body)
161
+ ? firstResponse.body
162
+ : Buffer.from(firstResponse.body, 'base64');
163
+ res.end(bodyBuffer);
164
+ }
165
+ else {
166
+ res.end();
167
+ }
168
+ logger.log(`HTTP 响应: ${firstResponse.statusCode},连接 ${connectionId}`);
169
+ // 清理连接
170
+ this.sessionManager.removeConnection(connectionId);
171
+ this.pendingResponses.delete(connectionId);
172
+ }
173
+ }
174
+ catch (error) {
175
+ logger.error(`处理 HTTP 请求 ${connectionId} 时出错:`, error);
176
+ if (!res.headersSent) {
177
+ res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
178
+ res.end('服务器内部错误');
179
+ }
180
+ // 清理连接
181
+ this.sessionManager.removeConnection(connectionId);
182
+ this.pendingResponses.delete(connectionId);
183
+ this.streamingResponses.delete(connectionId);
184
+ }
185
+ }
186
+ /**
187
+ * 处理 WebSocket 升级请求
188
+ *
189
+ * 将外部 WebSocket 连接桥接到穿透客户端,实现双向实时数据转发。
190
+ *
191
+ * @param clientId - 处理该连接的客户端唯一标识 ID
192
+ * @param req - HTTP 升级请求对象
193
+ * @param socket - 底层 socket 连接
194
+ * @param head - 升级请求的头部 buffer
195
+ */
196
+ async handleWebSocketUpgrade(clientId, req, socket, head) {
197
+ const connectionId = uuidv4();
198
+ const clientSocket = this.sessionManager.getClientSocket(clientId);
199
+ if (!clientSocket || clientSocket.readyState !== WebSocket.OPEN) {
200
+ socket.write('HTTP/1.1 502 Bad Gateway\r\n\r\n');
201
+ socket.destroy();
202
+ return;
203
+ }
204
+ // 记录连接
205
+ this.sessionManager.addConnection(clientId, connectionId, req.socket.remoteAddress || '', 'websocket');
206
+ logger.log(`WebSocket 升级: ${req.url} -> 客户端 ${clientId} (${connectionId})`);
207
+ // 构建 WebSocket 服务器处理此连接
208
+ const wsServer = new WebSocketServer({ noServer: true });
209
+ wsServer.handleUpgrade(req, socket, head, (ws) => {
210
+ this.handleWebSocketConnection(clientId, connectionId, ws, req);
211
+ });
212
+ }
213
+ /**
214
+ * 处理 WebSocket 连接
215
+ *
216
+ * 当外部用户连接到代理端口时,记录连接信息,通知穿透客户端有新连接到来,
217
+ * 并设置消息转发、关闭和错误的事件处理。
218
+ *
219
+ * @param clientId - 处理该连接的客户端唯一标识 ID
220
+ * @param connectionId - 连接唯一标识 ID
221
+ * @param userWs - 外部用户的 WebSocket 连接
222
+ * @param req - HTTP 升级请求对象
223
+ */
224
+ handleWebSocketConnection(clientId, connectionId, userWs, req) {
225
+ const clientSocket = this.sessionManager.getClientSocket(clientId);
226
+ if (!clientSocket || clientSocket.readyState !== WebSocket.OPEN) {
227
+ userWs.close(1011, '客户端未连接');
228
+ return;
229
+ }
230
+ logger.log(`WebSocket 连接已建立: ${req.url} (${connectionId})`);
231
+ // 存储用户 WebSocket 引用
232
+ this.userConnections.set(connectionId, userWs);
233
+ // 构建请求头
234
+ const headers = {};
235
+ for (const [key, value] of Object.entries(req.headers)) {
236
+ if (value !== undefined) {
237
+ headers[key] = Array.isArray(value) ? value.join(', ') : value;
238
+ }
239
+ }
240
+ // 发送新连接消息给客户端
241
+ const newConnMsg = createMessage(MessageType.NEW_CONNECTION, {
242
+ connectionId,
243
+ protocol: 'websocket',
244
+ url: req.url || '/',
245
+ wsHeaders: headers,
246
+ });
247
+ clientSocket.send(JSON.stringify(newConnMsg));
248
+ // 处理来自用户的消息
249
+ userWs.on('message', (data) => {
250
+ this.forwardToClient(clientId, connectionId, data);
251
+ });
252
+ // 处理来自用户关闭
253
+ userWs.on('close', (code, reason) => {
254
+ logger.log(`用户 WebSocket 已关闭: ${connectionId} (${code})`);
255
+ this.notifyClientClose(clientId, connectionId, code);
256
+ this.cleanupConnection(connectionId);
257
+ });
258
+ // 处理错误
259
+ userWs.on('error', (error) => {
260
+ logger.error(`用户 WebSocket 错误 ${connectionId}:`, error);
261
+ this.cleanupConnection(connectionId);
262
+ });
263
+ }
264
+ /**
265
+ * 将用户消息转发到穿透客户端
266
+ *
267
+ * 将外部用户发送的 WebSocket 数据编码为 Base64 后,通过控制通道发送给穿透客户端。
268
+ *
269
+ * @param clientId - 目标客户端唯一标识 ID
270
+ * @param connectionId - 连接唯一标识 ID
271
+ * @param data - 用户发送的原始数据
272
+ */
273
+ forwardToClient(clientId, connectionId, data) {
274
+ const clientSocket = this.sessionManager.getClientSocket(clientId);
275
+ if (clientSocket && clientSocket.readyState === WebSocket.OPEN) {
276
+ clientSocket.send(JSON.stringify({
277
+ type: 'connection_data',
278
+ connectionId,
279
+ data: data.toString('base64'),
280
+ }));
281
+ }
282
+ }
283
+ /**
284
+ * 通知穿透客户端连接已关闭
285
+ *
286
+ * 当外部用户的 WebSocket 连接关闭时,向穿透客户端发送连接关闭通知消息。
287
+ *
288
+ * @param clientId - 目标客户端唯一标识 ID
289
+ * @param connectionId - 已关闭的连接唯一标识 ID
290
+ * @param code - WebSocket 关闭状态码
291
+ */
292
+ notifyClientClose(clientId, connectionId, code) {
293
+ const clientSocket = this.sessionManager.getClientSocket(clientId);
294
+ if (clientSocket && clientSocket.readyState === WebSocket.OPEN) {
295
+ const closeMsg = createMessage(MessageType.CONNECTION_CLOSE, {
296
+ connectionId,
297
+ });
298
+ clientSocket.send(JSON.stringify(closeMsg));
299
+ }
300
+ }
301
+ /**
302
+ * 等待客户端响应
303
+ *
304
+ * 创建一个 Promise,等待穿透客户端处理完请求并返回响应数据。
305
+ * 若超过 30 秒未收到响应,将自动超时并拒绝 Promise。
306
+ *
307
+ * @param connectionId - 连接唯一标识 ID
308
+ * @param clientId - 客户端唯一标识 ID
309
+ * @returns 客户端返回的 HTTP 响应数据
310
+ */
311
+ waitForResponse(connectionId, clientId) {
312
+ return new Promise((resolve, reject) => {
313
+ const timeout = setTimeout(() => {
314
+ this.pendingResponses.delete(connectionId);
315
+ reject(new Error('响应超时'));
316
+ }, 30000); // 30秒超时
317
+ this.pendingResponses.set(connectionId, { resolve, reject, timeout });
318
+ });
319
+ }
320
+ /**
321
+ * 读取 HTTP 请求体
322
+ *
323
+ * 从 IncomingMessage 流中读取完整的请求体数据。
324
+ *
325
+ * @param req - HTTP 请求对象
326
+ * @returns 包含完整请求体的 Buffer
327
+ */
328
+ readRequestBody(req) {
329
+ return new Promise((resolve, reject) => {
330
+ const chunks = [];
331
+ req.on('data', (chunk) => {
332
+ chunks.push(chunk);
333
+ });
334
+ req.on('end', () => {
335
+ resolve(Buffer.concat(chunks));
336
+ });
337
+ req.on('error', reject);
338
+ });
339
+ }
340
+ /**
341
+ * 处理穿透客户端返回的响应数据
342
+ *
343
+ * 接收客户端处理完请求后返回的 HTTP 响应数据,清除超时定时器并解析对应的待处理 Promise。
344
+ *
345
+ * @param connectionId - 连接唯一标识 ID
346
+ * @param data - 客户端返回的原始响应消息对象,包含 statusCode, headers, body 等字段
347
+ */
348
+ handleClientResponse(connectionId, data) {
349
+ const pending = this.pendingResponses.get(connectionId);
350
+ if (pending) {
351
+ clearTimeout(pending.timeout);
352
+ this.pendingResponses.delete(connectionId);
353
+ // 提取需要的响应字段
354
+ const responseData = {
355
+ statusCode: data.statusCode || 200,
356
+ headers: data.headers || {},
357
+ body: data.body,
358
+ };
359
+ pending.resolve(responseData);
360
+ }
361
+ }
362
+ /**
363
+ * 处理来自穿透客户端的数据
364
+ *
365
+ * 将穿透客户端发送的数据转发给对应的外部用户 WebSocket 连接。
366
+ *
367
+ * @param connectionId - 连接唯一标识 ID
368
+ * @param data - 穿透客户端发送的数据
369
+ */
370
+ handleClientData(connectionId, data) {
371
+ const userWs = this.userConnections.get(connectionId);
372
+ if (userWs && userWs.readyState === WebSocket.OPEN) {
373
+ userWs.send(data);
374
+ }
375
+ }
376
+ /**
377
+ * 处理来自穿透客户端的关闭请求
378
+ *
379
+ * 当穿透客户端请求关闭某个连接时,关闭对应的外部用户 WebSocket 连接并清理资源。
380
+ *
381
+ * @param connectionId - 需要关闭的连接唯一标识 ID
382
+ * @param code - 可选的 WebSocket 关闭状态码,默认为 1000(正常关闭)
383
+ */
384
+ handleClientClose(connectionId, code) {
385
+ const userWs = this.userConnections.get(connectionId);
386
+ if (userWs) {
387
+ userWs.close(code || 1000);
388
+ }
389
+ this.cleanupConnection(connectionId);
390
+ }
391
+ /**
392
+ * 清理连接资源
393
+ *
394
+ * 从用户连接映射表和会话管理器中移除指定连接的记录。
395
+ *
396
+ * @param connectionId - 需要清理的连接唯一标识 ID
397
+ */
398
+ cleanupConnection(connectionId) {
399
+ this.userConnections.delete(connectionId);
400
+ this.streamingResponses.delete(connectionId);
401
+ this.sessionManager.removeConnection(connectionId);
402
+ }
403
+ /**
404
+ * 处理来自客户端的流式响应数据
405
+ *
406
+ * 将客户端发送的流式数据(如 SSE 事件)转发给对应的外部 HTTP 连接。
407
+ *
408
+ * @param connectionId - 连接唯一标识 ID
409
+ * @param data - 客户端发送的流式数据
410
+ */
411
+ handleClientStreamData(connectionId, data) {
412
+ const res = this.streamingResponses.get(connectionId);
413
+ if (res && !res.writableEnded) {
414
+ res.write(data);
415
+ }
416
+ }
417
+ /**
418
+ * 处理来自客户端的流式响应结束通知
419
+ *
420
+ * 当客户端通知流式响应结束时,关闭外部 HTTP 连接并清理资源。
421
+ *
422
+ * @param connectionId - 连接唯一标识 ID
423
+ */
424
+ handleClientStreamEnd(connectionId) {
425
+ const res = this.streamingResponses.get(connectionId);
426
+ if (res && !res.writableEnded) {
427
+ res.end();
428
+ }
429
+ logger.log(`流式响应结束: ${connectionId}`);
430
+ this.cleanupConnection(connectionId);
431
+ }
432
+ /**
433
+ * 停止指定端口的代理服务器
434
+ *
435
+ * 关闭指定端口上的代理服务器并从映射表中移除。
436
+ *
437
+ * @param port - 需要停止的代理端口号
438
+ * @returns 代理服务器关闭完成的 Promise
439
+ */
440
+ async stopProxy(port) {
441
+ const server = this.proxies.get(port);
442
+ if (server) {
443
+ return new Promise((resolve) => {
444
+ server.close(() => {
445
+ logger.log(`代理已在端口 ${port} 上停止`);
446
+ this.proxies.delete(port);
447
+ resolve();
448
+ });
449
+ });
450
+ }
451
+ }
452
+ /**
453
+ * 停止所有代理服务器
454
+ *
455
+ * 并行关闭所有已启动的代理服务器。
456
+ *
457
+ * @returns 所有代理服务器关闭完成的 Promise
458
+ */
459
+ async stopAll() {
460
+ const stopPromises = [];
461
+ for (const [port] of this.proxies) {
462
+ stopPromises.push(this.stopProxy(port));
463
+ }
464
+ await Promise.all(stopPromises);
465
+ }
466
+ /**
467
+ * 获取所有活跃代理的端口列表
468
+ *
469
+ * @returns 当前正在运行的所有代理端口号数组
470
+ */
471
+ getActivePorts() {
472
+ return Array.from(this.proxies.keys());
473
+ }
474
+ }
475
+ //# sourceMappingURL=unified-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-proxy.js","sourceRoot":"","sources":["../../src/handlers/unified-proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAmC,MAAM,MAAM,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAkE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAG7I;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IAoC9B;;;;OAIG;IACH,YAAY,cAA8B;QAjC1C;;;;WAIG;QACK,qBAAgB,GAOnB,IAAI,GAAG,EAAE,CAAC;QAEf;;;;WAIG;QACK,oBAAe,GAA2B,IAAI,GAAG,EAAE,CAAC;QAE5D;;;;WAIG;QACK,uBAAkB,GAAgC,IAAI,GAAG,EAAE,CAAC;QAQlE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,QAAgB;QAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAEhC,aAAa;QACb,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;YACvE,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAoB,EAAE,MAAW,EAAE,IAAY,EAAE,EAAE;YAC7E,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;gBACvB,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,gCAAgC,QAAQ,EAAE,CAAC,CAAC;gBACrE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;gBAClD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,GAAoB,EAAE,GAAmB;QACzF,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAChE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,OAAO;QACP,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAElG,MAAM,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,QAAQ,KAAK,YAAY,GAAG,CAAC,CAAC;QAErF,IAAI,CAAC;YACH,QAAQ;YACR,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACjE,CAAC;YACH,CAAC;YAED,QAAQ;YACR,IAAI,IAAwB,CAAC;YAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAClD,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;YAED,cAAc;YACd,MAAM,UAAU,GAAyB,aAAa,CAAC,WAAW,CAAC,cAAc,EAAE;gBACjF,YAAY;gBACZ,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG;gBACnB,OAAO;gBACP,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;aAC/B,CAAC,CAAC;YAEH,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAE9C,kBAAkB;YAClB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAEzE,iCAAiC;YACjC,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACtF,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAC1C,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAElD,IAAI,WAAW,EAAE,CAAC;gBAChB,cAAc;gBACd,MAAM,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC;gBACtD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBAE/C,QAAQ;gBACR,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC/D,GAAG,CAAC,YAAY,EAAE,CAAC;gBAEnB,iBAAiB;gBACjB,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;oBACvB,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;wBACpD,CAAC,CAAC,aAAa,CAAC,IAAI;wBACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC9C,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;gBAED,wBAAwB;gBACxB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC/D,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;oBACvB,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;wBACpD,CAAC,CAAC,aAAa,CAAC,IAAI;wBACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC9C,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,CAAC;gBAED,MAAM,CAAC,GAAG,CAAC,YAAY,aAAa,CAAC,UAAU,OAAO,YAAY,EAAE,CAAC,CAAC;gBAEtE,OAAO;gBACP,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBACnD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,cAAc,YAAY,OAAO,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBACpE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;YACD,OAAO;YACP,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,sBAAsB,CAAC,QAAgB,EAAE,GAAoB,EAAE,MAAW,EAAE,IAAY;QACpG,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,OAAO;QACP,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;QAEvG,MAAM,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,GAAG,WAAW,QAAQ,KAAK,YAAY,GAAG,CAAC,CAAC;QAE5E,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAa,EAAE,EAAE;YAC1D,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACK,yBAAyB,CAAC,QAAgB,EAAE,YAAoB,EAAE,MAAiB,EAAE,GAAoB;QAC/G,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC;QAE5D,oBAAoB;QACpB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE/C,QAAQ;QACR,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,KAAgB,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,cAAc;QACd,MAAM,UAAU,GAAyB,aAAa,CAAC,WAAW,CAAC,cAAc,EAAE;YACjF,YAAY;YACZ,QAAQ,EAAE,WAAW;YACrB,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG;YACnB,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QAEH,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAE9C,YAAY;QACZ,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;YACpC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,WAAW;QACX,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;YAClD,MAAM,CAAC,GAAG,CAAC,qBAAqB,YAAY,KAAK,IAAI,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACK,eAAe,CAAC,QAAgB,EAAE,YAAoB,EAAE,IAAY;QAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC/D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC/B,IAAI,EAAE,iBAAiB;gBACvB,YAAY;gBACZ,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAC9B,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,iBAAiB,CAAC,QAAgB,EAAE,YAAoB,EAAE,IAAY;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAA2B,aAAa,CAAC,WAAW,CAAC,gBAAgB,EAAE;gBACnF,YAAY;aACb,CAAC,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,eAAe,CAAC,YAAoB,EAAE,QAAgB;QAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ;YAEnB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACK,eAAe,CAAC,GAAoB;QAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,oBAAoB,CAAC,YAAoB,EAAE,IAAS;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,YAAY;YACZ,MAAM,YAAY,GAAqB;gBACrC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,GAAG;gBAClC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,gBAAgB,CAAC,YAAoB,EAAE,IAAY;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,YAAoB,EAAE,IAAa;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CAAC,YAAoB;QAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB,CAAC,YAAoB,EAAE,IAAY;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,YAAoB;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,WAAW,YAAY,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBAChB,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC;oBACjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC1B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,YAAY,GAAoB,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @module index
3
+ * @description 穿透服务端公共 API 入口模块。
4
+ * 提供便捷的 start、status、stop 函数,以及核心类和类型的导出。
5
+ * 外部使用者可直接通过此模块快速启动、查询和停止转发服务器。
6
+ */
7
+ import { ServerConfig } from '@feng3d/chuantou-shared';
8
+ import { ForwardServer, ServerStatus } from './server.js';
9
+ export { ForwardServer } from './server.js';
10
+ export type { ServerStatus } from './server.js';
11
+ export { SessionManager } from './session-manager.js';
12
+ export type { ServerConfig } from '@feng3d/chuantou-shared';
13
+ /**
14
+ * 启动转发服务器
15
+ *
16
+ * 创建一个 {@link ForwardServer} 实例并启动,是最常用的快捷启动方式。
17
+ *
18
+ * @param options - 可选的服务器配置项,未提供的字段将使用默认值
19
+ * @returns 已启动的 {@link ForwardServer} 实例
20
+ */
21
+ export declare function start(options?: Partial<ServerConfig>): Promise<ForwardServer>;
22
+ /**
23
+ * 查询服务器状态
24
+ *
25
+ * 获取指定转发服务器的当前运行状态信息。
26
+ *
27
+ * @param server - 需要查询状态的 {@link ForwardServer} 实例
28
+ * @returns 包含服务器运行状态的 {@link ServerStatus} 对象
29
+ */
30
+ export declare function status(server: ForwardServer): ServerStatus;
31
+ /**
32
+ * 停止服务器
33
+ *
34
+ * 优雅地停止指定的转发服务器,释放所有资源。
35
+ *
36
+ * @param server - 需要停止的 {@link ForwardServer} 实例
37
+ * @returns 服务器完全停止后的 Promise
38
+ */
39
+ export declare function stop(server: ForwardServer): Promise<void>;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;;;;GAOG;AACH,wBAAsB,KAAK,CAAC,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAIvF;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAE1D;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @module index
3
+ * @description 穿透服务端公共 API 入口模块。
4
+ * 提供便捷的 start、status、stop 函数,以及核心类和类型的导出。
5
+ * 外部使用者可直接通过此模块快速启动、查询和停止转发服务器。
6
+ */
7
+ import { ForwardServer } from './server.js';
8
+ export { ForwardServer } from './server.js';
9
+ export { SessionManager } from './session-manager.js';
10
+ /**
11
+ * 启动转发服务器
12
+ *
13
+ * 创建一个 {@link ForwardServer} 实例并启动,是最常用的快捷启动方式。
14
+ *
15
+ * @param options - 可选的服务器配置项,未提供的字段将使用默认值
16
+ * @returns 已启动的 {@link ForwardServer} 实例
17
+ */
18
+ export async function start(options = {}) {
19
+ const server = new ForwardServer(options);
20
+ await server.start();
21
+ return server;
22
+ }
23
+ /**
24
+ * 查询服务器状态
25
+ *
26
+ * 获取指定转发服务器的当前运行状态信息。
27
+ *
28
+ * @param server - 需要查询状态的 {@link ForwardServer} 实例
29
+ * @returns 包含服务器运行状态的 {@link ServerStatus} 对象
30
+ */
31
+ export function status(server) {
32
+ return server.getStatus();
33
+ }
34
+ /**
35
+ * 停止服务器
36
+ *
37
+ * 优雅地停止指定的转发服务器,释放所有资源。
38
+ *
39
+ * @param server - 需要停止的 {@link ForwardServer} 实例
40
+ * @returns 服务器完全停止后的 Promise
41
+ */
42
+ export async function stop(server) {
43
+ await server.stop();
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAiC,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAqB;IAC9C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}