@feng3d/chuantou-shared 0.0.5 → 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.
- package/README.md +5 -11
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +35 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +56 -0
- package/dist/logger.js.map +1 -0
- package/dist/messages.d.ts +143 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +61 -5
- package/dist/messages.js.map +1 -1
- package/dist/protocol.d.ts +97 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +63 -17
- package/dist/protocol.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,18 +23,9 @@ import { MessageType, ProxyConfig, ClientConfig } from '@feng3d/chuantou-shared'
|
|
|
23
23
|
// 创建代理配置
|
|
24
24
|
const proxyConfig: ProxyConfig = {
|
|
25
25
|
remotePort: 8080,
|
|
26
|
-
protocol: 'http',
|
|
27
26
|
localPort: 3000,
|
|
28
27
|
localHost: 'localhost'
|
|
29
28
|
};
|
|
30
|
-
|
|
31
|
-
// 创建消息
|
|
32
|
-
const message = createMessage(MessageType.REGISTER, {
|
|
33
|
-
remotePort: 8080,
|
|
34
|
-
protocol: 'http',
|
|
35
|
-
localPort: 3000,
|
|
36
|
-
localHost: 'localhost'
|
|
37
|
-
});
|
|
38
29
|
```
|
|
39
30
|
|
|
40
31
|
## 类型
|
|
@@ -46,12 +37,15 @@ const message = createMessage(MessageType.REGISTER, {
|
|
|
46
37
|
```typescript
|
|
47
38
|
interface ProxyConfig {
|
|
48
39
|
remotePort: number; // 公网端口
|
|
49
|
-
protocol: 'http' | 'websocket'; // 协议类型
|
|
50
40
|
localPort: number; // 本地端口
|
|
51
|
-
localHost?: string; //
|
|
41
|
+
localHost?: string; // 本地地址(默认:localhost)
|
|
52
42
|
}
|
|
53
43
|
```
|
|
54
44
|
|
|
45
|
+
**推荐**:本地地址为 localhost 时推荐省略,使用 `8080:3000` 而非 `8080:3000:localhost`。
|
|
46
|
+
|
|
47
|
+
每个代理端口同时支持 HTTP 和 WebSocket 协议,无需单独指定协议类型。
|
|
48
|
+
|
|
55
49
|
### ClientConfig
|
|
56
50
|
|
|
57
51
|
客户端配置接口:
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module shared
|
|
3
|
+
*
|
|
4
|
+
* 穿透代理共享模块入口。
|
|
5
|
+
*
|
|
6
|
+
* 本模块统一导出穿透代理系统中客户端与服务端共用的所有类型定义、
|
|
7
|
+
* 消息结构、协议常量和工具函数,作为 `@chuantou/shared` 包的公共 API 入口。
|
|
8
|
+
*/
|
|
9
|
+
/** 导出所有消息类型、消息接口及消息工具函数 */
|
|
1
10
|
export * from './messages.js';
|
|
11
|
+
/** 导出协议常量、错误码、默认配置及各类配置接口 */
|
|
2
12
|
export * from './protocol.js';
|
|
13
|
+
/** 导出日志工具 */
|
|
14
|
+
export * from './logger.js';
|
|
3
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,cAAc,eAAe,CAAC;AAC9B,6BAA6B;AAC7B,cAAc,eAAe,CAAC;AAC9B,aAAa;AACb,cAAc,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @module shared
|
|
3
|
+
*
|
|
4
|
+
* 穿透代理共享模块入口。
|
|
5
|
+
*
|
|
6
|
+
* 本模块统一导出穿透代理系统中客户端与服务端共用的所有类型定义、
|
|
7
|
+
* 消息结构、协议常量和工具函数,作为 `@chuantou/shared` 包的公共 API 入口。
|
|
8
|
+
*/
|
|
9
|
+
/** 导出所有消息类型、消息接口及消息工具函数 */
|
|
2
10
|
export * from './messages.js';
|
|
3
|
-
|
|
11
|
+
/** 导出协议常量、错误码、默认配置及各类配置接口 */
|
|
4
12
|
export * from './protocol.js';
|
|
13
|
+
/** 导出日志工具 */
|
|
14
|
+
export * from './logger.js';
|
|
5
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,cAAc,eAAe,CAAC;AAC9B,6BAA6B;AAC7B,cAAc,eAAe,CAAC;AAC9B,aAAa;AACb,cAAc,aAAa,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module logger
|
|
3
|
+
*
|
|
4
|
+
* 日志工具模块,提供带时间戳的日志输出功能。
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 带时间戳的日志工具
|
|
8
|
+
*/
|
|
9
|
+
export declare const logger: {
|
|
10
|
+
/**
|
|
11
|
+
* 输出信息日志
|
|
12
|
+
*
|
|
13
|
+
* @param message - 日志消息
|
|
14
|
+
*/
|
|
15
|
+
log: (...message: unknown[]) => void;
|
|
16
|
+
/**
|
|
17
|
+
* 输出信息日志(别名)
|
|
18
|
+
*
|
|
19
|
+
* @param message - 日志消息
|
|
20
|
+
*/
|
|
21
|
+
info: (...message: unknown[]) => void;
|
|
22
|
+
/**
|
|
23
|
+
* 输出警告日志
|
|
24
|
+
*
|
|
25
|
+
* @param message - 日志消息
|
|
26
|
+
*/
|
|
27
|
+
warn: (...message: unknown[]) => void;
|
|
28
|
+
/**
|
|
29
|
+
* 输出错误日志
|
|
30
|
+
*
|
|
31
|
+
* @param message - 日志消息
|
|
32
|
+
*/
|
|
33
|
+
error: (...message: unknown[]) => void;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB;;;;OAIG;sBACe,OAAO,EAAE,KAAG,IAAI;IAIlC;;;;OAIG;uBACgB,OAAO,EAAE,KAAG,IAAI;IAInC;;;;OAIG;uBACgB,OAAO,EAAE,KAAG,IAAI;IAInC;;;;OAIG;wBACiB,OAAO,EAAE,KAAG,IAAI;CAGrC,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module logger
|
|
3
|
+
*
|
|
4
|
+
* 日志工具模块,提供带时间戳的日志输出功能。
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 格式化当前时间为日志时间戳
|
|
8
|
+
*
|
|
9
|
+
* @returns 格式化的时间字符串,格式为 HH:MM:SS.mmm
|
|
10
|
+
*/
|
|
11
|
+
function formatTimestamp() {
|
|
12
|
+
const now = new Date();
|
|
13
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
14
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
15
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
16
|
+
const ms = String(now.getMilliseconds()).padStart(3, '0');
|
|
17
|
+
return `${hours}:${minutes}:${seconds}.${ms}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 带时间戳的日志工具
|
|
21
|
+
*/
|
|
22
|
+
export const logger = {
|
|
23
|
+
/**
|
|
24
|
+
* 输出信息日志
|
|
25
|
+
*
|
|
26
|
+
* @param message - 日志消息
|
|
27
|
+
*/
|
|
28
|
+
log: (...message) => {
|
|
29
|
+
console.log(`[${formatTimestamp()}]`, ...message);
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* 输出信息日志(别名)
|
|
33
|
+
*
|
|
34
|
+
* @param message - 日志消息
|
|
35
|
+
*/
|
|
36
|
+
info: (...message) => {
|
|
37
|
+
console.log(`[${formatTimestamp()}]`, ...message);
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* 输出警告日志
|
|
41
|
+
*
|
|
42
|
+
* @param message - 日志消息
|
|
43
|
+
*/
|
|
44
|
+
warn: (...message) => {
|
|
45
|
+
console.warn(`[${formatTimestamp()}]`, ...message);
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
* 输出错误日志
|
|
49
|
+
*
|
|
50
|
+
* @param message - 日志消息
|
|
51
|
+
*/
|
|
52
|
+
error: (...message) => {
|
|
53
|
+
console.error(`[${formatTimestamp()}]`, ...message);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;;;OAIG;IACH,GAAG,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACrC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACtD,CAAC;CACF,CAAC"}
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,176 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module messages
|
|
3
|
+
*
|
|
4
|
+
* 穿透代理消息定义模块。
|
|
5
|
+
*
|
|
6
|
+
* 本模块定义了穿透代理系统中客户端与服务端之间通过 WebSocket 控制通道传输的所有消息类型,
|
|
7
|
+
* 包括认证消息、控制消息(注册/注销/心跳)、连接通知消息等,
|
|
8
|
+
* 以及消息的创建、序列化、反序列化和类型守卫等工具函数。
|
|
9
|
+
*/
|
|
1
10
|
/**
|
|
2
11
|
* 消息类型枚举
|
|
12
|
+
*
|
|
13
|
+
* 定义穿透代理协议中所有消息的类型标识,
|
|
14
|
+
* 涵盖认证、控制和连接通知三大类消息。
|
|
3
15
|
*/
|
|
4
16
|
export declare enum MessageType {
|
|
17
|
+
/** 客户端发送的认证请求消息 */
|
|
5
18
|
AUTH = "auth",
|
|
19
|
+
/** 服务端返回的认证响应消息 */
|
|
6
20
|
AUTH_RESP = "auth_resp",
|
|
21
|
+
/** 客户端发送的代理注册请求消息 */
|
|
7
22
|
REGISTER = "register",
|
|
23
|
+
/** 客户端发送的代理注销请求消息 */
|
|
8
24
|
UNREGISTER = "unregister",
|
|
25
|
+
/** 服务端返回的注册响应消息 */
|
|
9
26
|
REGISTER_RESP = "register_resp",
|
|
27
|
+
/** 客户端发送的心跳消息 */
|
|
10
28
|
HEARTBEAT = "heartbeat",
|
|
29
|
+
/** 服务端返回的心跳响应消息 */
|
|
11
30
|
HEARTBEAT_RESP = "heartbeat_resp",
|
|
31
|
+
/** 服务端发送的新连接通知消息 */
|
|
12
32
|
NEW_CONNECTION = "new_connection",
|
|
33
|
+
/** 连接关闭通知消息 */
|
|
13
34
|
CONNECTION_CLOSE = "connection_close",
|
|
35
|
+
/** 连接错误通知消息 */
|
|
14
36
|
CONNECTION_ERROR = "connection_error"
|
|
15
37
|
}
|
|
16
38
|
/**
|
|
17
39
|
* 协议类型
|
|
40
|
+
*
|
|
41
|
+
* 穿透代理支持的传输协议类型,可选 HTTP 或 WebSocket。
|
|
18
42
|
*/
|
|
19
43
|
export type Protocol = 'http' | 'websocket';
|
|
20
44
|
/**
|
|
21
45
|
* 基础消息接口
|
|
46
|
+
*
|
|
47
|
+
* 所有消息的公共基类,定义了消息的类型、唯一标识和负载数据。
|
|
22
48
|
*/
|
|
23
49
|
export interface Message {
|
|
50
|
+
/** 消息类型标识,参见 {@link MessageType} */
|
|
24
51
|
type: MessageType;
|
|
52
|
+
/** 消息的唯一标识符,用于请求-响应配对 */
|
|
25
53
|
id: string;
|
|
54
|
+
/** 消息的负载数据,具体结构取决于消息类型 */
|
|
26
55
|
payload: unknown;
|
|
27
56
|
}
|
|
28
57
|
/**
|
|
29
58
|
* 认证消息
|
|
59
|
+
*
|
|
60
|
+
* 客户端在建立控制通道后发送的第一条消息,携带认证令牌。
|
|
30
61
|
*/
|
|
31
62
|
export interface AuthMessage extends Message {
|
|
63
|
+
/** 消息类型,固定为 {@link MessageType.AUTH} */
|
|
32
64
|
type: MessageType.AUTH;
|
|
65
|
+
/** 认证消息负载 */
|
|
33
66
|
payload: {
|
|
67
|
+
/** 客户端的认证令牌 */
|
|
34
68
|
token: string;
|
|
35
69
|
};
|
|
36
70
|
}
|
|
37
71
|
/**
|
|
38
72
|
* 认证响应消息
|
|
73
|
+
*
|
|
74
|
+
* 服务端对客户端认证请求的响应,表明认证是否成功。
|
|
39
75
|
*/
|
|
40
76
|
export interface AuthRespMessage extends Message {
|
|
77
|
+
/** 消息类型,固定为 {@link MessageType.AUTH_RESP} */
|
|
41
78
|
type: MessageType.AUTH_RESP;
|
|
79
|
+
/** 认证响应负载 */
|
|
42
80
|
payload: {
|
|
81
|
+
/** 认证是否成功 */
|
|
43
82
|
success: boolean;
|
|
83
|
+
/** 认证失败时的错误描述信息 */
|
|
44
84
|
error?: string;
|
|
45
85
|
};
|
|
46
86
|
}
|
|
47
87
|
/**
|
|
48
88
|
* 注册代理服务消息
|
|
89
|
+
*
|
|
90
|
+
* 客户端向服务端请求注册一条代理隧道,指定远程端口到本地服务的映射。
|
|
91
|
+
* 每个端口同时支持 HTTP 和 WebSocket 协议。
|
|
49
92
|
*/
|
|
50
93
|
export interface RegisterMessage extends Message {
|
|
94
|
+
/** 消息类型,固定为 {@link MessageType.REGISTER} */
|
|
51
95
|
type: MessageType.REGISTER;
|
|
96
|
+
/** 注册请求负载 */
|
|
52
97
|
payload: {
|
|
98
|
+
/** 请求在服务端监听的远程端口号 */
|
|
53
99
|
remotePort: number;
|
|
54
|
-
|
|
100
|
+
/** 本地服务监听的端口号 */
|
|
55
101
|
localPort: number;
|
|
102
|
+
/** 本地服务的主机地址,默认为 localhost */
|
|
56
103
|
localHost?: string;
|
|
57
104
|
};
|
|
58
105
|
}
|
|
59
106
|
/**
|
|
60
107
|
* 注册响应消息
|
|
108
|
+
*
|
|
109
|
+
* 服务端对客户端注册请求的响应,表明注册是否成功及分配的远程端口信息。
|
|
61
110
|
*/
|
|
62
111
|
export interface RegisterRespMessage extends Message {
|
|
112
|
+
/** 消息类型,固定为 {@link MessageType.REGISTER_RESP} */
|
|
63
113
|
type: MessageType.REGISTER_RESP;
|
|
114
|
+
/** 注册响应负载 */
|
|
64
115
|
payload: {
|
|
116
|
+
/** 注册是否成功 */
|
|
65
117
|
success: boolean;
|
|
118
|
+
/** 服务端实际分配的远程端口号 */
|
|
66
119
|
remotePort?: number;
|
|
120
|
+
/** 可通过此 URL 访问代理服务的完整地址 */
|
|
67
121
|
remoteUrl?: string;
|
|
122
|
+
/** 注册失败时的错误描述信息 */
|
|
68
123
|
error?: string;
|
|
69
124
|
};
|
|
70
125
|
}
|
|
71
126
|
/**
|
|
72
127
|
* 注销代理服务消息
|
|
128
|
+
*
|
|
129
|
+
* 客户端向服务端请求注销一条已注册的代理隧道。
|
|
73
130
|
*/
|
|
74
131
|
export interface UnregisterMessage extends Message {
|
|
132
|
+
/** 消息类型,固定为 {@link MessageType.UNREGISTER} */
|
|
75
133
|
type: MessageType.UNREGISTER;
|
|
134
|
+
/** 注销请求负载 */
|
|
76
135
|
payload: {
|
|
136
|
+
/** 要注销的远程端口号 */
|
|
77
137
|
remotePort: number;
|
|
78
138
|
};
|
|
79
139
|
}
|
|
80
140
|
/**
|
|
81
141
|
* 心跳消息
|
|
142
|
+
*
|
|
143
|
+
* 客户端定期发送的心跳消息,用于保持控制通道连接活跃。
|
|
82
144
|
*/
|
|
83
145
|
export interface HeartbeatMessage extends Message {
|
|
146
|
+
/** 消息类型,固定为 {@link MessageType.HEARTBEAT} */
|
|
84
147
|
type: MessageType.HEARTBEAT;
|
|
148
|
+
/** 心跳消息负载 */
|
|
85
149
|
payload: {
|
|
150
|
+
/** 发送心跳时的时间戳(Unix 毫秒) */
|
|
86
151
|
timestamp: number;
|
|
87
152
|
};
|
|
88
153
|
}
|
|
89
154
|
/**
|
|
90
155
|
* 心跳响应消息
|
|
156
|
+
*
|
|
157
|
+
* 服务端对客户端心跳消息的响应。
|
|
91
158
|
*/
|
|
92
159
|
export interface HeartbeatRespMessage extends Message {
|
|
160
|
+
/** 消息类型,固定为 {@link MessageType.HEARTBEAT_RESP} */
|
|
93
161
|
type: MessageType.HEARTBEAT_RESP;
|
|
162
|
+
/** 心跳响应负载 */
|
|
94
163
|
payload: {
|
|
164
|
+
/** 服务端响应时的时间戳(Unix 毫秒) */
|
|
95
165
|
timestamp: number;
|
|
96
166
|
};
|
|
97
167
|
}
|
|
98
168
|
/**
|
|
99
|
-
* HTTP请求头信息
|
|
169
|
+
* HTTP 请求头信息
|
|
170
|
+
*
|
|
171
|
+
* 表示 HTTP 请求或响应的头部字段映射,值可以是单个字符串、字符串数组或未定义。
|
|
100
172
|
*/
|
|
101
173
|
export interface HttpHeaders {
|
|
174
|
+
/** HTTP 头部字段,键为头部名称,值为头部内容 */
|
|
102
175
|
[key: string]: string | string[] | undefined;
|
|
103
176
|
}
|
|
104
177
|
/**
|
|
105
178
|
* 新连接通知消息
|
|
179
|
+
*
|
|
180
|
+
* 当外部用户连接到服务端的代理端口时,服务端向客户端发送此消息通知新连接的到来,
|
|
181
|
+
* 并携带连接的详细信息(HTTP 请求数据或 WebSocket 握手头)。
|
|
106
182
|
*/
|
|
107
183
|
export interface NewConnectionMessage extends Message {
|
|
184
|
+
/** 消息类型,固定为 {@link MessageType.NEW_CONNECTION} */
|
|
108
185
|
type: MessageType.NEW_CONNECTION;
|
|
186
|
+
/** 新连接通知负载 */
|
|
109
187
|
payload: {
|
|
188
|
+
/** 新连接的唯一标识符 */
|
|
110
189
|
connectionId: string;
|
|
190
|
+
/** 连接使用的传输协议类型 */
|
|
111
191
|
protocol: Protocol;
|
|
192
|
+
/** HTTP 请求方法(仅 HTTP 协议时存在),如 GET、POST 等 */
|
|
112
193
|
method?: string;
|
|
194
|
+
/** HTTP 请求的 URL 路径(仅 HTTP 协议时存在) */
|
|
113
195
|
url?: string;
|
|
196
|
+
/** HTTP 请求头(仅 HTTP 协议时存在) */
|
|
114
197
|
headers?: HttpHeaders;
|
|
198
|
+
/** HTTP 请求体(仅 HTTP 协议时存在) */
|
|
115
199
|
body?: string | Buffer;
|
|
200
|
+
/** WebSocket 握手请求头(仅 WebSocket 协议时存在) */
|
|
116
201
|
wsHeaders?: HttpHeaders;
|
|
117
202
|
};
|
|
118
203
|
}
|
|
119
204
|
/**
|
|
120
|
-
* HTTP响应数据
|
|
205
|
+
* HTTP 响应数据
|
|
206
|
+
*
|
|
207
|
+
* 描述一个 HTTP 响应的结构,包含状态码、响应头和可选的响应体。
|
|
121
208
|
*/
|
|
122
209
|
export interface HttpResponseData {
|
|
210
|
+
/** HTTP 响应状态码 */
|
|
123
211
|
statusCode: number;
|
|
212
|
+
/** HTTP 响应头 */
|
|
124
213
|
headers: HttpHeaders;
|
|
214
|
+
/** HTTP 响应体 */
|
|
125
215
|
body?: string | Buffer;
|
|
126
216
|
}
|
|
127
217
|
/**
|
|
128
218
|
* 连接关闭消息
|
|
219
|
+
*
|
|
220
|
+
* 通知对方某个代理连接已关闭。
|
|
129
221
|
*/
|
|
130
222
|
export interface ConnectionCloseMessage extends Message {
|
|
223
|
+
/** 消息类型,固定为 {@link MessageType.CONNECTION_CLOSE} */
|
|
131
224
|
type: MessageType.CONNECTION_CLOSE;
|
|
225
|
+
/** 连接关闭负载 */
|
|
132
226
|
payload: {
|
|
227
|
+
/** 已关闭的连接的唯一标识符 */
|
|
133
228
|
connectionId: string;
|
|
134
229
|
};
|
|
135
230
|
}
|
|
136
231
|
/**
|
|
137
232
|
* 连接错误消息
|
|
233
|
+
*
|
|
234
|
+
* 通知对方某个代理连接发生了错误。
|
|
138
235
|
*/
|
|
139
236
|
export interface ConnectionErrorMessage extends Message {
|
|
237
|
+
/** 消息类型,固定为 {@link MessageType.CONNECTION_ERROR} */
|
|
140
238
|
type: MessageType.CONNECTION_ERROR;
|
|
239
|
+
/** 连接错误负载 */
|
|
141
240
|
payload: {
|
|
241
|
+
/** 发生错误的连接的唯一标识符 */
|
|
142
242
|
connectionId: string;
|
|
243
|
+
/** 错误描述信息 */
|
|
143
244
|
error: string;
|
|
144
245
|
};
|
|
145
246
|
}
|
|
146
247
|
/**
|
|
147
248
|
* 所有消息类型的联合类型
|
|
249
|
+
*
|
|
250
|
+
* 包含穿透代理协议中所有具体消息类型的联合,可用于消息处理函数的参数类型。
|
|
148
251
|
*/
|
|
149
252
|
export type AnyMessage = AuthMessage | AuthRespMessage | RegisterMessage | RegisterRespMessage | UnregisterMessage | HeartbeatMessage | HeartbeatRespMessage | NewConnectionMessage | ConnectionCloseMessage | ConnectionErrorMessage;
|
|
150
253
|
/**
|
|
151
254
|
* 消息类型守卫
|
|
255
|
+
*
|
|
256
|
+
* 检查一个未知对象是否符合 {@link Message} 接口的基本结构。
|
|
257
|
+
*
|
|
258
|
+
* @param obj - 待检查的未知对象
|
|
259
|
+
* @returns 如果对象包含有效的 `type` 和 `id` 字段则返回 `true`
|
|
152
260
|
*/
|
|
153
261
|
export declare function isMessage(obj: unknown): obj is Message;
|
|
154
262
|
/**
|
|
155
263
|
* 检查消息是否为指定类型
|
|
264
|
+
*
|
|
265
|
+
* 类型守卫函数,判断一条消息是否属于特定的消息类型,并在类型系统中收窄类型。
|
|
266
|
+
*
|
|
267
|
+
* @typeParam T - 目标消息类型,必须是 {@link AnyMessage} 的子类型
|
|
268
|
+
* @param msg - 待检查的消息对象
|
|
269
|
+
* @param type - 期望的消息类型标识
|
|
270
|
+
* @returns 如果消息的 `type` 字段与期望类型匹配则返回 `true`
|
|
156
271
|
*/
|
|
157
272
|
export declare function isMessageType<T extends AnyMessage>(msg: Message, type: T['type']): msg is T;
|
|
158
273
|
/**
|
|
159
274
|
* 创建消息
|
|
275
|
+
*
|
|
276
|
+
* 工厂函数,根据指定的消息类型和负载数据创建一条新的消息实例。
|
|
277
|
+
* 若未提供消息 ID,将自动生成一个唯一 ID。
|
|
278
|
+
*
|
|
279
|
+
* @typeParam T - 目标消息类型(不含 `id` 字段),必须是 {@link AnyMessage} 的子类型
|
|
280
|
+
* @param type - 消息类型标识
|
|
281
|
+
* @param payload - 消息负载数据
|
|
282
|
+
* @param id - 可选的消息唯一标识符,若不提供则自动生成
|
|
283
|
+
* @returns 包含完整字段的消息对象
|
|
160
284
|
*/
|
|
161
285
|
export declare function createMessage<T extends Omit<AnyMessage, 'id'>>(type: T['type'], payload: T['payload'], id?: string): T & {
|
|
162
286
|
id: string;
|
|
163
287
|
};
|
|
164
288
|
/**
|
|
165
289
|
* 生成消息ID
|
|
290
|
+
*
|
|
291
|
+
* 生成一个格式为 `msg_{timestamp}_{random}` 的唯一消息标识符。
|
|
292
|
+
*
|
|
293
|
+
* @returns 唯一的消息 ID 字符串
|
|
166
294
|
*/
|
|
167
295
|
export declare function generateMessageId(): string;
|
|
168
296
|
/**
|
|
169
297
|
* 序列化消息
|
|
298
|
+
*
|
|
299
|
+
* 将消息对象转换为 JSON 字符串,用于通过 WebSocket 发送。
|
|
300
|
+
*
|
|
301
|
+
* @param msg - 要序列化的消息对象
|
|
302
|
+
* @returns 消息的 JSON 字符串表示
|
|
170
303
|
*/
|
|
171
304
|
export declare function serializeMessage(msg: Message): string;
|
|
172
305
|
/**
|
|
173
306
|
* 反序列化消息
|
|
307
|
+
*
|
|
308
|
+
* 将 JSON 字符串解析为消息对象。如果字符串不是有效的 JSON 或解析后的对象不符合消息格式,
|
|
309
|
+
* 将抛出错误。
|
|
310
|
+
*
|
|
311
|
+
* @param data - 要反序列化的 JSON 字符串
|
|
312
|
+
* @returns 解析后的消息对象
|
|
313
|
+
* @throws 当 JSON 解析失败或消息格式无效时抛出错误
|
|
174
314
|
*/
|
|
175
315
|
export declare function deserializeMessage(data: string): Message;
|
|
176
316
|
//# sourceMappingURL=messages.d.ts.map
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/messages.js
CHANGED
|
@@ -1,24 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module messages
|
|
3
|
+
*
|
|
4
|
+
* 穿透代理消息定义模块。
|
|
5
|
+
*
|
|
6
|
+
* 本模块定义了穿透代理系统中客户端与服务端之间通过 WebSocket 控制通道传输的所有消息类型,
|
|
7
|
+
* 包括认证消息、控制消息(注册/注销/心跳)、连接通知消息等,
|
|
8
|
+
* 以及消息的创建、序列化、反序列化和类型守卫等工具函数。
|
|
9
|
+
*/
|
|
1
10
|
/**
|
|
2
11
|
* 消息类型枚举
|
|
12
|
+
*
|
|
13
|
+
* 定义穿透代理协议中所有消息的类型标识,
|
|
14
|
+
* 涵盖认证、控制和连接通知三大类消息。
|
|
3
15
|
*/
|
|
4
16
|
export var MessageType;
|
|
5
17
|
(function (MessageType) {
|
|
6
|
-
|
|
18
|
+
/** 客户端发送的认证请求消息 */
|
|
7
19
|
MessageType["AUTH"] = "auth";
|
|
20
|
+
/** 服务端返回的认证响应消息 */
|
|
8
21
|
MessageType["AUTH_RESP"] = "auth_resp";
|
|
9
|
-
|
|
22
|
+
/** 客户端发送的代理注册请求消息 */
|
|
10
23
|
MessageType["REGISTER"] = "register";
|
|
24
|
+
/** 客户端发送的代理注销请求消息 */
|
|
11
25
|
MessageType["UNREGISTER"] = "unregister";
|
|
26
|
+
/** 服务端返回的注册响应消息 */
|
|
12
27
|
MessageType["REGISTER_RESP"] = "register_resp";
|
|
28
|
+
/** 客户端发送的心跳消息 */
|
|
13
29
|
MessageType["HEARTBEAT"] = "heartbeat";
|
|
30
|
+
/** 服务端返回的心跳响应消息 */
|
|
14
31
|
MessageType["HEARTBEAT_RESP"] = "heartbeat_resp";
|
|
15
|
-
|
|
32
|
+
/** 服务端发送的新连接通知消息 */
|
|
16
33
|
MessageType["NEW_CONNECTION"] = "new_connection";
|
|
34
|
+
/** 连接关闭通知消息 */
|
|
17
35
|
MessageType["CONNECTION_CLOSE"] = "connection_close";
|
|
36
|
+
/** 连接错误通知消息 */
|
|
18
37
|
MessageType["CONNECTION_ERROR"] = "connection_error";
|
|
19
38
|
})(MessageType || (MessageType = {}));
|
|
20
39
|
/**
|
|
21
40
|
* 消息类型守卫
|
|
41
|
+
*
|
|
42
|
+
* 检查一个未知对象是否符合 {@link Message} 接口的基本结构。
|
|
43
|
+
*
|
|
44
|
+
* @param obj - 待检查的未知对象
|
|
45
|
+
* @returns 如果对象包含有效的 `type` 和 `id` 字段则返回 `true`
|
|
22
46
|
*/
|
|
23
47
|
export function isMessage(obj) {
|
|
24
48
|
if (typeof obj !== 'object' || obj === null) {
|
|
@@ -29,12 +53,28 @@ export function isMessage(obj) {
|
|
|
29
53
|
}
|
|
30
54
|
/**
|
|
31
55
|
* 检查消息是否为指定类型
|
|
56
|
+
*
|
|
57
|
+
* 类型守卫函数,判断一条消息是否属于特定的消息类型,并在类型系统中收窄类型。
|
|
58
|
+
*
|
|
59
|
+
* @typeParam T - 目标消息类型,必须是 {@link AnyMessage} 的子类型
|
|
60
|
+
* @param msg - 待检查的消息对象
|
|
61
|
+
* @param type - 期望的消息类型标识
|
|
62
|
+
* @returns 如果消息的 `type` 字段与期望类型匹配则返回 `true`
|
|
32
63
|
*/
|
|
33
64
|
export function isMessageType(msg, type) {
|
|
34
65
|
return msg.type === type;
|
|
35
66
|
}
|
|
36
67
|
/**
|
|
37
68
|
* 创建消息
|
|
69
|
+
*
|
|
70
|
+
* 工厂函数,根据指定的消息类型和负载数据创建一条新的消息实例。
|
|
71
|
+
* 若未提供消息 ID,将自动生成一个唯一 ID。
|
|
72
|
+
*
|
|
73
|
+
* @typeParam T - 目标消息类型(不含 `id` 字段),必须是 {@link AnyMessage} 的子类型
|
|
74
|
+
* @param type - 消息类型标识
|
|
75
|
+
* @param payload - 消息负载数据
|
|
76
|
+
* @param id - 可选的消息唯一标识符,若不提供则自动生成
|
|
77
|
+
* @returns 包含完整字段的消息对象
|
|
38
78
|
*/
|
|
39
79
|
export function createMessage(type, payload, id) {
|
|
40
80
|
return {
|
|
@@ -45,29 +85,45 @@ export function createMessage(type, payload, id) {
|
|
|
45
85
|
}
|
|
46
86
|
/**
|
|
47
87
|
* 生成消息ID
|
|
88
|
+
*
|
|
89
|
+
* 生成一个格式为 `msg_{timestamp}_{random}` 的唯一消息标识符。
|
|
90
|
+
*
|
|
91
|
+
* @returns 唯一的消息 ID 字符串
|
|
48
92
|
*/
|
|
49
93
|
export function generateMessageId() {
|
|
50
94
|
return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
|
|
51
95
|
}
|
|
52
96
|
/**
|
|
53
97
|
* 序列化消息
|
|
98
|
+
*
|
|
99
|
+
* 将消息对象转换为 JSON 字符串,用于通过 WebSocket 发送。
|
|
100
|
+
*
|
|
101
|
+
* @param msg - 要序列化的消息对象
|
|
102
|
+
* @returns 消息的 JSON 字符串表示
|
|
54
103
|
*/
|
|
55
104
|
export function serializeMessage(msg) {
|
|
56
105
|
return JSON.stringify(msg);
|
|
57
106
|
}
|
|
58
107
|
/**
|
|
59
108
|
* 反序列化消息
|
|
109
|
+
*
|
|
110
|
+
* 将 JSON 字符串解析为消息对象。如果字符串不是有效的 JSON 或解析后的对象不符合消息格式,
|
|
111
|
+
* 将抛出错误。
|
|
112
|
+
*
|
|
113
|
+
* @param data - 要反序列化的 JSON 字符串
|
|
114
|
+
* @returns 解析后的消息对象
|
|
115
|
+
* @throws 当 JSON 解析失败或消息格式无效时抛出错误
|
|
60
116
|
*/
|
|
61
117
|
export function deserializeMessage(data) {
|
|
62
118
|
try {
|
|
63
119
|
const msg = JSON.parse(data);
|
|
64
120
|
if (!isMessage(msg)) {
|
|
65
|
-
throw new Error('
|
|
121
|
+
throw new Error('无效的消息格式');
|
|
66
122
|
}
|
|
67
123
|
return msg;
|
|
68
124
|
}
|
|
69
125
|
catch (error) {
|
|
70
|
-
throw new Error(
|
|
126
|
+
throw new Error(`消息反序列化失败: ${error}`);
|
|
71
127
|
}
|
|
72
128
|
}
|
|
73
129
|
//# sourceMappingURL=messages.js.map
|
package/dist/messages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,CAAN,IAAY,WAuBX;AAvBD,WAAY,WAAW;IACrB,mBAAmB;IACnB,4BAAa,CAAA;IACb,mBAAmB;IACnB,sCAAuB,CAAA;IAEvB,qBAAqB;IACrB,oCAAqB,CAAA;IACrB,qBAAqB;IACrB,wCAAyB,CAAA;IACzB,mBAAmB;IACnB,8CAA+B,CAAA;IAC/B,iBAAiB;IACjB,sCAAuB,CAAA;IACvB,mBAAmB;IACnB,gDAAiC,CAAA;IAEjC,oBAAoB;IACpB,gDAAiC,CAAA;IACjC,eAAe;IACf,oDAAqC,CAAA;IACrC,eAAe;IACf,oDAAqC,CAAA;AACvC,CAAC,EAvBW,WAAW,KAAX,WAAW,QAuBtB;AAkPD;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,GAAuB,CAAC;IACpC,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAY,EACZ,IAAe;IAEf,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAe,EACf,OAAqB,EACrB,EAAW;IAEX,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,EAAE,IAAI,iBAAiB,EAAE;QAC7B,OAAO;KACc,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -1,110 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module protocol
|
|
3
|
+
*
|
|
4
|
+
* 穿透代理协议定义模块。
|
|
5
|
+
*
|
|
6
|
+
* 本模块定义了穿透代理系统的核心协议常量、错误码、默认配置以及各类配置接口。
|
|
7
|
+
* 包括服务端与客户端通信所需的协议版本、控制通道路径、心跳参数、端口范围等关键配置,
|
|
8
|
+
* 以及代理配置、服务器配置、客户端配置、连接信息等数据结构的类型定义。
|
|
9
|
+
*/
|
|
1
10
|
/**
|
|
2
11
|
* 协议常量
|
|
12
|
+
*
|
|
13
|
+
* 定义穿透代理系统的基础协议参数。
|
|
3
14
|
*/
|
|
4
15
|
export declare const PROTOCOL: {
|
|
16
|
+
/** 穿透协议版本号 */
|
|
5
17
|
readonly VERSION: "1.0.0";
|
|
18
|
+
/** 客户端与服务端建立 WebSocket 控制通道的 URL 路径,如 ws://host:9000/control */
|
|
6
19
|
readonly CONTROL_PATH: "/control";
|
|
7
20
|
};
|
|
8
21
|
/**
|
|
9
22
|
* 协议错误码
|
|
23
|
+
*
|
|
24
|
+
* 枚举穿透代理系统中可能出现的各类错误码,
|
|
25
|
+
* 涵盖认证错误、注册错误、连接错误和通用错误四大类。
|
|
10
26
|
*/
|
|
11
27
|
export declare enum ErrorCode {
|
|
28
|
+
/** 认证失败,令牌无效或不匹配 */
|
|
12
29
|
AUTH_FAILED = "AUTH_FAILED",
|
|
30
|
+
/** 认证超时,客户端未在规定时间内完成认证 */
|
|
13
31
|
AUTH_TIMEOUT = "AUTH_TIMEOUT",
|
|
32
|
+
/** 端口已被注册,其他客户端已占用该远程端口 */
|
|
14
33
|
PORT_ALREADY_REGISTERED = "PORT_ALREADY_REGISTERED",
|
|
34
|
+
/** 端口超出允许范围 */
|
|
15
35
|
PORT_OUT_OF_RANGE = "PORT_OUT_OF_RANGE",
|
|
36
|
+
/** 无效端口号 */
|
|
16
37
|
INVALID_PORT = "INVALID_PORT",
|
|
38
|
+
/** 未找到指定的连接 */
|
|
17
39
|
CONNECTION_NOT_FOUND = "CONNECTION_NOT_FOUND",
|
|
40
|
+
/** 连接超时 */
|
|
18
41
|
CONNECTION_TIMEOUT = "CONNECTION_TIMEOUT",
|
|
42
|
+
/** 未找到指定的客户端 */
|
|
19
43
|
CLIENT_NOT_FOUND = "CLIENT_NOT_FOUND",
|
|
44
|
+
/** 无效的消息格式 */
|
|
20
45
|
INVALID_MESSAGE = "INVALID_MESSAGE",
|
|
46
|
+
/** 内部服务器错误 */
|
|
21
47
|
INTERNAL_ERROR = "INTERNAL_ERROR"
|
|
22
48
|
}
|
|
23
49
|
/**
|
|
24
50
|
* 协议错误类
|
|
51
|
+
*
|
|
52
|
+
* 继承自 {@link Error},附带 {@link ErrorCode} 错误码,
|
|
53
|
+
* 用于在穿透代理协议处理过程中抛出结构化的错误信息。
|
|
25
54
|
*/
|
|
26
55
|
export declare class ProtocolError extends Error {
|
|
27
56
|
code: ErrorCode;
|
|
57
|
+
/**
|
|
58
|
+
* 创建一个协议错误实例。
|
|
59
|
+
*
|
|
60
|
+
* @param code - 协议错误码,参见 {@link ErrorCode}
|
|
61
|
+
* @param message - 可读的错误描述信息
|
|
62
|
+
*/
|
|
28
63
|
constructor(code: ErrorCode, message: string);
|
|
29
64
|
}
|
|
30
65
|
/**
|
|
31
|
-
* HTTP
|
|
66
|
+
* HTTP 状态码常量
|
|
67
|
+
*
|
|
68
|
+
* 定义穿透代理系统中常用的 HTTP 状态码。
|
|
32
69
|
*/
|
|
33
70
|
export declare const HTTP_STATUS: {
|
|
71
|
+
/** 请求成功 */
|
|
34
72
|
readonly OK: 200;
|
|
73
|
+
/** 请求参数错误 */
|
|
35
74
|
readonly BAD_REQUEST: 400;
|
|
75
|
+
/** 未授权,认证失败 */
|
|
36
76
|
readonly UNAUTHORIZED: 401;
|
|
77
|
+
/** 未找到请求的资源 */
|
|
37
78
|
readonly NOT_FOUND: 404;
|
|
79
|
+
/** 服务器内部错误 */
|
|
38
80
|
readonly INTERNAL_SERVER_ERROR: 500;
|
|
81
|
+
/** 网关错误,上游服务不可用 */
|
|
39
82
|
readonly BAD_GATEWAY: 502;
|
|
83
|
+
/** 服务不可用 */
|
|
40
84
|
readonly SERVICE_UNAVAILABLE: 503;
|
|
41
85
|
};
|
|
42
86
|
/**
|
|
43
87
|
* 默认配置
|
|
88
|
+
*
|
|
89
|
+
* 穿透代理系统的默认运行参数,包括端口、心跳、会话、重连及缓冲区等配置项。
|
|
44
90
|
*/
|
|
45
91
|
export declare const DEFAULT_CONFIG: {
|
|
92
|
+
/** 服务端监听的控制端口,客户端通过此端口建立 WebSocket 控制通道进行认证、注册代理等操作 */
|
|
46
93
|
readonly CONTROL_PORT: 9000;
|
|
94
|
+
/** 控制通道的 WebSocket URL 路径,客户端连接地址为 ws://host:{CONTROL_PORT}{CONTROL_PATH} */
|
|
47
95
|
readonly CONTROL_PATH: "/control";
|
|
96
|
+
/** 心跳发送间隔时间,单位毫秒(默认 30 秒) */
|
|
48
97
|
readonly HEARTBEAT_INTERVAL: 30000;
|
|
98
|
+
/** 心跳超时时间,超过此时间未收到心跳视为断连,单位毫秒(默认 60 秒) */
|
|
49
99
|
readonly HEARTBEAT_TIMEOUT: 60000;
|
|
100
|
+
/** 会话超时时间,超时后会话将被清理,单位毫秒(默认 2 分钟) */
|
|
50
101
|
readonly SESSION_TIMEOUT: 120000;
|
|
102
|
+
/** 断线重连间隔时间,单位毫秒(默认 5 秒) */
|
|
51
103
|
readonly RECONNECT_INTERVAL: 5000;
|
|
104
|
+
/** 最大重连尝试次数(默认 10 次) */
|
|
52
105
|
readonly MAX_RECONNECT_ATTEMPTS: 10;
|
|
106
|
+
/** 允许注册的最小端口号 */
|
|
53
107
|
readonly MIN_PORT: 1024;
|
|
108
|
+
/** 允许注册的最大端口号 */
|
|
54
109
|
readonly MAX_PORT: 65535;
|
|
110
|
+
/** 数据传输缓冲区大小,单位字节(默认 64KB) */
|
|
55
111
|
readonly BUFFER_SIZE: number;
|
|
56
112
|
};
|
|
57
113
|
/**
|
|
58
114
|
* 代理配置接口
|
|
115
|
+
*
|
|
116
|
+
* 描述单条代理隧道的配置,指定远程端口到本地端口的映射关系。
|
|
117
|
+
* 每个端口同时支持 HTTP 和 WebSocket 协议,无需单独指定。
|
|
59
118
|
*/
|
|
60
119
|
export interface ProxyConfig {
|
|
120
|
+
/** 服务端监听的远程端口号,外部用户通过此端口访问代理服务 */
|
|
61
121
|
remotePort: number;
|
|
62
|
-
|
|
122
|
+
/** 本地服务监听的端口号,代理流量将被转发到此端口 */
|
|
63
123
|
localPort: number;
|
|
124
|
+
/** 本地服务的主机地址,默认为 localhost */
|
|
64
125
|
localHost?: string;
|
|
65
126
|
}
|
|
66
127
|
/**
|
|
67
128
|
* 服务器配置接口
|
|
129
|
+
*
|
|
130
|
+
* 定义穿透代理服务端的运行参数,包括监听地址、认证令牌、心跳和 TLS 配置。
|
|
68
131
|
*/
|
|
69
132
|
export interface ServerConfig {
|
|
133
|
+
/** 服务端监听的主机地址 */
|
|
70
134
|
host: string;
|
|
135
|
+
/** 服务端控制通道监听的端口号 */
|
|
71
136
|
controlPort: number;
|
|
137
|
+
/** 允许认证的令牌列表,客户端需提供其中之一才能通过认证 */
|
|
72
138
|
authTokens: string[];
|
|
139
|
+
/** 心跳发送间隔时间,单位毫秒 */
|
|
73
140
|
heartbeatInterval: number;
|
|
141
|
+
/** 会话超时时间,单位毫秒 */
|
|
74
142
|
sessionTimeout: number;
|
|
143
|
+
/**
|
|
144
|
+
* TLS 证书配置,用于启用安全的 WSS 连接。
|
|
145
|
+
* 若不提供则使用非加密的 WS 连接。
|
|
146
|
+
*/
|
|
75
147
|
tls?: {
|
|
148
|
+
/** TLS 私钥文件路径或内容 */
|
|
76
149
|
key: string;
|
|
150
|
+
/** TLS 证书文件路径或内容 */
|
|
77
151
|
cert: string;
|
|
78
152
|
};
|
|
79
153
|
}
|
|
80
154
|
/**
|
|
81
155
|
* 客户端配置接口
|
|
156
|
+
*
|
|
157
|
+
* 定义穿透代理客户端的运行参数,包括服务器地址、认证令牌、重连策略和代理列表。
|
|
82
158
|
*/
|
|
83
159
|
export interface ClientConfig {
|
|
160
|
+
/** 服务端 WebSocket 控制通道的完整 URL,如 ws://host:9000/control */
|
|
84
161
|
serverUrl: string;
|
|
162
|
+
/** 客户端认证令牌,需与服务端配置的 authTokens 之一匹配 */
|
|
85
163
|
token: string;
|
|
164
|
+
/** 断线重连间隔时间,单位毫秒 */
|
|
86
165
|
reconnectInterval: number;
|
|
166
|
+
/** 最大重连尝试次数,超过后停止重连 */
|
|
87
167
|
maxReconnectAttempts: number;
|
|
168
|
+
/** 需要注册的代理隧道配置列表 */
|
|
88
169
|
proxies: ProxyConfig[];
|
|
89
170
|
}
|
|
90
171
|
/**
|
|
91
172
|
* 连接信息接口
|
|
173
|
+
*
|
|
174
|
+
* 描述单个代理连接的运行时信息。
|
|
92
175
|
*/
|
|
93
176
|
export interface ConnectionInfo {
|
|
177
|
+
/** 连接的唯一标识符 */
|
|
94
178
|
id: string;
|
|
179
|
+
/** 发起连接的远程客户端 IP 地址 */
|
|
95
180
|
remoteAddress: string;
|
|
181
|
+
/** 该连接使用的传输协议类型 */
|
|
96
182
|
protocol: 'http' | 'websocket';
|
|
183
|
+
/** 连接建立的时间戳(Unix 毫秒) */
|
|
97
184
|
createdAt: number;
|
|
98
185
|
}
|
|
99
186
|
/**
|
|
100
187
|
* 客户端信息接口
|
|
188
|
+
*
|
|
189
|
+
* 描述已连接到服务端的客户端的运行时状态信息。
|
|
101
190
|
*/
|
|
102
191
|
export interface ClientInfo {
|
|
192
|
+
/** 客户端的唯一标识符 */
|
|
103
193
|
id: string;
|
|
194
|
+
/** 客户端是否已通过认证 */
|
|
104
195
|
authenticated: boolean;
|
|
196
|
+
/** 客户端通过认证的时间戳(Unix 毫秒) */
|
|
105
197
|
authenticatedAt?: number;
|
|
198
|
+
/** 最近一次收到心跳的时间戳(Unix 毫秒) */
|
|
106
199
|
lastHeartbeat?: number;
|
|
200
|
+
/** 客户端已注册的远程端口集合 */
|
|
107
201
|
registeredPorts: Set<number>;
|
|
202
|
+
/** 客户端当前活跃的连接映射表,键为连接 ID */
|
|
108
203
|
connections: Map<string, ConnectionInfo>;
|
|
109
204
|
}
|
|
110
205
|
//# sourceMappingURL=protocol.d.ts.map
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
CHANGED
|
@@ -1,34 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module protocol
|
|
3
|
+
*
|
|
4
|
+
* 穿透代理协议定义模块。
|
|
5
|
+
*
|
|
6
|
+
* 本模块定义了穿透代理系统的核心协议常量、错误码、默认配置以及各类配置接口。
|
|
7
|
+
* 包括服务端与客户端通信所需的协议版本、控制通道路径、心跳参数、端口范围等关键配置,
|
|
8
|
+
* 以及代理配置、服务器配置、客户端配置、连接信息等数据结构的类型定义。
|
|
9
|
+
*/
|
|
1
10
|
/**
|
|
2
11
|
* 协议常量
|
|
12
|
+
*
|
|
13
|
+
* 定义穿透代理系统的基础协议参数。
|
|
3
14
|
*/
|
|
4
15
|
export const PROTOCOL = {
|
|
16
|
+
/** 穿透协议版本号 */
|
|
5
17
|
VERSION: '1.0.0',
|
|
18
|
+
/** 客户端与服务端建立 WebSocket 控制通道的 URL 路径,如 ws://host:9000/control */
|
|
6
19
|
CONTROL_PATH: '/control',
|
|
7
20
|
};
|
|
8
21
|
/**
|
|
9
22
|
* 协议错误码
|
|
23
|
+
*
|
|
24
|
+
* 枚举穿透代理系统中可能出现的各类错误码,
|
|
25
|
+
* 涵盖认证错误、注册错误、连接错误和通用错误四大类。
|
|
10
26
|
*/
|
|
11
27
|
export var ErrorCode;
|
|
12
28
|
(function (ErrorCode) {
|
|
13
|
-
|
|
29
|
+
/** 认证失败,令牌无效或不匹配 */
|
|
14
30
|
ErrorCode["AUTH_FAILED"] = "AUTH_FAILED";
|
|
31
|
+
/** 认证超时,客户端未在规定时间内完成认证 */
|
|
15
32
|
ErrorCode["AUTH_TIMEOUT"] = "AUTH_TIMEOUT";
|
|
16
|
-
|
|
33
|
+
/** 端口已被注册,其他客户端已占用该远程端口 */
|
|
17
34
|
ErrorCode["PORT_ALREADY_REGISTERED"] = "PORT_ALREADY_REGISTERED";
|
|
35
|
+
/** 端口超出允许范围 */
|
|
18
36
|
ErrorCode["PORT_OUT_OF_RANGE"] = "PORT_OUT_OF_RANGE";
|
|
37
|
+
/** 无效端口号 */
|
|
19
38
|
ErrorCode["INVALID_PORT"] = "INVALID_PORT";
|
|
20
|
-
|
|
39
|
+
/** 未找到指定的连接 */
|
|
21
40
|
ErrorCode["CONNECTION_NOT_FOUND"] = "CONNECTION_NOT_FOUND";
|
|
41
|
+
/** 连接超时 */
|
|
22
42
|
ErrorCode["CONNECTION_TIMEOUT"] = "CONNECTION_TIMEOUT";
|
|
43
|
+
/** 未找到指定的客户端 */
|
|
23
44
|
ErrorCode["CLIENT_NOT_FOUND"] = "CLIENT_NOT_FOUND";
|
|
24
|
-
|
|
45
|
+
/** 无效的消息格式 */
|
|
25
46
|
ErrorCode["INVALID_MESSAGE"] = "INVALID_MESSAGE";
|
|
47
|
+
/** 内部服务器错误 */
|
|
26
48
|
ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
27
49
|
})(ErrorCode || (ErrorCode = {}));
|
|
28
50
|
/**
|
|
29
51
|
* 协议错误类
|
|
52
|
+
*
|
|
53
|
+
* 继承自 {@link Error},附带 {@link ErrorCode} 错误码,
|
|
54
|
+
* 用于在穿透代理协议处理过程中抛出结构化的错误信息。
|
|
30
55
|
*/
|
|
31
56
|
export class ProtocolError extends Error {
|
|
57
|
+
/**
|
|
58
|
+
* 创建一个协议错误实例。
|
|
59
|
+
*
|
|
60
|
+
* @param code - 协议错误码,参见 {@link ErrorCode}
|
|
61
|
+
* @param message - 可读的错误描述信息
|
|
62
|
+
*/
|
|
32
63
|
constructor(code, message) {
|
|
33
64
|
super(message);
|
|
34
65
|
this.code = code;
|
|
@@ -36,36 +67,51 @@ export class ProtocolError extends Error {
|
|
|
36
67
|
}
|
|
37
68
|
}
|
|
38
69
|
/**
|
|
39
|
-
* HTTP
|
|
70
|
+
* HTTP 状态码常量
|
|
71
|
+
*
|
|
72
|
+
* 定义穿透代理系统中常用的 HTTP 状态码。
|
|
40
73
|
*/
|
|
41
74
|
export const HTTP_STATUS = {
|
|
75
|
+
/** 请求成功 */
|
|
42
76
|
OK: 200,
|
|
77
|
+
/** 请求参数错误 */
|
|
43
78
|
BAD_REQUEST: 400,
|
|
79
|
+
/** 未授权,认证失败 */
|
|
44
80
|
UNAUTHORIZED: 401,
|
|
81
|
+
/** 未找到请求的资源 */
|
|
45
82
|
NOT_FOUND: 404,
|
|
83
|
+
/** 服务器内部错误 */
|
|
46
84
|
INTERNAL_SERVER_ERROR: 500,
|
|
85
|
+
/** 网关错误,上游服务不可用 */
|
|
47
86
|
BAD_GATEWAY: 502,
|
|
87
|
+
/** 服务不可用 */
|
|
48
88
|
SERVICE_UNAVAILABLE: 503,
|
|
49
89
|
};
|
|
50
90
|
/**
|
|
51
91
|
* 默认配置
|
|
92
|
+
*
|
|
93
|
+
* 穿透代理系统的默认运行参数,包括端口、心跳、会话、重连及缓冲区等配置项。
|
|
52
94
|
*/
|
|
53
95
|
export const DEFAULT_CONFIG = {
|
|
54
|
-
|
|
96
|
+
/** 服务端监听的控制端口,客户端通过此端口建立 WebSocket 控制通道进行认证、注册代理等操作 */
|
|
55
97
|
CONTROL_PORT: 9000,
|
|
98
|
+
/** 控制通道的 WebSocket URL 路径,客户端连接地址为 ws://host:{CONTROL_PORT}{CONTROL_PATH} */
|
|
56
99
|
CONTROL_PATH: '/control',
|
|
57
|
-
|
|
58
|
-
HEARTBEAT_INTERVAL: 30000,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
100
|
+
/** 心跳发送间隔时间,单位毫秒(默认 30 秒) */
|
|
101
|
+
HEARTBEAT_INTERVAL: 30000,
|
|
102
|
+
/** 心跳超时时间,超过此时间未收到心跳视为断连,单位毫秒(默认 60 秒) */
|
|
103
|
+
HEARTBEAT_TIMEOUT: 60000,
|
|
104
|
+
/** 会话超时时间,超时后会话将被清理,单位毫秒(默认 2 分钟) */
|
|
105
|
+
SESSION_TIMEOUT: 120000,
|
|
106
|
+
/** 断线重连间隔时间,单位毫秒(默认 5 秒) */
|
|
107
|
+
RECONNECT_INTERVAL: 5000,
|
|
108
|
+
/** 最大重连尝试次数(默认 10 次) */
|
|
109
|
+
MAX_RECONNECT_ATTEMPTS: 10,
|
|
110
|
+
/** 允许注册的最小端口号 */
|
|
66
111
|
MIN_PORT: 1024,
|
|
112
|
+
/** 允许注册的最大端口号 */
|
|
67
113
|
MAX_PORT: 65535,
|
|
68
|
-
|
|
69
|
-
BUFFER_SIZE: 64 * 1024,
|
|
114
|
+
/** 数据传输缓冲区大小,单位字节(默认 64KB) */
|
|
115
|
+
BUFFER_SIZE: 64 * 1024,
|
|
70
116
|
};
|
|
71
117
|
//# sourceMappingURL=protocol.js.map
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,cAAc;IACd,OAAO,EAAE,OAAO;IAChB,gEAAgE;IAChE,YAAY,EAAE,UAAU;CAChB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAN,IAAY,SAwBX;AAxBD,WAAY,SAAS;IACnB,oBAAoB;IACpB,wCAA2B,CAAA;IAC3B,0BAA0B;IAC1B,0CAA6B,CAAA;IAE7B,2BAA2B;IAC3B,gEAAmD,CAAA;IACnD,eAAe;IACf,oDAAuC,CAAA;IACvC,YAAY;IACZ,0CAA6B,CAAA;IAE7B,eAAe;IACf,0DAA6C,CAAA;IAC7C,WAAW;IACX,sDAAyC,CAAA;IACzC,gBAAgB;IAChB,kDAAqC,CAAA;IAErC,cAAc;IACd,gDAAmC,CAAA;IACnC,cAAc;IACd,8CAAiC,CAAA;AACnC,CAAC,EAxBW,SAAS,KAAT,SAAS,QAwBpB;AAED;;;;;GAKG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC;;;;;OAKG;IACH,YACS,IAAe,EACtB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAW;QAItB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,EAAE,EAAE,GAAG;IACP,aAAa;IACb,WAAW,EAAE,GAAG;IAChB,eAAe;IACf,YAAY,EAAE,GAAG;IACjB,eAAe;IACf,SAAS,EAAE,GAAG;IACd,cAAc;IACd,qBAAqB,EAAE,GAAG;IAC1B,mBAAmB;IACnB,WAAW,EAAE,GAAG;IAChB,YAAY;IACZ,mBAAmB,EAAE,GAAG;CAChB,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uDAAuD;IACvD,YAAY,EAAE,IAAI;IAClB,6EAA6E;IAC7E,YAAY,EAAE,UAAU;IAExB,6BAA6B;IAC7B,kBAAkB,EAAE,KAAK;IACzB,0CAA0C;IAC1C,iBAAiB,EAAE,KAAK;IAExB,qCAAqC;IACrC,eAAe,EAAE,MAAM;IAEvB,4BAA4B;IAC5B,kBAAkB,EAAE,IAAI;IACxB,wBAAwB;IACxB,sBAAsB,EAAE,EAAE;IAE1B,iBAAiB;IACjB,QAAQ,EAAE,IAAI;IACd,iBAAiB;IACjB,QAAQ,EAAE,KAAK;IAEf,8BAA8B;IAC9B,WAAW,EAAE,EAAE,GAAG,IAAI;CACd,CAAC"}
|