@thejrsoft/subway-protocol 1.3.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/ACK_MESSAGES_IMPLEMENTATION_SUMMARY.md +128 -0
- package/ACK_MESSAGE_DESIGN.md +457 -0
- package/CHANGELOG.md +58 -0
- package/COMMAND_VALIDATION_RULES.md +178 -0
- package/DOCUMENTATION_REORGANIZATION_SUMMARY.md +81 -0
- package/DOCUMENTATION_STRUCTURE.md +106 -0
- package/GATEWAY_MIGRATION_GUIDE.md +130 -0
- package/GATEWAY_PROTOCOL_COMPARISON.md +216 -0
- package/INTEGRATION_GUIDE.md +190 -0
- package/OPTIONAL_FIELDS_WITHOUT_DEFAULTS.md +97 -0
- package/PROTOCOL_UTILS_USAGE.md +278 -0
- package/README.md +237 -0
- package/TYPE_FIXES_SUMMARY.md +210 -0
- package/UPDATE_ENUM_VALUES.md +139 -0
- package/dist/asyncapi-sync.d.ts +47 -0
- package/dist/asyncapi-sync.d.ts.map +1 -0
- package/dist/asyncapi-sync.js +85 -0
- package/dist/asyncapi-sync.js.map +1 -0
- package/dist/command-factory.d.ts +62 -0
- package/dist/command-factory.d.ts.map +1 -0
- package/dist/command-factory.js +137 -0
- package/dist/command-factory.js.map +1 -0
- package/dist/command-types.d.ts +27 -0
- package/dist/command-types.d.ts.map +1 -0
- package/dist/command-types.js +31 -0
- package/dist/command-types.js.map +1 -0
- package/dist/index.d.ts +403 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +413 -0
- package/dist/index.js.map +1 -0
- package/dist/message-validator.d.ts +102 -0
- package/dist/message-validator.d.ts.map +1 -0
- package/dist/message-validator.js +640 -0
- package/dist/message-validator.js.map +1 -0
- package/dist/protocol-utils.d.ts +108 -0
- package/dist/protocol-utils.d.ts.map +1 -0
- package/dist/protocol-utils.js +293 -0
- package/dist/protocol-utils.js.map +1 -0
- package/docs/01-protocol/README.md +45 -0
- package/docs/01-protocol/design-rationale.md +198 -0
- package/docs/01-protocol/message-types.md +669 -0
- package/docs/01-protocol/specification.md +1466 -0
- package/docs/02-commands/README.md +56 -0
- package/docs/02-commands/batch-command.md +435 -0
- package/docs/02-commands/complex-command.md +537 -0
- package/docs/02-commands/simple-command.md +332 -0
- package/docs/02-commands/typed-commands.md +362 -0
- package/docs/03-architecture/README.md +66 -0
- package/docs/03-architecture/device-protocol.md +430 -0
- package/docs/03-architecture/edge-proxy.md +727 -0
- package/docs/03-architecture/routing-flow.md +893 -0
- package/docs/04-integration/README.md +144 -0
- package/docs/04-integration/backend-guide.md +551 -0
- package/docs/04-integration/edge-guide.md +684 -0
- package/docs/04-integration/gateway-guide.md +180 -0
- package/docs/04-integration/migration-guide.md +226 -0
- package/docs/05-examples/README.md +141 -0
- package/docs/05-examples/progress-update-examples.md +757 -0
- package/docs/06-reference/README.md +67 -0
- package/docs/06-reference/api.md +572 -0
- package/docs/06-reference/faq.md +302 -0
- package/docs/06-reference/glossary.md +232 -0
- package/examples/backend-upgrade.ts +279 -0
- package/examples/edge-multi-device.ts +513 -0
- package/examples/gateway-upgrade.ts +150 -0
- package/examples/protocol-implementation.ts +715 -0
- package/package.json +48 -0
- package/scripts/validate-asyncapi.ts +78 -0
- package/src/__tests__/protocol.test.ts +297 -0
- package/src/asyncapi-sync.ts +84 -0
- package/src/command-factory.ts +183 -0
- package/src/command-types.ts +72 -0
- package/src/edge-proxy.ts +494 -0
- package/src/gateway-extensions.ts +278 -0
- package/src/index.ts +792 -0
- package/src/message-validator.ts +726 -0
- package/src/protocol-utils.ts +355 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 强类型命令工厂
|
|
4
|
+
*
|
|
5
|
+
* 提供类型安全的命令创建和验证功能
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.toTypedCommand = exports.validateCommand = exports.createExampleCommand = exports.CommandTypeConverter = exports.CommandTypeValidator = exports.TypedCommandFactory = void 0;
|
|
9
|
+
const index_1 = require("./index");
|
|
10
|
+
/**
|
|
11
|
+
* 强类型命令消息工厂
|
|
12
|
+
*/
|
|
13
|
+
class TypedCommandFactory {
|
|
14
|
+
/**
|
|
15
|
+
* 创建强类型命令消息
|
|
16
|
+
*/
|
|
17
|
+
static createTypedCommandMessage(requestRef, targetClientId, commandCode, commandProps, options) {
|
|
18
|
+
const command = {
|
|
19
|
+
commandCode,
|
|
20
|
+
...commandProps
|
|
21
|
+
};
|
|
22
|
+
return index_1.MessageFactory.createCommandMessage(requestRef, targetClientId, command, options?.callback || '', // callback 是必需的,如果未提供则使用空字符串
|
|
23
|
+
{
|
|
24
|
+
priority: options?.priority,
|
|
25
|
+
timeout: options?.timeout
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 示例:创建命令的工厂方法
|
|
30
|
+
*
|
|
31
|
+
* 实际使用时,应该为每个从 C# 生成的命令创建对应的工厂方法
|
|
32
|
+
* 例如: createLedSwitchCommand, createBlockPlayCommand 等
|
|
33
|
+
*/
|
|
34
|
+
static createExampleCommand(requestRef, targetClientId, deviceId, exampleField, exampleValue, operationType = index_1.OperationType.WRITE, options) {
|
|
35
|
+
return this.createTypedCommandMessage(requestRef, targetClientId, 'ExampleCommand', {
|
|
36
|
+
commandType: index_1.CommandType.SIMPLE,
|
|
37
|
+
deviceType: 'example',
|
|
38
|
+
deviceId,
|
|
39
|
+
operationType,
|
|
40
|
+
parameters: { exampleField, exampleValue }
|
|
41
|
+
}, options);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.TypedCommandFactory = TypedCommandFactory;
|
|
45
|
+
/**
|
|
46
|
+
* 命令类型验证器
|
|
47
|
+
*/
|
|
48
|
+
class CommandTypeValidator {
|
|
49
|
+
/**
|
|
50
|
+
* 验证命令是否符合强类型定义
|
|
51
|
+
*/
|
|
52
|
+
static validateCommand(command) {
|
|
53
|
+
const errors = [];
|
|
54
|
+
if (!command) {
|
|
55
|
+
errors.push('Command is null or undefined');
|
|
56
|
+
return { valid: false, errors };
|
|
57
|
+
}
|
|
58
|
+
if (!command.commandCode || typeof command.commandCode !== 'string') {
|
|
59
|
+
errors.push('commandCode is required and must be a string');
|
|
60
|
+
}
|
|
61
|
+
if (!command.deviceType || typeof command.deviceType !== 'string') {
|
|
62
|
+
errors.push('deviceType is required and must be a string');
|
|
63
|
+
}
|
|
64
|
+
if (!command.operationType || !Object.values(index_1.OperationType).includes(command.operationType)) {
|
|
65
|
+
errors.push('operationType must be READ or WRITE');
|
|
66
|
+
}
|
|
67
|
+
// 根据具体的 commandCode 进行详细验证
|
|
68
|
+
switch (command.commandCode) {
|
|
69
|
+
case 'ExampleCommand':
|
|
70
|
+
this.validateExampleCommand(command, errors);
|
|
71
|
+
break;
|
|
72
|
+
// TODO: 实际使用时,为每个真实命令添加验证
|
|
73
|
+
// case 'LedSwitch':
|
|
74
|
+
// this.validateLedSwitchCommand(command, errors);
|
|
75
|
+
// break;
|
|
76
|
+
default:
|
|
77
|
+
// 对于未知的命令类型,只做基本验证
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
return { valid: errors.length === 0, errors };
|
|
81
|
+
}
|
|
82
|
+
static validateExampleCommand(command, errors) {
|
|
83
|
+
if (command.deviceType !== 'example') {
|
|
84
|
+
errors.push('ExampleCommand requires deviceType to be "example"');
|
|
85
|
+
}
|
|
86
|
+
if (command.parameters) {
|
|
87
|
+
if (typeof command.parameters.exampleField !== 'string') {
|
|
88
|
+
errors.push('ExampleCommand parameters.exampleField must be a string');
|
|
89
|
+
}
|
|
90
|
+
if (typeof command.parameters.exampleValue !== 'number') {
|
|
91
|
+
errors.push('ExampleCommand parameters.exampleValue must be a number');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.CommandTypeValidator = CommandTypeValidator;
|
|
97
|
+
/**
|
|
98
|
+
* 命令类型转换器
|
|
99
|
+
*/
|
|
100
|
+
class CommandTypeConverter {
|
|
101
|
+
/**
|
|
102
|
+
* 将通用命令转换为强类型命令
|
|
103
|
+
*/
|
|
104
|
+
static toTypedCommand(genericCommand) {
|
|
105
|
+
const validation = CommandTypeValidator.validateCommand(genericCommand);
|
|
106
|
+
if (!validation.valid) {
|
|
107
|
+
console.warn('Command validation failed:', validation.errors);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
// 根据 commandCode 转换为具体的强类型
|
|
111
|
+
switch (genericCommand.commandCode) {
|
|
112
|
+
case 'ExampleCommand':
|
|
113
|
+
return genericCommand;
|
|
114
|
+
// TODO: 实际使用时,为每个真实命令添加转换
|
|
115
|
+
// case 'LedSwitch':
|
|
116
|
+
// return genericCommand as import('./command-types').LedSwitchCommand;
|
|
117
|
+
default:
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 检查命令是否为强类型命令
|
|
123
|
+
*/
|
|
124
|
+
static isTypedCommand(command) {
|
|
125
|
+
return command && this.toTypedCommand(command) !== null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.CommandTypeConverter = CommandTypeConverter;
|
|
129
|
+
// 导出便捷的工厂函数
|
|
130
|
+
exports.createExampleCommand = TypedCommandFactory.createExampleCommand.bind(TypedCommandFactory);
|
|
131
|
+
// TODO: 实际使用时,导出真实的命令工厂函数
|
|
132
|
+
// export const createLedSwitchCommand = TypedCommandFactory.createLedSwitchCommand.bind(TypedCommandFactory);
|
|
133
|
+
// export const createBlockPlayCommand = TypedCommandFactory.createBlockPlayCommand.bind(TypedCommandFactory);
|
|
134
|
+
// 导出验证函数
|
|
135
|
+
exports.validateCommand = CommandTypeValidator.validateCommand.bind(CommandTypeValidator);
|
|
136
|
+
exports.toTypedCommand = CommandTypeConverter.toTypedCommand.bind(CommandTypeConverter);
|
|
137
|
+
//# sourceMappingURL=command-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-factory.js","sourceRoot":"","sources":["../src/command-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令类型定义 - 桥接 C# 生成的类型
|
|
3
|
+
*
|
|
4
|
+
* 这个文件作为适配层,将 C# 模型生成的 TypeScript 类型
|
|
5
|
+
* 与 WebSocket 协议层连接起来,处理字段名称差异
|
|
6
|
+
*/
|
|
7
|
+
import { CommandType } from './index';
|
|
8
|
+
export interface ExampleCommandParameters {
|
|
9
|
+
exampleField: string;
|
|
10
|
+
exampleValue: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ExampleCommand {
|
|
13
|
+
commandType: CommandType;
|
|
14
|
+
commandCode: string;
|
|
15
|
+
deviceType: string;
|
|
16
|
+
deviceId: number | number[] | string;
|
|
17
|
+
operationType: string;
|
|
18
|
+
parameters?: ExampleCommandParameters;
|
|
19
|
+
}
|
|
20
|
+
export type SpecificCommand = ExampleCommand;
|
|
21
|
+
export interface CommandTypeMap {
|
|
22
|
+
'ExampleCommand': ExampleCommand;
|
|
23
|
+
}
|
|
24
|
+
export declare function createTypedCommand<T extends keyof CommandTypeMap>(commandCode: T, baseProps: Omit<CommandTypeMap[T], 'commandCode'>): CommandTypeMap[T];
|
|
25
|
+
export declare function isExampleCommand(cmd: any): cmd is ExampleCommand;
|
|
26
|
+
export declare function isSpecificCommand(cmd: any): cmd is SpecificCommand;
|
|
27
|
+
//# sourceMappingURL=command-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-types.d.ts","sourceRoot":"","sources":["../src/command-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiB,WAAW,EAAE,MAAM,SAAS,CAAC;AASrD,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,wBAAwB,CAAC;CACvC;AAMD,MAAM,MAAM,eAAe,GACvB,cAAc,CAEf;AAGH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,cAAc,CAAC;CAIlC;AAGD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,cAAc,EAC/D,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,GAChD,cAAc,CAAC,CAAC,CAAC,CAKnB;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,cAAc,CAEhE;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAMlE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 命令类型定义 - 桥接 C# 生成的类型
|
|
4
|
+
*
|
|
5
|
+
* 这个文件作为适配层,将 C# 模型生成的 TypeScript 类型
|
|
6
|
+
* 与 WebSocket 协议层连接起来,处理字段名称差异
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createTypedCommand = createTypedCommand;
|
|
10
|
+
exports.isExampleCommand = isExampleCommand;
|
|
11
|
+
exports.isSpecificCommand = isSpecificCommand;
|
|
12
|
+
// 类型安全的命令创建器
|
|
13
|
+
function createTypedCommand(commandCode, baseProps) {
|
|
14
|
+
return {
|
|
15
|
+
commandCode,
|
|
16
|
+
...baseProps
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// 示例类型守卫
|
|
20
|
+
function isExampleCommand(cmd) {
|
|
21
|
+
return cmd?.commandCode === 'ExampleCommand';
|
|
22
|
+
}
|
|
23
|
+
// 通用类型守卫
|
|
24
|
+
function isSpecificCommand(cmd) {
|
|
25
|
+
return cmd && typeof cmd.commandCode === 'string' &&
|
|
26
|
+
cmd.commandCode in {
|
|
27
|
+
'ExampleCommand': true,
|
|
28
|
+
// TODO: 实际使用时,这里应该包含所有真实的命令
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=command-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-types.js","sourceRoot":"","sources":["../src/command-types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA4CH,gDAQC;AAGD,4CAEC;AAGD,8CAMC;AAvBD,aAAa;AACb,SAAgB,kBAAkB,CAChC,WAAc,EACd,SAAiD;IAEjD,OAAO;QACL,WAAW;QACX,GAAG,SAAS;KACQ,CAAC;AACzB,CAAC;AAED,SAAS;AACT,SAAgB,gBAAgB,CAAC,GAAQ;IACvC,OAAO,GAAG,EAAE,WAAW,KAAK,gBAAgB,CAAC;AAC/C,CAAC;AAED,SAAS;AACT,SAAgB,iBAAiB,CAAC,GAAQ;IACxC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;QAC1C,GAAG,CAAC,WAAW,IAAK;YAClB,gBAAgB,EAAE,IAAI;YACtB,4BAA4B;SACa,CAAC;AACrD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JRSoft Subway 统一WebSocket协议定义
|
|
3
|
+
* 版本: 1.0
|
|
4
|
+
*
|
|
5
|
+
* 功能特性:
|
|
6
|
+
* 1. 统一消息格式定义
|
|
7
|
+
* 2. 支持设备注册、命令执行、心跳等核心功能
|
|
8
|
+
* 3. 支持 Edge 代理模式
|
|
9
|
+
*/
|
|
10
|
+
export declare enum MessageType {
|
|
11
|
+
REGISTER = "REGISTER",
|
|
12
|
+
REGISTER_ACK = "REGISTER_ACK",
|
|
13
|
+
UNREGISTER = "UNREGISTER",
|
|
14
|
+
UNREGISTER_ACK = "UNREGISTER_ACK",
|
|
15
|
+
HEARTBEAT = "HEARTBEAT",
|
|
16
|
+
HEARTBEAT_ACK = "HEARTBEAT_ACK",
|
|
17
|
+
COMMAND = "COMMAND",
|
|
18
|
+
COMMAND_RESPONSE = "COMMAND_RESPONSE",
|
|
19
|
+
PROGRAM = "PROGRAM",
|
|
20
|
+
PROGRAM_RESPONSE = "PROGRAM_RESPONSE",
|
|
21
|
+
PROGRESS_UPDATE = "PROGRESS_UPDATE",
|
|
22
|
+
ERROR = "ERROR"
|
|
23
|
+
}
|
|
24
|
+
export declare enum ClientType {
|
|
25
|
+
DEVICE = "DEVICE",
|
|
26
|
+
BACKEND = "BACKEND",
|
|
27
|
+
EDGE = "EDGE",
|
|
28
|
+
GATEWAY = "GATEWAY"
|
|
29
|
+
}
|
|
30
|
+
export declare enum OperationType {
|
|
31
|
+
READ = "READ",
|
|
32
|
+
WRITE = "WRITE",
|
|
33
|
+
QUERY = "QUERY",
|
|
34
|
+
UPDATE = "UPDATE",
|
|
35
|
+
CONTROL = "CONTROL"
|
|
36
|
+
}
|
|
37
|
+
export declare enum Priority {
|
|
38
|
+
LOW = "LOW",
|
|
39
|
+
NORMAL = "NORMAL",
|
|
40
|
+
HIGH = "HIGH",
|
|
41
|
+
CRITICAL = "CRITICAL",
|
|
42
|
+
EMERGENCY = "EMERGENCY"
|
|
43
|
+
}
|
|
44
|
+
export declare enum CommandStatus {
|
|
45
|
+
COMPLETED = "COMPLETED",
|
|
46
|
+
FAILED = "FAILED",
|
|
47
|
+
TIMEOUT = "TIMEOUT",
|
|
48
|
+
CANCELLED = "CANCELLED",
|
|
49
|
+
IN_PROGRESS = "IN_PROGRESS"
|
|
50
|
+
}
|
|
51
|
+
export interface BaseMessage {
|
|
52
|
+
type: MessageType;
|
|
53
|
+
timestamp: string;
|
|
54
|
+
version: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ClientInfo {
|
|
57
|
+
name?: string;
|
|
58
|
+
version?: string;
|
|
59
|
+
platform?: string;
|
|
60
|
+
capabilities?: string[];
|
|
61
|
+
deviceType?: string;
|
|
62
|
+
description?: string;
|
|
63
|
+
metadata?: Record<string, any>;
|
|
64
|
+
}
|
|
65
|
+
export interface EdgeInfo {
|
|
66
|
+
edgeId: string;
|
|
67
|
+
edgeVersion?: string;
|
|
68
|
+
connectionTime?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface RegisterMessage extends BaseMessage {
|
|
71
|
+
type: MessageType.REGISTER;
|
|
72
|
+
clientId: string;
|
|
73
|
+
clientType: ClientType;
|
|
74
|
+
clientInfo?: ClientInfo;
|
|
75
|
+
edgeInfo?: EdgeInfo;
|
|
76
|
+
}
|
|
77
|
+
export interface RegisterAckMessage extends BaseMessage {
|
|
78
|
+
type: MessageType.REGISTER_ACK;
|
|
79
|
+
clientId: string;
|
|
80
|
+
success: boolean;
|
|
81
|
+
sessionId?: string;
|
|
82
|
+
error?: {
|
|
83
|
+
code: string;
|
|
84
|
+
message: string;
|
|
85
|
+
};
|
|
86
|
+
serverInfo?: {
|
|
87
|
+
version: string;
|
|
88
|
+
capabilities: string[];
|
|
89
|
+
currentLoad?: number;
|
|
90
|
+
maxClients?: number;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export interface UnregisterMessage extends BaseMessage {
|
|
94
|
+
type: MessageType.UNREGISTER;
|
|
95
|
+
clientId: string;
|
|
96
|
+
reason?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface UnregisterAckMessage extends BaseMessage {
|
|
99
|
+
type: MessageType.UNREGISTER_ACK;
|
|
100
|
+
clientId: string;
|
|
101
|
+
success: boolean;
|
|
102
|
+
cleanupInfo?: {
|
|
103
|
+
messagesProcessed: number;
|
|
104
|
+
pendingMessages: number;
|
|
105
|
+
connectionDuration: number;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
import type { SpecificCommand as ImportedSpecificCommand, CommandTypeMap as ImportedCommandTypeMap } from './command-types';
|
|
109
|
+
export type SpecificCommand = ImportedSpecificCommand;
|
|
110
|
+
export type CommandTypeMap = ImportedCommandTypeMap;
|
|
111
|
+
export interface BaseCommand {
|
|
112
|
+
commandCode: string;
|
|
113
|
+
parameters?: Record<string, any>;
|
|
114
|
+
}
|
|
115
|
+
export interface SimpleCommand extends BaseCommand {
|
|
116
|
+
commandType: CommandType.SIMPLE;
|
|
117
|
+
deviceId: number | string;
|
|
118
|
+
deviceType: string;
|
|
119
|
+
operationType: OperationType;
|
|
120
|
+
}
|
|
121
|
+
export interface BatchCommand extends BaseCommand {
|
|
122
|
+
commandType: CommandType.BATCH;
|
|
123
|
+
deviceId: number[] | string;
|
|
124
|
+
deviceType: string;
|
|
125
|
+
operationType: OperationType;
|
|
126
|
+
}
|
|
127
|
+
export interface ComplexCommand extends BaseCommand {
|
|
128
|
+
commandType: CommandType.COMPLEX;
|
|
129
|
+
deviceId?: number | number[] | string;
|
|
130
|
+
deviceType?: string;
|
|
131
|
+
operationType?: OperationType;
|
|
132
|
+
}
|
|
133
|
+
export interface GenericCommand extends BaseCommand {
|
|
134
|
+
commandType?: CommandType;
|
|
135
|
+
deviceId?: number | number[] | string;
|
|
136
|
+
deviceType?: string;
|
|
137
|
+
operationType?: OperationType;
|
|
138
|
+
}
|
|
139
|
+
export type Command = SpecificCommand | SimpleCommand | BatchCommand | ComplexCommand | GenericCommand;
|
|
140
|
+
export declare enum CommandType {
|
|
141
|
+
SIMPLE = "SIMPLE",// 点对点命令
|
|
142
|
+
BATCH = "BATCH",// 多设备命令
|
|
143
|
+
COMPLEX = "COMPLEX"
|
|
144
|
+
}
|
|
145
|
+
export interface CommandMessage extends BaseMessage {
|
|
146
|
+
type: MessageType.COMMAND;
|
|
147
|
+
requestRef: string;
|
|
148
|
+
targetClientId: string;
|
|
149
|
+
command: Command;
|
|
150
|
+
priority: Priority;
|
|
151
|
+
timeout: number;
|
|
152
|
+
retryCount?: number;
|
|
153
|
+
callback: string;
|
|
154
|
+
metadata?: Record<string, any>;
|
|
155
|
+
}
|
|
156
|
+
export interface CommandResult {
|
|
157
|
+
deviceType: string;
|
|
158
|
+
deviceId: number | string;
|
|
159
|
+
commandCode: string;
|
|
160
|
+
operationType: OperationType;
|
|
161
|
+
data: Record<string, any>;
|
|
162
|
+
}
|
|
163
|
+
export interface CommandResponseMessage extends BaseMessage {
|
|
164
|
+
type: MessageType.COMMAND_RESPONSE;
|
|
165
|
+
requestRef: string;
|
|
166
|
+
status: CommandStatus;
|
|
167
|
+
result?: CommandResult;
|
|
168
|
+
report?: ReportMessage;
|
|
169
|
+
executionTime?: number;
|
|
170
|
+
}
|
|
171
|
+
export interface HeartbeatMessage extends BaseMessage {
|
|
172
|
+
type: MessageType.HEARTBEAT;
|
|
173
|
+
clientId: string;
|
|
174
|
+
sequence: number;
|
|
175
|
+
clientTime: string;
|
|
176
|
+
}
|
|
177
|
+
export interface HeartbeatAckMessage extends BaseMessage {
|
|
178
|
+
type: MessageType.HEARTBEAT_ACK;
|
|
179
|
+
clientId: string;
|
|
180
|
+
sequence: number;
|
|
181
|
+
clientTime: string;
|
|
182
|
+
serverTime: string;
|
|
183
|
+
latency?: number;
|
|
184
|
+
serverStatus?: {
|
|
185
|
+
healthy: boolean;
|
|
186
|
+
activeConnections: number;
|
|
187
|
+
messageQueueSize: number;
|
|
188
|
+
cpuUsage?: number;
|
|
189
|
+
memoryUsage?: number;
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export interface ErrorMessage extends BaseMessage {
|
|
193
|
+
type: MessageType.ERROR;
|
|
194
|
+
code: string;
|
|
195
|
+
message: string;
|
|
196
|
+
severity?: string;
|
|
197
|
+
category?: string;
|
|
198
|
+
context?: any;
|
|
199
|
+
retryable?: boolean;
|
|
200
|
+
}
|
|
201
|
+
export declare enum ProgramType {
|
|
202
|
+
DYNAMIC = "DYNAMIC",
|
|
203
|
+
STATIC = "STATIC"
|
|
204
|
+
}
|
|
205
|
+
export declare enum ProgramDirection {
|
|
206
|
+
LEFT_TO_RIGHT = "LEFT_TO_RIGHT",
|
|
207
|
+
RIGHT_TO_LEFT = "RIGHT_TO_LEFT"
|
|
208
|
+
}
|
|
209
|
+
export interface ProgramParameters {
|
|
210
|
+
deviceId: string;
|
|
211
|
+
taskId: string;
|
|
212
|
+
programId: string;
|
|
213
|
+
programName: string;
|
|
214
|
+
programNumber: number;
|
|
215
|
+
programType: ProgramType;
|
|
216
|
+
width: number;
|
|
217
|
+
height: number;
|
|
218
|
+
direction: ProgramDirection;
|
|
219
|
+
publishTime: string;
|
|
220
|
+
unpublishTime: string;
|
|
221
|
+
downloadUrl: string;
|
|
222
|
+
checksum: string;
|
|
223
|
+
hashAlgorithm: 'SHA256';
|
|
224
|
+
fileSize: number;
|
|
225
|
+
}
|
|
226
|
+
export interface ProgramMessage extends BaseMessage {
|
|
227
|
+
type: MessageType.PROGRAM;
|
|
228
|
+
requestRef: string;
|
|
229
|
+
targetClientId: string;
|
|
230
|
+
command: {
|
|
231
|
+
commandCode: 'UPLOAD_PROGRAM';
|
|
232
|
+
parameters: ProgramParameters;
|
|
233
|
+
};
|
|
234
|
+
priority: Priority;
|
|
235
|
+
timeout: number;
|
|
236
|
+
callback: string;
|
|
237
|
+
}
|
|
238
|
+
export interface ProgramResponseMessage extends BaseMessage {
|
|
239
|
+
type: MessageType.PROGRAM_RESPONSE;
|
|
240
|
+
requestRef: string;
|
|
241
|
+
status: CommandStatus;
|
|
242
|
+
context?: ProgramContext;
|
|
243
|
+
report?: ReportMessage;
|
|
244
|
+
executionTime?: number;
|
|
245
|
+
}
|
|
246
|
+
export declare enum ProgressPhase {
|
|
247
|
+
DOWNLOAD = "DOWNLOAD",// 下载文件
|
|
248
|
+
DECOMPRESS = "DECOMPRESS",// 解压文件
|
|
249
|
+
PREPROCESS = "PREPROCESS",// 预处理
|
|
250
|
+
FRAMES = "FRAMES",// 创建帧
|
|
251
|
+
UPLOAD = "UPLOAD",// 上传到设备
|
|
252
|
+
STATS = "STATS"
|
|
253
|
+
}
|
|
254
|
+
export interface DeviceOperationRecord {
|
|
255
|
+
commandType: CommandType;
|
|
256
|
+
commandCode: string;
|
|
257
|
+
deviceType: string;
|
|
258
|
+
deviceId: number | string;
|
|
259
|
+
operationType: OperationType;
|
|
260
|
+
result?: Record<string, any>;
|
|
261
|
+
}
|
|
262
|
+
export declare enum ProgressStatus {
|
|
263
|
+
PENDING = "PENDING",
|
|
264
|
+
IN_PROGRESS = "IN_PROGRESS",
|
|
265
|
+
PAUSED = "PAUSED",
|
|
266
|
+
COMPLETED = "COMPLETED",
|
|
267
|
+
FAILED = "FAILED",
|
|
268
|
+
CANCELLED = "CANCELLED"
|
|
269
|
+
}
|
|
270
|
+
export interface ProgramContext {
|
|
271
|
+
taskId: string;
|
|
272
|
+
programId: string;
|
|
273
|
+
programName: string;
|
|
274
|
+
programNumber: number;
|
|
275
|
+
programType: ProgramType;
|
|
276
|
+
}
|
|
277
|
+
export declare enum ReportLevel {
|
|
278
|
+
DEBUG = "DEBUG",
|
|
279
|
+
INFO = "INFO",
|
|
280
|
+
WARNING = "WARNING",
|
|
281
|
+
ERROR = "ERROR",
|
|
282
|
+
CRITICAL = "CRITICAL"
|
|
283
|
+
}
|
|
284
|
+
export interface ReportMessage {
|
|
285
|
+
level: ReportLevel;
|
|
286
|
+
message: string;
|
|
287
|
+
code?: string;
|
|
288
|
+
data?: Record<string, any>;
|
|
289
|
+
}
|
|
290
|
+
export interface ProgressUpdateMessage extends BaseMessage {
|
|
291
|
+
type: MessageType.PROGRESS_UPDATE;
|
|
292
|
+
requestRef: string;
|
|
293
|
+
status: ProgressStatus;
|
|
294
|
+
phase: ProgressPhase | string;
|
|
295
|
+
progress: number;
|
|
296
|
+
sourceType: 'COMMAND' | 'SYSTEM';
|
|
297
|
+
context?: ProgramContext;
|
|
298
|
+
command?: DeviceOperationRecord;
|
|
299
|
+
report?: ReportMessage;
|
|
300
|
+
timestamp: string;
|
|
301
|
+
version: string;
|
|
302
|
+
}
|
|
303
|
+
export declare function isRegisterMessage(msg: any): msg is RegisterMessage;
|
|
304
|
+
export declare function isRegisterAckMessage(msg: any): msg is RegisterAckMessage;
|
|
305
|
+
export declare function isUnregisterMessage(msg: any): msg is UnregisterMessage;
|
|
306
|
+
export declare function isUnregisterAckMessage(msg: any): msg is UnregisterAckMessage;
|
|
307
|
+
export declare function isHeartbeatMessage(msg: any): msg is HeartbeatMessage;
|
|
308
|
+
export declare function isHeartbeatAckMessage(msg: any): msg is HeartbeatAckMessage;
|
|
309
|
+
export declare function isCommandMessage(msg: any): msg is CommandMessage;
|
|
310
|
+
export declare function isCommandResponseMessage(msg: any): msg is CommandResponseMessage;
|
|
311
|
+
export declare function isProgramMessage(msg: any): msg is ProgramMessage;
|
|
312
|
+
export declare function isProgramResponseMessage(msg: any): msg is ProgramResponseMessage;
|
|
313
|
+
export declare function isProgressUpdateMessage(msg: any): msg is ProgressUpdateMessage;
|
|
314
|
+
export declare function isErrorMessage(msg: any): msg is ErrorMessage;
|
|
315
|
+
export declare class MessageFactory {
|
|
316
|
+
/**
|
|
317
|
+
* 创建注册消息
|
|
318
|
+
*/
|
|
319
|
+
static createRegisterMessage(clientId: string, clientType: ClientType, clientInfo?: ClientInfo): RegisterMessage;
|
|
320
|
+
/**
|
|
321
|
+
* 创建命令消息
|
|
322
|
+
*/
|
|
323
|
+
static createCommandMessage(requestRef: string, targetClientId: string, command: Command, callback: string, options?: {
|
|
324
|
+
priority?: Priority;
|
|
325
|
+
timeout?: number;
|
|
326
|
+
retryCount?: number;
|
|
327
|
+
}): CommandMessage;
|
|
328
|
+
/**
|
|
329
|
+
* 创建心跳消息
|
|
330
|
+
*/
|
|
331
|
+
static createHeartbeatMessage(clientId: string, sequence: number): HeartbeatMessage;
|
|
332
|
+
/**
|
|
333
|
+
* 创建注销消息
|
|
334
|
+
*/
|
|
335
|
+
static createUnregisterMessage(clientId: string, reason?: string): UnregisterMessage;
|
|
336
|
+
/**
|
|
337
|
+
* 创建程序上传消息
|
|
338
|
+
*/
|
|
339
|
+
static createProgramMessage(requestRef: string, targetClientId: string, parameters: ProgramParameters, callback: string, options?: {
|
|
340
|
+
priority?: Priority;
|
|
341
|
+
timeout?: number;
|
|
342
|
+
}): ProgramMessage;
|
|
343
|
+
/**
|
|
344
|
+
* 创建进度更新消息
|
|
345
|
+
*/
|
|
346
|
+
static createProgressUpdateMessage(requestRef: string, phase: ProgressPhase | string, progress: number, message?: string, status?: ProgressStatus, options?: {
|
|
347
|
+
level?: ReportLevel;
|
|
348
|
+
code?: string;
|
|
349
|
+
data?: Record<string, any>;
|
|
350
|
+
context?: ProgramContext;
|
|
351
|
+
command?: DeviceOperationRecord;
|
|
352
|
+
}): ProgressUpdateMessage;
|
|
353
|
+
/**
|
|
354
|
+
* 创建命令响应消息 (Backend 急需)
|
|
355
|
+
*/
|
|
356
|
+
static createCommandResponseMessage(requestRef: string, status: CommandStatus, result: any, message?: string, options?: {
|
|
357
|
+
executionTime?: number;
|
|
358
|
+
report?: ReportMessage;
|
|
359
|
+
version?: string;
|
|
360
|
+
commandStartTime?: number;
|
|
361
|
+
}): CommandResponseMessage;
|
|
362
|
+
/**
|
|
363
|
+
* 创建程序响应消息
|
|
364
|
+
*/
|
|
365
|
+
static createProgramResponseMessage(requestRef: string, status: CommandStatus, result: any, message?: string, options?: {
|
|
366
|
+
executionTime?: number;
|
|
367
|
+
programStartTime?: number;
|
|
368
|
+
}): ProgramResponseMessage;
|
|
369
|
+
/**
|
|
370
|
+
* 创建错误消息 (Gateway & Backend 都需要)
|
|
371
|
+
*/
|
|
372
|
+
static createErrorMessage(code: string, message: string, requestRef?: string, options?: {
|
|
373
|
+
level?: ReportLevel;
|
|
374
|
+
data?: Record<string, any>;
|
|
375
|
+
severity?: string;
|
|
376
|
+
category?: string;
|
|
377
|
+
retryable?: boolean;
|
|
378
|
+
}): ErrorMessage;
|
|
379
|
+
/**
|
|
380
|
+
* 创建心跳确认消息 (Gateway 急需)
|
|
381
|
+
*/
|
|
382
|
+
static createHeartbeatAckMessage(sequence: number, clientId?: string, clientTime?: string, options?: {
|
|
383
|
+
latency?: number;
|
|
384
|
+
heartbeatReceivedTime?: number;
|
|
385
|
+
}): HeartbeatAckMessage;
|
|
386
|
+
/**
|
|
387
|
+
* 创建注册确认消息 (Gateway 需要)
|
|
388
|
+
*/
|
|
389
|
+
static createRegisterAckMessage(clientId: string, success: boolean, message?: string, sessionId?: string): RegisterAckMessage;
|
|
390
|
+
/**
|
|
391
|
+
* 创建注销确认消息
|
|
392
|
+
*/
|
|
393
|
+
static createUnregisterAckMessage(clientId: string, success: boolean): UnregisterAckMessage;
|
|
394
|
+
}
|
|
395
|
+
export type AnyMessage = RegisterMessage | RegisterAckMessage | UnregisterMessage | UnregisterAckMessage | CommandMessage | CommandResponseMessage | ProgramMessage | ProgramResponseMessage | HeartbeatMessage | HeartbeatAckMessage | ProgressUpdateMessage | ErrorMessage;
|
|
396
|
+
export declare const PROTOCOL_VERSION = "1.0";
|
|
397
|
+
export declare const DEFAULT_TIMEOUT = 10000;
|
|
398
|
+
export declare const DEFAULT_PRIORITY = Priority.NORMAL;
|
|
399
|
+
export * from './command-types';
|
|
400
|
+
export * from './command-factory';
|
|
401
|
+
export { MessageValidator, ValidationResult } from './message-validator';
|
|
402
|
+
export { ProtocolUtils } from './protocol-utils';
|
|
403
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|