@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.
Files changed (78) hide show
  1. package/ACK_MESSAGES_IMPLEMENTATION_SUMMARY.md +128 -0
  2. package/ACK_MESSAGE_DESIGN.md +457 -0
  3. package/CHANGELOG.md +58 -0
  4. package/COMMAND_VALIDATION_RULES.md +178 -0
  5. package/DOCUMENTATION_REORGANIZATION_SUMMARY.md +81 -0
  6. package/DOCUMENTATION_STRUCTURE.md +106 -0
  7. package/GATEWAY_MIGRATION_GUIDE.md +130 -0
  8. package/GATEWAY_PROTOCOL_COMPARISON.md +216 -0
  9. package/INTEGRATION_GUIDE.md +190 -0
  10. package/OPTIONAL_FIELDS_WITHOUT_DEFAULTS.md +97 -0
  11. package/PROTOCOL_UTILS_USAGE.md +278 -0
  12. package/README.md +237 -0
  13. package/TYPE_FIXES_SUMMARY.md +210 -0
  14. package/UPDATE_ENUM_VALUES.md +139 -0
  15. package/dist/asyncapi-sync.d.ts +47 -0
  16. package/dist/asyncapi-sync.d.ts.map +1 -0
  17. package/dist/asyncapi-sync.js +85 -0
  18. package/dist/asyncapi-sync.js.map +1 -0
  19. package/dist/command-factory.d.ts +62 -0
  20. package/dist/command-factory.d.ts.map +1 -0
  21. package/dist/command-factory.js +137 -0
  22. package/dist/command-factory.js.map +1 -0
  23. package/dist/command-types.d.ts +27 -0
  24. package/dist/command-types.d.ts.map +1 -0
  25. package/dist/command-types.js +31 -0
  26. package/dist/command-types.js.map +1 -0
  27. package/dist/index.d.ts +403 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +413 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/message-validator.d.ts +102 -0
  32. package/dist/message-validator.d.ts.map +1 -0
  33. package/dist/message-validator.js +640 -0
  34. package/dist/message-validator.js.map +1 -0
  35. package/dist/protocol-utils.d.ts +108 -0
  36. package/dist/protocol-utils.d.ts.map +1 -0
  37. package/dist/protocol-utils.js +293 -0
  38. package/dist/protocol-utils.js.map +1 -0
  39. package/docs/01-protocol/README.md +45 -0
  40. package/docs/01-protocol/design-rationale.md +198 -0
  41. package/docs/01-protocol/message-types.md +669 -0
  42. package/docs/01-protocol/specification.md +1466 -0
  43. package/docs/02-commands/README.md +56 -0
  44. package/docs/02-commands/batch-command.md +435 -0
  45. package/docs/02-commands/complex-command.md +537 -0
  46. package/docs/02-commands/simple-command.md +332 -0
  47. package/docs/02-commands/typed-commands.md +362 -0
  48. package/docs/03-architecture/README.md +66 -0
  49. package/docs/03-architecture/device-protocol.md +430 -0
  50. package/docs/03-architecture/edge-proxy.md +727 -0
  51. package/docs/03-architecture/routing-flow.md +893 -0
  52. package/docs/04-integration/README.md +144 -0
  53. package/docs/04-integration/backend-guide.md +551 -0
  54. package/docs/04-integration/edge-guide.md +684 -0
  55. package/docs/04-integration/gateway-guide.md +180 -0
  56. package/docs/04-integration/migration-guide.md +226 -0
  57. package/docs/05-examples/README.md +141 -0
  58. package/docs/05-examples/progress-update-examples.md +757 -0
  59. package/docs/06-reference/README.md +67 -0
  60. package/docs/06-reference/api.md +572 -0
  61. package/docs/06-reference/faq.md +302 -0
  62. package/docs/06-reference/glossary.md +232 -0
  63. package/examples/backend-upgrade.ts +279 -0
  64. package/examples/edge-multi-device.ts +513 -0
  65. package/examples/gateway-upgrade.ts +150 -0
  66. package/examples/protocol-implementation.ts +715 -0
  67. package/package.json +48 -0
  68. package/scripts/validate-asyncapi.ts +78 -0
  69. package/src/__tests__/protocol.test.ts +297 -0
  70. package/src/asyncapi-sync.ts +84 -0
  71. package/src/command-factory.ts +183 -0
  72. package/src/command-types.ts +72 -0
  73. package/src/edge-proxy.ts +494 -0
  74. package/src/gateway-extensions.ts +278 -0
  75. package/src/index.ts +792 -0
  76. package/src/message-validator.ts +726 -0
  77. package/src/protocol-utils.ts +355 -0
  78. package/tsconfig.json +24 -0
@@ -0,0 +1,178 @@
1
+ # 命令验证规则说明
2
+
3
+ ## 命令接口设计
4
+
5
+ ### 1. 类型安全的命令接口
6
+
7
+ 为了提供编译时类型安全,我们定义了三个特定的命令接口:
8
+
9
+ ```typescript
10
+ // 简单命令 - 单设备操作
11
+ interface SimpleCommand {
12
+ commandType: CommandType.SIMPLE; // 字面量类型,必须是 'SIMPLE'
13
+ deviceId: number | string; // 单个设备
14
+ deviceType: string; // 必需
15
+ operationType: OperationType; // 必需
16
+ }
17
+
18
+ // 批量命令 - 多设备操作
19
+ interface BatchCommand {
20
+ commandType: CommandType.BATCH; // 字面量类型,必须是 'BATCH'
21
+ deviceId: number[] | string; // 设备数组或范围表达式
22
+ deviceType: string; // 必需
23
+ operationType: OperationType; // 必需
24
+ }
25
+
26
+ // 复杂命令 - 系统级操作
27
+ interface ComplexCommand {
28
+ commandType: CommandType.COMPLEX; // 字面量类型,必须是 'COMPLEX'
29
+ deviceId?: number | number[] | string; // 可选
30
+ deviceType?: string; // 可选
31
+ operationType?: OperationType; // 可选
32
+ }
33
+ ```
34
+
35
+ ### 2. 通用命令接口(GenericCommand)
36
+
37
+ 用于处理运行时动态构建的命令:
38
+
39
+ ```typescript
40
+ interface GenericCommand {
41
+ commandType?: CommandType; // 可选,默认为 SIMPLE
42
+ deviceId?: number | number[] | string;
43
+ deviceType?: string;
44
+ operationType?: OperationType;
45
+ }
46
+ ```
47
+
48
+ **重要**:GenericCommand 的字段都是可选的,但实际验证规则由 `MessageValidator` 在运行时根据 `commandType` 的值动态应用。
49
+
50
+ ## 验证规则
51
+
52
+ ### MessageValidator 的验证逻辑
53
+
54
+ ```typescript
55
+ const commandType = message.command.commandType || CommandType.SIMPLE;
56
+
57
+ switch (commandType) {
58
+ case CommandType.SIMPLE:
59
+ // 必需: deviceType, deviceId, operationType
60
+ // deviceId 必须是单个值(不能是数组)
61
+
62
+ case CommandType.BATCH:
63
+ // 必需: deviceType, deviceId, operationType
64
+ // deviceId 必须是数组或字符串(范围表达式)
65
+
66
+ case CommandType.COMPLEX:
67
+ // 可选: deviceType, deviceId, operationType
68
+ }
69
+ ```
70
+
71
+ ### 验证示例
72
+
73
+ #### 1. SIMPLE 命令验证
74
+
75
+ ```typescript
76
+ // ✅ 有效的 SIMPLE 命令
77
+ const simpleCmd: GenericCommand = {
78
+ commandType: CommandType.SIMPLE,
79
+ commandCode: 'LedSwitch',
80
+ deviceId: 123, // 单个设备
81
+ deviceType: 'pillar',
82
+ operationType: OperationType.WRITE
83
+ };
84
+
85
+ // ❌ 无效的 SIMPLE 命令
86
+ const invalidSimple: GenericCommand = {
87
+ commandType: CommandType.SIMPLE,
88
+ commandCode: 'LedSwitch',
89
+ deviceId: [123, 124], // 错误:SIMPLE 不支持数组
90
+ deviceType: 'pillar',
91
+ operationType: OperationType.WRITE
92
+ };
93
+ // 验证器会报错:"SIMPLE command deviceId must be a single value"
94
+ ```
95
+
96
+ #### 2. BATCH 命令验证
97
+
98
+ ```typescript
99
+ // ✅ 有效的 BATCH 命令
100
+ const batchCmd: GenericCommand = {
101
+ commandType: CommandType.BATCH,
102
+ commandCode: 'LedSwitch',
103
+ deviceId: [123, 124, 125], // 设备数组
104
+ deviceType: 'pillar',
105
+ operationType: OperationType.WRITE
106
+ };
107
+
108
+ // ✅ 也是有效的 BATCH 命令
109
+ const batchRangeCmd: GenericCommand = {
110
+ commandType: CommandType.BATCH,
111
+ commandCode: 'LedSwitch',
112
+ deviceId: '123-130', // 范围表达式
113
+ deviceType: 'pillar',
114
+ operationType: OperationType.WRITE
115
+ };
116
+
117
+ // ❌ 无效的 BATCH 命令
118
+ const invalidBatch: GenericCommand = {
119
+ commandType: CommandType.BATCH,
120
+ commandCode: 'LedSwitch',
121
+ deviceId: 123, // 错误:BATCH 需要数组或字符串
122
+ deviceType: 'pillar',
123
+ operationType: OperationType.WRITE
124
+ };
125
+ // 验证器会报错:"BATCH command deviceId must be an array or string"
126
+ ```
127
+
128
+ #### 3. COMPLEX 命令验证
129
+
130
+ ```typescript
131
+ // ✅ 有效的 COMPLEX 命令(最小配置)
132
+ const complexCmd: GenericCommand = {
133
+ commandType: CommandType.COMPLEX,
134
+ commandCode: 'SystemDiagnostics'
135
+ // deviceId, deviceType, operationType 都是可选的
136
+ };
137
+
138
+ // ✅ 也是有效的 COMPLEX 命令(包含可选字段)
139
+ const complexCmdFull: GenericCommand = {
140
+ commandType: CommandType.COMPLEX,
141
+ commandCode: 'SystemReset',
142
+ deviceId: 'all', // 可以提供但不是必需的
143
+ parameters: { force: true }
144
+ };
145
+ ```
146
+
147
+ ## 为什么这样设计?
148
+
149
+ 1. **类型安全的接口(SimpleCommand, BatchCommand, ComplexCommand)**
150
+ - 编译时类型检查
151
+ - IDE 自动补全
152
+ - 明确的 API 契约
153
+
154
+ 2. **通用接口(GenericCommand)**
155
+ - 处理动态构建的命令
156
+ - 向后兼容
157
+ - 灵活的运行时验证
158
+
159
+ 3. **验证器分离**
160
+ - 业务逻辑与类型定义分离
161
+ - 可以轻松修改验证规则而不影响类型定义
162
+ - 支持自定义验证逻辑
163
+
164
+ ## 使用建议
165
+
166
+ 1. **编写新代码时**:优先使用类型安全的接口(SimpleCommand, BatchCommand, ComplexCommand)
167
+
168
+ 2. **处理外部输入时**:使用 GenericCommand + MessageValidator
169
+
170
+ 3. **类型断言**:
171
+ ```typescript
172
+ // 验证后进行类型断言
173
+ const result = MessageValidator.validateCommandMessage(message);
174
+ if (result.valid && message.command.commandType === CommandType.SIMPLE) {
175
+ const simpleCmd = message.command as SimpleCommand;
176
+ // 现在 TypeScript 知道 deviceId 是 number | string
177
+ }
178
+ ```
@@ -0,0 +1,81 @@
1
+ # 文档重组总结
2
+
3
+ ## 重组完成
4
+
5
+ 已将 jrsoft-subway-protocol 的文档重新组织为清晰的 6 个主题目录结构。
6
+
7
+ ## 新的文档结构
8
+
9
+ ```
10
+ docs/
11
+ ├── 01-protocol/ # 协议规范
12
+ │ ├── README.md # 索引
13
+ │ ├── specification.md # 协议规范(原 PROTOCOL_SPECIFICATION.md)
14
+ │ ├── message-types.md # 消息类型详解(新增)
15
+ │ └── design-rationale.md # 设计理念(原 DESIGN_RATIONALE.md)
16
+
17
+ ├── 02-commands/ # 命令系统
18
+ │ ├── README.md # 索引
19
+ │ ├── simple-command.md # Simple 命令(原 SIMPLE_COMMAND_FLOW.md)
20
+ │ ├── batch-command.md # Batch 命令(合并自两个文档)
21
+ │ ├── complex-command.md # Complex 命令(原 COMPLEX_COMMAND_FLOW.md)
22
+ │ └── typed-commands.md # 强类型命令(合并自两个文档)
23
+
24
+ ├── 03-architecture/ # 架构设计
25
+ │ ├── README.md # 索引
26
+ │ ├── edge-proxy.md # Edge 代理(原 EDGE_PROXY_GUIDE.md)
27
+ │ ├── device-protocol.md # 设备协议(原 device-to-edge-protocol.md)
28
+ │ └── routing-flow.md # 消息路由(新增)
29
+
30
+ ├── 04-integration/ # 集成指南
31
+ │ ├── README.md # 索引
32
+ │ ├── gateway-guide.md # Gateway 指南(原 GATEWAY_INTEGRATION.md)
33
+ │ ├── backend-guide.md # Backend 指南(新增)
34
+ │ ├── edge-guide.md # Edge 指南(新增)
35
+ │ └── migration-guide.md # 迁移指南(原 MIGRATION_GUIDE.md)
36
+
37
+ ├── 05-examples/ # 示例代码
38
+ │ └── README.md # 索引(待补充具体示例)
39
+
40
+ └── 06-reference/ # 参考文档
41
+ └── README.md # 索引(待补充 API 文档等)
42
+ ```
43
+
44
+ ## 主要改进
45
+
46
+ ### 1. 文档合并
47
+ - **批量命令文档**:将 `BATCH_COMMAND_DESIGN.md` 和 `batch-command-specification.md` 合并为统一的 `batch-command.md`
48
+ - **强类型命令文档**:将 `TYPED_COMMANDS_SUMMARY.md` 和 `typed-commands-guide.md` 合并为 `typed-commands.md`
49
+
50
+ ### 2. 新增文档
51
+ - **消息类型详解** (`message-types.md`):从协议规范中提取,专门详解所有消息类型
52
+ - **消息路由流程** (`routing-flow.md`):详细说明系统的消息路由机制
53
+ - **Backend 集成指南** (`backend-guide.md`):完整的 Python/FastAPI 集成示例
54
+ - **Edge 集成指南** (`edge-guide.md`):详细的 Edge 节点实现指南
55
+
56
+ ### 3. 结构优化
57
+ - 每个目录都有 README.md 作为索引
58
+ - 按主题分类,便于查找
59
+ - 从协议→命令→架构→集成的渐进式学习路径
60
+ - 清晰的导航和交叉引用
61
+
62
+ ### 4. 已删除文件
63
+ 移除了以下已迁移的旧文档:
64
+ - 根目录的所有 `.md` 文档(除 README.md 和 CHANGELOG.md)
65
+ - `docs/` 目录下的旧文档
66
+
67
+ ## 后续建议
68
+
69
+ 1. **补充示例代码**:在 `05-examples/` 目录下添加具体的命令示例和流程示例
70
+ 2. **完善 API 文档**:在 `06-reference/` 目录下添加完整的 API 参考文档
71
+ 3. **添加图表**:为架构和流程文档添加更多可视化图表
72
+ 4. **版本管理**:为文档添加版本标记,便于追踪更新
73
+
74
+ ## 文档维护指南
75
+
76
+ 1. **新增功能**:在相应的主题目录下添加文档
77
+ 2. **更新内容**:保持同一主题的内容在同一文档中
78
+ 3. **交叉引用**:使用相对路径链接相关文档
79
+ 4. **索引更新**:修改文档时同步更新目录的 README.md
80
+
81
+ 通过这次重组,文档结构更加清晰,便于开发者查找和学习。
@@ -0,0 +1,106 @@
1
+ # 文档结构优化方案
2
+
3
+ ## 当前问题
4
+
5
+ 1. **文档分散**:根目录和 docs/ 目录都有文档,组织不清晰
6
+ 2. **内容重复**:
7
+ - BATCH_COMMAND_DESIGN.md 和 docs/batch-command-specification.md
8
+ - TYPED_COMMANDS_SUMMARY.md 和 docs/typed-commands-guide.md
9
+ - 多个文档包含类似的命令示例
10
+ 3. **分类混乱**:设计文档、规范文档、实施指南混在一起
11
+ 4. **导航困难**:缺少清晰的文档层次结构
12
+
13
+ ## 新的文档结构
14
+
15
+ ```
16
+ jrsoft-subway-protocol/
17
+ ├── README.md # 项目概述和快速导航
18
+ ├── CHANGELOG.md # 版本变更记录
19
+ ├── docs/
20
+ │ ├── 01-protocol/ # 核心协议规范
21
+ │ │ ├── README.md # 协议概述
22
+ │ │ ├── specification.md # 完整协议规范(合并现有内容)
23
+ │ │ ├── message-types.md # 消息类型详解
24
+ │ │ └── design-rationale.md # 设计理念和决策
25
+ │ │
26
+ │ ├── 02-commands/ # 命令系统文档
27
+ │ │ ├── README.md # 命令系统概述
28
+ │ │ ├── simple-command.md # Simple 命令详解
29
+ │ │ ├── batch-command.md # Batch 命令详解(合并内容)
30
+ │ │ ├── complex-command.md # Complex 命令详解
31
+ │ │ └── typed-commands.md # 强类型命令系统(合并内容)
32
+ │ │
33
+ │ ├── 03-architecture/ # 架构相关文档
34
+ │ │ ├── README.md # 架构概述
35
+ │ │ ├── edge-proxy.md # Edge 代理架构
36
+ │ │ ├── device-protocol.md # 设备到 Edge 协议
37
+ │ │ └── routing-flow.md # 消息路由流程
38
+ │ │
39
+ │ ├── 04-integration/ # 集成和实施指南
40
+ │ │ ├── README.md # 集成概述
41
+ │ │ ├── gateway-guide.md # Gateway 集成指南
42
+ │ │ ├── backend-guide.md # Backend 集成指南
43
+ │ │ ├── edge-guide.md # Edge 集成指南
44
+ │ │ └── migration-guide.md # 迁移指南
45
+ │ │
46
+ │ ├── 05-examples/ # 示例和参考
47
+ │ │ ├── README.md # 示例概述
48
+ │ │ ├── command-examples.md # 各类命令示例
49
+ │ │ ├── flow-examples.md # 流程示例
50
+ │ │ └── code-snippets.md # 代码片段
51
+ │ │
52
+ │ └── 06-reference/ # 参考文档
53
+ │ ├── api.md # API 参考
54
+ │ ├── glossary.md # 术语表
55
+ │ └── faq.md # 常见问题
56
+
57
+ ├── examples/ # 代码示例(保持不变)
58
+ └── src/ # 源代码(保持不变)
59
+ ```
60
+
61
+ ## 文档合并计划
62
+
63
+ ### 1. 批量命令文档合并
64
+ - 将 `BATCH_COMMAND_DESIGN.md` 和 `docs/batch-command-specification.md` 合并
65
+ - 新文件:`docs/02-commands/batch-command.md`
66
+ - 保留最新的 progress_update 设计
67
+ - 整合范围语法示例
68
+
69
+ ### 2. 强类型命令文档合并
70
+ - 将 `TYPED_COMMANDS_SUMMARY.md` 和 `docs/typed-commands-guide.md` 合并
71
+ - 新文件:`docs/02-commands/typed-commands.md`
72
+ - 包含 C# 模型集成内容
73
+
74
+ ### 3. 协议规范整理
75
+ - 将 `PROTOCOL_SPECIFICATION.md` 作为主要规范文档
76
+ - 移除其中的重复示例,引用专门的示例文档
77
+ - 新位置:`docs/01-protocol/specification.md`
78
+
79
+ ### 4. 命令流程文档整理
80
+ - 整合 `SIMPLE_COMMAND_FLOW.md`、`COMPLEX_COMMAND_FLOW.md`
81
+ - 新位置:`docs/02-commands/` 目录下的各自文件
82
+
83
+ ### 5. 架构文档整理
84
+ - `EDGE_PROXY_GUIDE.md` → `docs/03-architecture/edge-proxy.md`
85
+ - `docs/device-to-edge-protocol.md` → `docs/03-architecture/device-protocol.md`
86
+ - 添加消息路由流程文档
87
+
88
+ ### 6. 集成指南整理
89
+ - `GATEWAY_INTEGRATION.md` → `docs/04-integration/gateway-guide.md`
90
+ - `MIGRATION_GUIDE.md` → `docs/04-integration/migration-guide.md`
91
+
92
+ ## 实施步骤
93
+
94
+ 1. 创建新的目录结构
95
+ 2. 逐个合并和迁移文档
96
+ 3. 更新所有内部链接
97
+ 4. 删除旧文档
98
+ 5. 更新 README.md 导航
99
+
100
+ ## 优势
101
+
102
+ 1. **清晰的层次结构**:按主题分类,易于导航
103
+ 2. **避免重复**:相同主题的内容集中在一处
104
+ 3. **渐进式学习**:从协议到命令,从架构到实施
105
+ 4. **便于维护**:每个主题有独立的 README 索引
106
+ 5. **专业性**:符合技术文档的最佳实践
@@ -0,0 +1,130 @@
1
+ # Gateway 迁移到 Protocol 包指南
2
+
3
+ ## 概述
4
+ Gateway 必须完全迁移到使用 `@jrsoft/subway-protocol` 包,Protocol 是唯一的协议标准。
5
+
6
+ ## 迁移原则
7
+ 1. **不修改 Protocol**:Protocol 保持现有的严格定义
8
+ 2. **Gateway 必须适配**:Gateway 需要适配 Protocol 的所有要求
9
+ 3. **不考虑向后兼容**:这是未上线项目,可以进行破坏性更改
10
+
11
+ ## 主要改动点
12
+
13
+ ### 1. 类型定义迁移
14
+ - 删除 `src/types/common.types.ts` 中的消息类型定义
15
+ - 导入并使用 `@jrsoft/subway-protocol` 的类型
16
+
17
+ ### 2. 必需字段适配
18
+ Gateway 需要确保所有消息都包含 Protocol 要求的必需字段:
19
+ - **timestamp**: 所有消息都需要时间戳
20
+ - **version**: 所有消息都需要协议版本
21
+ - **callback**: CommandMessage 必须提供回调 URL
22
+
23
+ ### 3. 枚举类型迁移
24
+ - 使用 Protocol 的枚举类型(ClientType, Priority, CommandStatus 等)
25
+ - 移除字符串字面量,改用枚举
26
+
27
+ ### 4. 需要修改的核心文件
28
+
29
+ #### 消息处理相关
30
+ - `src/ws/message.handler.ts` - 使用 Protocol 的消息类型
31
+ - `src/ws/websocket.handler.ts` - 使用 Protocol 的类型守卫
32
+ - `src/dispatcher/command.dispatcher.ts` - 使用 Protocol 的 Command 类型
33
+
34
+ #### API 控制器
35
+ - `src/api/device.controller.ts` - 确保 callback 必填
36
+ - `src/api/gateway.controller.ts` - 确保 callback 必填
37
+ - `src/api/enhanced-device.controller.ts` - 使用 Protocol 类型
38
+
39
+ #### 工具和回调
40
+ - `src/callback/callback.handler.ts` - 使用 Protocol 的响应类型
41
+ - `src/callback/enhanced-callback.handler.ts` - 使用 Protocol 的消息类型
42
+ - `src/utils/message.factory.ts` - 删除,使用 Protocol 的 MessageFactory
43
+
44
+ ## 具体迁移步骤
45
+
46
+ ### Step 1: 安装 Protocol 包
47
+ ```bash
48
+ cd jrsoft-subway-gateway
49
+ npm install @jrsoft/subway-protocol@latest
50
+ ```
51
+
52
+ ### Step 2: 更新导入
53
+ 将所有本地类型导入改为从 Protocol 包导入:
54
+ ```typescript
55
+ // Before
56
+ import { CommandMessage, BaseMessage } from '../types/common.types';
57
+
58
+ // After
59
+ import { CommandMessage, BaseMessage, MessageType, ClientType } from '@jrsoft/subway-protocol';
60
+ ```
61
+
62
+ ### Step 3: 适配必需字段
63
+ 确保所有创建的消息都包含必需字段:
64
+ ```typescript
65
+ // 创建命令时必须提供 callback
66
+ const commandMessage = MessageFactory.createCommandMessage(
67
+ requestRef,
68
+ targetClientId,
69
+ command,
70
+ callbackUrl, // 必需,不能为空
71
+ { priority, timeout }
72
+ );
73
+ ```
74
+
75
+ ### Step 4: 使用 Protocol 的工厂方法
76
+ ```typescript
77
+ import { MessageFactory } from '@jrsoft/subway-protocol';
78
+
79
+ // 使用 Protocol 的工厂方法创建消息
80
+ const registerMessage = MessageFactory.createRegisterMessage(
81
+ clientId,
82
+ ClientType.DEVICE,
83
+ clientInfo
84
+ );
85
+ ```
86
+
87
+ ### Step 5: 使用 Protocol 的验证器
88
+ ```typescript
89
+ import { MessageValidator } from '@jrsoft/subway-protocol';
90
+
91
+ // 验证接收到的消息
92
+ const validation = MessageValidator.validateMessage(message);
93
+ if (!validation.isValid) {
94
+ throw new Error(validation.errors.join(', '));
95
+ }
96
+ ```
97
+
98
+ ## 注意事项
99
+
100
+ ### 1. Callback URL 处理
101
+ - Gateway API 必须要求调用方提供 callback URL
102
+ - 如果调用方确实不需要回调,可以提供一个占位符 URL(如 'http://noop')
103
+ - 在回调处理时检查 URL 是否为占位符,避免不必要的网络请求
104
+
105
+ ### 2. 内部接口保留
106
+ 以下接口是 Gateway 内部使用,不需要迁移到 Protocol:
107
+ - `PendingCommand`
108
+ - `LongRunningCommand`
109
+ - `DeviceConnection`
110
+ - `IDeviceManager`
111
+ - `ICommandDispatcher`
112
+
113
+ ### 3. 常量迁移
114
+ 使用 Protocol 提供的常量:
115
+ ```typescript
116
+ import { PROTOCOL_VERSION, DEFAULT_TIMEOUT, Priority } from '@jrsoft/subway-protocol';
117
+ ```
118
+
119
+ ## 测试策略
120
+ 1. 更新所有单元测试,使用 Protocol 类型
121
+ 2. 更新集成测试,确保消息格式符合 Protocol 标准
122
+ 3. 使用 MessageValidator 验证所有发送和接收的消息
123
+
124
+ ## 完成标准
125
+ - [ ] 所有消息类型使用 Protocol 定义
126
+ - [ ] 所有消息创建使用 MessageFactory
127
+ - [ ] 所有消息验证使用 MessageValidator
128
+ - [ ] 删除本地的重复类型定义
129
+ - [ ] 所有测试通过
130
+ - [ ] callback 字段在所有命令中都是必需的