@ray-js/robot-data-stream 0.0.14 → 0.0.15-beta.10

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 (157) hide show
  1. package/lib/api/sweeperP2p.js +1 -1
  2. package/lib/mqtt/createCommonOptions.d.ts +4 -2
  3. package/lib/mqtt/createCommonOptions.js +10 -5
  4. package/lib/mqtt/hooks/useStructuredMessage.d.ts +17 -0
  5. package/lib/mqtt/hooks/useStructuredMessage.js +206 -0
  6. package/lib/mqtt/mqttProvider.d.ts +28 -1
  7. package/lib/mqtt/mqttProvider.js +72 -9
  8. package/lib/mqtt/promise.d.ts +57 -4
  9. package/lib/mqtt/promise.js +115 -36
  10. package/lib/mqtt/type/fun.d.ts +233 -0
  11. package/lib/mqtt/type/fun.js +145 -0
  12. package/lib/mqtt/type/index.d.ts +0 -7
  13. package/lib/mqtt/type/index.js +0 -1
  14. package/lib/mqtt/type/protocols/base.d.ts +21 -0
  15. package/lib/mqtt/type/protocols/base.js +32 -0
  16. package/lib/mqtt/type/protocols/carpetCleanProtocol.d.ts +14 -0
  17. package/lib/mqtt/type/protocols/carpetCleanProtocol.js +14 -0
  18. package/lib/mqtt/type/protocols/carpetProtocol.d.ts +102 -0
  19. package/lib/mqtt/type/protocols/carpetProtocol.js +202 -0
  20. package/lib/mqtt/type/protocols/devInfoProtocol.d.ts +11 -0
  21. package/lib/mqtt/type/protocols/devInfoProtocol.js +10 -0
  22. package/lib/mqtt/type/protocols/deviceModelProtocol.d.ts +31 -0
  23. package/lib/mqtt/type/protocols/deviceModelProtocol.js +32 -0
  24. package/lib/mqtt/type/protocols/furnitureModelProtocol.d.ts +27 -0
  25. package/lib/mqtt/type/protocols/furnitureModelProtocol.js +27 -0
  26. package/lib/mqtt/type/protocols/historyMapProtocol.d.ts +39 -0
  27. package/lib/mqtt/type/protocols/historyMapProtocol.js +37 -0
  28. package/lib/mqtt/type/protocols/index.d.ts +20 -0
  29. package/lib/mqtt/type/protocols/index.js +20 -0
  30. package/lib/mqtt/type/protocols/partDivisionProtocol.d.ts +20 -0
  31. package/lib/mqtt/type/protocols/partDivisionProtocol.js +12 -0
  32. package/lib/mqtt/type/protocols/partMergeProtocol.d.ts +13 -0
  33. package/lib/mqtt/type/protocols/partMergeProtocol.js +12 -0
  34. package/lib/mqtt/type/protocols/passwordProtocol.d.ts +24 -0
  35. package/lib/mqtt/type/protocols/passwordProtocol.js +25 -0
  36. package/lib/mqtt/type/protocols/quietHoursProtocol.d.ts +29 -0
  37. package/lib/mqtt/type/protocols/quietHoursProtocol.js +35 -0
  38. package/lib/mqtt/type/protocols/resetMapProtocol.d.ts +4 -0
  39. package/lib/mqtt/type/protocols/resetMapProtocol.js +1 -0
  40. package/lib/mqtt/type/protocols/roomPropertyProtocol.d.ts +42 -0
  41. package/lib/mqtt/type/protocols/roomPropertyProtocol.js +113 -0
  42. package/lib/mqtt/type/protocols/scheduleProtocol.d.ts +62 -0
  43. package/lib/mqtt/type/protocols/scheduleProtocol.js +100 -0
  44. package/lib/mqtt/type/protocols/selectRoomCleanProtocol.d.ts +27 -0
  45. package/lib/mqtt/type/protocols/selectRoomCleanProtocol.js +40 -0
  46. package/lib/mqtt/type/protocols/spotCleanProtocol.d.ts +38 -0
  47. package/lib/mqtt/type/protocols/spotCleanProtocol.js +72 -0
  48. package/lib/mqtt/type/protocols/virtualAreaProtocol.d.ts +32 -0
  49. package/lib/mqtt/type/protocols/virtualAreaProtocol.js +36 -0
  50. package/lib/mqtt/type/protocols/virtualWallProtocol.d.ts +27 -0
  51. package/lib/mqtt/type/protocols/virtualWallProtocol.js +25 -0
  52. package/lib/mqtt/type/protocols/voiceProtocol.d.ts +21 -0
  53. package/lib/mqtt/type/protocols/voiceProtocol.js +23 -0
  54. package/lib/mqtt/type/protocols/wifiMapProtocol.d.ts +16 -0
  55. package/lib/mqtt/type/protocols/wifiMapProtocol.js +14 -0
  56. package/lib/mqtt/type/protocols/zoneCleanProtocol.d.ts +47 -0
  57. package/lib/mqtt/type/protocols/zoneCleanProtocol.js +49 -0
  58. package/lib/mqtt/useCarpet.d.ts +7 -67
  59. package/lib/mqtt/useCarpet.js +101 -181
  60. package/lib/mqtt/useCarpetClean.d.ts +2 -11
  61. package/lib/mqtt/useCarpetClean.js +26 -50
  62. package/lib/mqtt/useDevInfo.d.ts +8 -6
  63. package/lib/mqtt/useDevInfo.js +44 -36
  64. package/lib/mqtt/useDeviceModel.d.ts +6 -19
  65. package/lib/mqtt/useDeviceModel.js +31 -42
  66. package/lib/mqtt/useFurnitureModel.d.ts +6 -18
  67. package/lib/mqtt/useFurnitureModel.js +31 -43
  68. package/lib/mqtt/useHistoryMap.d.ts +2 -18
  69. package/lib/mqtt/useHistoryMap.js +102 -119
  70. package/lib/mqtt/usePartDivision.d.ts +2 -9
  71. package/lib/mqtt/usePartDivision.js +48 -57
  72. package/lib/mqtt/usePartMerge.d.ts +2 -8
  73. package/lib/mqtt/usePartMerge.js +34 -49
  74. package/lib/mqtt/usePassword.d.ts +6 -13
  75. package/lib/mqtt/usePassword.js +84 -74
  76. package/lib/mqtt/useQuiteHours.d.ts +4 -37
  77. package/lib/mqtt/useQuiteHours.js +66 -100
  78. package/lib/mqtt/useResetMap.d.ts +2 -8
  79. package/lib/mqtt/useResetMap.js +27 -34
  80. package/lib/mqtt/useRoomProperty.d.ts +8 -9
  81. package/lib/mqtt/useRoomProperty.js +67 -65
  82. package/lib/mqtt/useSchedule.d.ts +3 -23
  83. package/lib/mqtt/useSchedule.js +72 -101
  84. package/lib/mqtt/useSelectRoomClean.d.ts +3 -24
  85. package/lib/mqtt/useSelectRoomClean.js +107 -133
  86. package/lib/mqtt/useSpotClean.d.ts +5 -15
  87. package/lib/mqtt/useSpotClean.js +68 -121
  88. package/lib/mqtt/useVirtualArea.d.ts +6 -17
  89. package/lib/mqtt/useVirtualArea.js +109 -119
  90. package/lib/mqtt/useVirtualWall.d.ts +2 -18
  91. package/lib/mqtt/useVirtualWall.js +69 -90
  92. package/lib/mqtt/useVoice.d.ts +2 -16
  93. package/lib/mqtt/useVoice.js +48 -68
  94. package/lib/mqtt/useWifiMap.d.ts +6 -5
  95. package/lib/mqtt/useWifiMap.js +43 -42
  96. package/lib/mqtt/useZoneClean.d.ts +2 -21
  97. package/lib/mqtt/useZoneClean.js +125 -137
  98. package/lib/myLib/zod/mini/index.d.cts +1 -0
  99. package/lib/myLib/zod/mini/index.d.ts +1 -0
  100. package/lib/myLib/zod/mini/index.js +1 -0
  101. package/lib/myLib/zod/mini/package.json +6 -0
  102. package/lib/myLib/zod/src/mini/index.d.ts +1 -0
  103. package/lib/myLib/zod/src/mini/index.js +1 -0
  104. package/lib/myLib/zod/src/v4/core/api.d.ts +306 -0
  105. package/lib/myLib/zod/src/v4/core/api.js +1256 -0
  106. package/lib/myLib/zod/src/v4/core/checks.d.ts +278 -0
  107. package/lib/myLib/zod/src/v4/core/checks.js +816 -0
  108. package/lib/myLib/zod/src/v4/core/config.d.ts +9 -0
  109. package/lib/myLib/zod/src/v4/core/config.js +5 -0
  110. package/lib/myLib/zod/src/v4/core/core.d.ts +70 -0
  111. package/lib/myLib/zod/src/v4/core/core.js +95 -0
  112. package/lib/myLib/zod/src/v4/core/doc.d.ts +14 -0
  113. package/lib/myLib/zod/src/v4/core/doc.js +42 -0
  114. package/lib/myLib/zod/src/v4/core/errors.d.ts +220 -0
  115. package/lib/myLib/zod/src/v4/core/errors.js +232 -0
  116. package/lib/myLib/zod/src/v4/core/index.d.ts +15 -0
  117. package/lib/myLib/zod/src/v4/core/index.js +15 -0
  118. package/lib/myLib/zod/src/v4/core/json-schema-generator.d.ts +65 -0
  119. package/lib/myLib/zod/src/v4/core/json-schema-generator.js +120 -0
  120. package/lib/myLib/zod/src/v4/core/json-schema-processors.d.ts +49 -0
  121. package/lib/myLib/zod/src/v4/core/json-schema-processors.js +593 -0
  122. package/lib/myLib/zod/src/v4/core/json-schema.d.ts +88 -0
  123. package/lib/myLib/zod/src/v4/core/json-schema.js +1 -0
  124. package/lib/myLib/zod/src/v4/core/parse.d.ts +49 -0
  125. package/lib/myLib/zod/src/v4/core/parse.js +147 -0
  126. package/lib/myLib/zod/src/v4/core/regexes.d.ts +78 -0
  127. package/lib/myLib/zod/src/v4/core/regexes.js +146 -0
  128. package/lib/myLib/zod/src/v4/core/registries.d.ts +35 -0
  129. package/lib/myLib/zod/src/v4/core/registries.js +51 -0
  130. package/lib/myLib/zod/src/v4/core/schemas.d.ts +1136 -0
  131. package/lib/myLib/zod/src/v4/core/schemas.js +2745 -0
  132. package/lib/myLib/zod/src/v4/core/standard-schema.d.ts +126 -0
  133. package/lib/myLib/zod/src/v4/core/standard-schema.js +1 -0
  134. package/lib/myLib/zod/src/v4/core/to-json-schema.d.ts +114 -0
  135. package/lib/myLib/zod/src/v4/core/to-json-schema.js +488 -0
  136. package/lib/myLib/zod/src/v4/core/util.d.ts +199 -0
  137. package/lib/myLib/zod/src/v4/core/util.js +656 -0
  138. package/lib/myLib/zod/src/v4/core/versions.d.ts +5 -0
  139. package/lib/myLib/zod/src/v4/core/versions.js +5 -0
  140. package/lib/myLib/zod/src/v4/core/zsf.d.ts +91 -0
  141. package/lib/myLib/zod/src/v4/core/zsf.js +1 -0
  142. package/lib/myLib/zod/src/v4/mini/checks.d.ts +1 -0
  143. package/lib/myLib/zod/src/v4/mini/checks.js +1 -0
  144. package/lib/myLib/zod/src/v4/mini/coerce.d.ts +7 -0
  145. package/lib/myLib/zod/src/v4/mini/coerce.js +27 -0
  146. package/lib/myLib/zod/src/v4/mini/external.d.ts +11 -0
  147. package/lib/myLib/zod/src/v4/mini/external.js +16 -0
  148. package/lib/myLib/zod/src/v4/mini/index.d.ts +530 -0
  149. package/lib/myLib/zod/src/v4/mini/index.js +30 -0
  150. package/lib/myLib/zod/src/v4/mini/iso.d.ts +22 -0
  151. package/lib/myLib/zod/src/v4/mini/iso.js +46 -0
  152. package/lib/myLib/zod/src/v4/mini/parse.d.ts +1 -0
  153. package/lib/myLib/zod/src/v4/mini/parse.js +1 -0
  154. package/lib/myLib/zod/src/v4/mini/schemas.js +1244 -0
  155. package/lib/utils/index.d.ts +1 -0
  156. package/lib/utils/index.js +2 -1
  157. package/package.json +5 -3
@@ -1,51 +1,21 @@
1
- import "core-js/modules/esnext.iterator.constructor.js";
2
- import "core-js/modules/esnext.iterator.every.js";
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
2
  import "core-js/modules/esnext.iterator.map.js";
4
3
  import { pointsToString } from '../utils';
5
- import { createSetCommonParams } from './createCommonOptions';
6
- import { normalResolve } from './promise';
4
+ import { pickBy } from 'lodash-es';
7
5
  import { CarpetEnum } from './type/requestType';
6
+ import { useStructuredMessage, handleMqttError } from './hooks/useStructuredMessage';
7
+ import { validator } from './type/fun';
8
8
 
9
- // 公共的地毯属性类型
9
+ // 导出类型供外部使用
10
10
 
11
- // 形状类型定义
12
-
13
- // 添加地毯的输入参数(批量添加)
14
-
15
- // 添加地毯响应类型
16
-
17
- // 更新地毯的输入参数
18
-
19
- // 更新地毯发送数据的类型(polygons 已转换为字符串)
20
-
21
- // 查询地毯响应类型
22
-
23
- // 设置地毯的输入参数
24
-
25
- // 设置地毯响应类型
26
-
27
- // 验证形状数组的辅助函数
28
- const validateShape = function (shape, allowedShapes) {
29
- let fieldName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'shape';
30
- if (!shape.every(s => allowedShapes.includes(s))) {
31
- throw new Error(`${fieldName} must contain only ${allowedShapes.map(s => `"${s}"`).join(', ')}`);
32
- }
33
- };
34
-
35
- // 发送 MQTT 消息并返回 Promise 的辅助函数
36
- const sendMqttMessage = (devId, reqType, message) => {
37
- const params = createSetCommonParams({
38
- deviceId: devId,
39
- reqType,
40
- message
41
- });
42
- ty.device.sendMqttMessage(params);
11
+ /**
12
+ * 自定义 Hook,用于地毯管理
13
+ * @returns 包含 addCarpet、updateCarpet、deleteCarpet、queryCarpet、setCarpet 函数的对象
14
+ */
15
+ export const useCarpet = () => {
43
16
  const {
44
- taskId
45
- } = params.message;
46
- return normalResolve(reqType, taskId);
47
- };
48
- export const useCarpet = devId => {
17
+ sendStructuredMessage
18
+ } = useStructuredMessage();
49
19
  /**
50
20
  * 添加地毯(批量添加)
51
21
  * @param carpetInfo 地毯信息,包含形状数组、轮廓点集合、数量、材质数组和清洁属性数组
@@ -54,172 +24,122 @@ export const useCarpet = devId => {
54
24
 
55
25
  /**
56
26
  * 更新地毯
57
- * @param carpetInfo 地毯信息(id 必填,shape、type、cleanMode 可选)
27
+ * @param carpetInfo 地毯信息(ids 必填,shape、type、cleanMode 可选)
58
28
  * @returns Promise<BaseResponse> 响应结果
59
29
  */
60
30
 
61
31
  /**
62
32
  * 删除地毯
63
- * @param carpetId 地毯ID
33
+ * @param data 包含地毯ID数组的对象
64
34
  * @returns Promise<BaseResponse> 响应结果
65
35
  */
66
36
 
67
37
  /**
68
38
  * 查询地毯
39
+ * @param data 可选参数(目前为空对象)
69
40
  * @returns Promise<CarpetQueryResponse> 响应结果,包含地毯数量、轮廓点集合、清洁属性和形状等信息
70
41
  */
71
42
 
72
43
  /**
73
44
  * 设置地毯(一次性设置所有地毯)
74
45
  * @param carpetInfo 地毯信息,包含数量、轮廓点集合、清洁属性、形状和ID等
75
- * @returns Promise<SetCarpetResponse> 响应结果,包含设置后的地毯信息
46
+ * @returns Promise<CarpetQueryResponse> 响应结果,包含设置后的地毯信息
76
47
  */
77
48
 
78
49
  return {
79
50
  addCarpet: carpetInfo => {
80
- // 参数验证
81
- if (!carpetInfo) {
82
- throw new Error('carpetInfo is required');
83
- }
84
- if (!Array.isArray(carpetInfo.shape) || carpetInfo.shape.length === 0) {
85
- throw new Error('carpetInfo.shape is required and must be a non-empty array');
86
- }
87
- validateShape(carpetInfo.shape, ['rectangle', 'round'], 'carpetInfo.shape');
88
- if (!Array.isArray(carpetInfo.polygons) || carpetInfo.polygons.length === 0) {
89
- throw new Error('carpetInfo.polygons is required and must be a non-empty array');
90
- }
91
- if (typeof carpetInfo.num !== 'number' || carpetInfo.num <= 0) {
92
- throw new Error('carpetInfo.num is required and must be a positive number');
93
- }
94
- if (!Array.isArray(carpetInfo.type) || carpetInfo.type.length === 0) {
95
- throw new Error('carpetInfo.type is required and must be a non-empty array');
96
- }
97
- if (!Array.isArray(carpetInfo.cleanMode) || carpetInfo.cleanMode.length === 0) {
98
- throw new Error('carpetInfo.cleanMode is required and must be a non-empty array');
99
- }
100
- try {
101
- const sendData = {
102
- shape: carpetInfo.shape,
103
- polygons: carpetInfo.polygons.map(i => pointsToString(i)),
104
- num: carpetInfo.num,
105
- type: carpetInfo.type,
106
- cleanMode: carpetInfo.cleanMode,
107
- autoBoost: carpetInfo.autoBoost,
108
- fineCleaning: carpetInfo.fineCleaning,
109
- sideBrushRotating: carpetInfo.sideBrushRotating
110
- };
111
- return sendMqttMessage(devId, CarpetEnum.add, {
112
- carpetInfo: sendData
113
- });
114
- } catch (error) {
115
- throw error instanceof Error ? error : new Error('Failed to add carpet');
116
- }
51
+ return new Promise((resolve, reject) => {
52
+ try {
53
+ // 使用 TypeBox Schema 进行参数验证
54
+ const validatedData = validator.validate('add_carpet', carpetInfo);
55
+ const sendData = {
56
+ shape: validatedData.shape,
57
+ polygons: validatedData.polygons.map(i => pointsToString(i)),
58
+ num: validatedData.num,
59
+ type: validatedData.type,
60
+ cleanMode: validatedData.cleanMode,
61
+ autoBoost: validatedData.autoBoost,
62
+ fineCleaning: validatedData.fineCleaning,
63
+ sideBrushRotating: validatedData.sideBrushRotating
64
+ };
65
+ sendStructuredMessage(CarpetEnum.add, {
66
+ carpetInfo: sendData
67
+ }, resolve, error => reject(handleMqttError(error, 'Failed to add carpet')));
68
+ } catch (error) {
69
+ reject(handleMqttError(error, 'Failed to add carpet'));
70
+ }
71
+ });
117
72
  },
118
73
  updateCarpet: carpetInfo => {
119
- // 参数验证:只验证 id,其他字段可选
120
- if (!carpetInfo || !Array.isArray(carpetInfo.ids) || carpetInfo.ids.length === 0) {
121
- throw new Error('carpetInfo.ids is required and must be a non-empty array');
122
- }
123
-
124
- // 验证 shape 字段(如果提供)
125
- if (carpetInfo.shape !== undefined) {
126
- validateShape(carpetInfo.shape, ['rectangle', 'round'], 'carpetInfo.shape');
127
- }
128
- try {
129
- // 构建发送数据,只包含传入的字段
130
- const sendData = {
131
- ids: carpetInfo.ids
132
- };
133
-
134
- // 可选字段:如果存在则添加
135
- if (carpetInfo.shape !== undefined) {
136
- sendData.shape = carpetInfo.shape;
137
- }
138
- if (carpetInfo.type !== undefined) {
139
- sendData.type = carpetInfo.type;
140
- }
141
- if (carpetInfo.cleanMode !== undefined) {
142
- sendData.cleanMode = carpetInfo.cleanMode;
143
- }
144
- if (carpetInfo.autoBoost !== undefined) {
145
- sendData.autoBoost = carpetInfo.autoBoost;
146
- }
147
- if (carpetInfo.fineCleaning !== undefined) {
148
- sendData.fineCleaning = carpetInfo.fineCleaning;
74
+ return new Promise((resolve, reject) => {
75
+ try {
76
+ // 使用 TypeBox Schema 进行参数验证
77
+ const validatedData = validator.validate('update_carpet', carpetInfo);
78
+
79
+ // 构建发送数据,只包含传入的字段
80
+ // 先处理需要特殊转换的字段
81
+ const processedData = _objectSpread(_objectSpread({}, validatedData), validatedData.polygons !== undefined && {
82
+ polygons: validatedData.polygons.map(i => pointsToString(i))
83
+ });
84
+
85
+ // 使用 lodash pickBy 过滤掉 undefined 值
86
+ const sendData = pickBy(processedData, value => value !== undefined);
87
+ sendStructuredMessage(CarpetEnum.update, {
88
+ carpetInfo: sendData
89
+ }, resolve, error => reject(handleMqttError(error, 'Failed to update carpet')), CarpetEnum.update);
90
+ } catch (error) {
91
+ reject(handleMqttError(error, 'Failed to update carpet'));
149
92
  }
150
- if (carpetInfo.sideBrushRotating !== undefined) {
151
- sendData.sideBrushRotating = carpetInfo.sideBrushRotating;
152
- }
153
- // 特殊处理 polygons(需要转换)
154
- if (carpetInfo.polygons !== undefined) {
155
- sendData.polygons = carpetInfo.polygons.map(i => pointsToString(i));
156
- }
157
- return sendMqttMessage(devId, CarpetEnum.update, {
158
- carpetInfo: sendData
159
- });
160
- } catch (error) {
161
- throw error instanceof Error ? error : new Error('Failed to update carpet');
162
- }
93
+ });
163
94
  },
164
- deleteCarpet: carpetIds => {
165
- // 参数验证
166
- if (!Array.isArray(carpetIds) || carpetIds.length === 0) {
167
- throw new Error('carpetIds is required and must be a non-empty array');
168
- }
169
- try {
170
- return sendMqttMessage(devId, CarpetEnum.delete, {
171
- carpetInfo: {
172
- ids: carpetIds
173
- }
174
- });
175
- } catch (error) {
176
- throw error instanceof Error ? error : new Error('Failed to delete carpet');
177
- }
95
+ deleteCarpet: data => {
96
+ return new Promise((resolve, reject) => {
97
+ try {
98
+ // 使用 TypeBox Schema 进行参数验证
99
+ const validatedData = validator.validate('delete_carpet', data);
100
+ sendStructuredMessage(CarpetEnum.delete, {
101
+ carpetInfo: {
102
+ ids: validatedData.ids
103
+ }
104
+ }, resolve, error => reject(handleMqttError(error, 'Failed to delete carpet')), CarpetEnum.delete);
105
+ } catch (error) {
106
+ reject(handleMqttError(error, 'Failed to delete carpet'));
107
+ }
108
+ });
178
109
  },
179
- queryCarpet: () => {
180
- try {
181
- return sendMqttMessage(devId, CarpetEnum.query, {});
182
- } catch (error) {
183
- throw error instanceof Error ? error : new Error('Failed to query carpet');
184
- }
110
+ queryCarpet: function () {
111
+ let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
112
+ return new Promise((resolve, reject) => {
113
+ try {
114
+ // 使用 TypeBox Schema 进行参数验证
115
+ const validatedParams = validator.validate('query_carpet', data);
116
+ sendStructuredMessage(CarpetEnum.query, validatedParams, resolve, error => reject(handleMqttError(error, 'Failed to query carpet')), CarpetEnum.query);
117
+ } catch (error) {
118
+ reject(handleMqttError(error, 'Failed to query carpet'));
119
+ }
120
+ });
185
121
  },
186
122
  setCarpet: carpetInfo => {
187
- // 参数验证
188
- if (!carpetInfo) {
189
- throw new Error('carpetInfo is required');
190
- }
191
- if (typeof carpetInfo.num !== 'number' || carpetInfo.num <= 0) {
192
- throw new Error('carpetInfo.num is required and must be a positive number');
193
- }
194
- if (!Array.isArray(carpetInfo.polygons) || carpetInfo.polygons.length === 0) {
195
- throw new Error('carpetInfo.polygons is required and must be a non-empty array');
196
- }
197
- if (!Array.isArray(carpetInfo.cleanMode) || carpetInfo.cleanMode.length === 0) {
198
- throw new Error('carpetInfo.cleanMode is required and must be a non-empty array');
199
- }
200
- if (!Array.isArray(carpetInfo.shape) || carpetInfo.shape.length === 0) {
201
- throw new Error('carpetInfo.shape is required and must be a non-empty array');
202
- }
203
- validateShape(carpetInfo.shape, ['rectangle', 'round', 'custom'], 'carpetInfo.shape');
204
- if (!Array.isArray(carpetInfo.ids) || carpetInfo.ids.length === 0) {
205
- throw new Error('carpetInfo.ids is required and must be a non-empty array');
206
- }
207
- try {
208
- const sendData = {
209
- num: carpetInfo.num,
210
- polygons: carpetInfo.polygons.map(i => pointsToString(i)),
211
- cleanMode: carpetInfo.cleanMode,
212
- autoBoost: carpetInfo.autoBoost,
213
- fineCleaning: carpetInfo.fineCleaning,
214
- sideBrushRotating: carpetInfo.sideBrushRotating,
215
- shape: carpetInfo.shape,
216
- ids: carpetInfo.ids,
217
- type: carpetInfo.type
218
- };
219
- return sendMqttMessage(devId, CarpetEnum.set, sendData);
220
- } catch (error) {
221
- throw error instanceof Error ? error : new Error('Failed to set carpet');
222
- }
123
+ return new Promise((resolve, reject) => {
124
+ try {
125
+ // 使用 TypeBox Schema 进行参数验证
126
+ const validatedData = validator.validate('set_carpet', carpetInfo);
127
+ const sendData = {
128
+ num: validatedData.num,
129
+ polygons: validatedData.polygons.map(i => pointsToString(i)),
130
+ cleanMode: validatedData.cleanMode,
131
+ autoBoost: validatedData.autoBoost,
132
+ fineCleaning: validatedData.fineCleaning,
133
+ sideBrushRotating: validatedData.sideBrushRotating,
134
+ shape: validatedData.shape,
135
+ ids: validatedData.ids,
136
+ type: validatedData.type
137
+ };
138
+ sendStructuredMessage(CarpetEnum.set, sendData, resolve, error => reject(handleMqttError(error, 'Failed to set carpet')), CarpetEnum.query);
139
+ } catch (error) {
140
+ reject(handleMqttError(error, 'Failed to set carpet'));
141
+ }
142
+ });
223
143
  }
224
144
  };
225
145
  };
@@ -1,18 +1,9 @@
1
- import { BaseResponse } from './type';
2
- import { CarpetCleanEnum } from './type/requestType';
3
- interface CarpetCleanResponse extends BaseResponse {
4
- reqType: CarpetCleanEnum;
5
- ids: number[];
6
- }
7
- type TSetCarpetClean = (carpetIds: number[]) => Promise<CarpetCleanResponse>;
8
- type TRequestCarpetClean = () => Promise<CarpetCleanResponse>;
1
+ import { type TRequestCarpetClean, type TSetCarpetClean } from './type/protocols';
9
2
  /**
10
3
  * 自定义 Hook,用于地毯清扫
11
- * @param devId 设备ID
12
4
  * @returns 包含 requestCarpetClean 和 setCarpetClean 函数的对象
13
5
  */
14
- export declare const useCarpetClean: (devId: string) => {
6
+ export declare const useCarpetClean: () => {
15
7
  requestCarpetClean: TRequestCarpetClean;
16
8
  setCarpetClean: TSetCarpetClean;
17
9
  };
18
- export {};
@@ -1,75 +1,51 @@
1
- import "core-js/modules/esnext.iterator.constructor.js";
2
- import "core-js/modules/esnext.iterator.for-each.js";
3
1
  // 地毯清扫
4
- import { createSetCommonParams } from './createCommonOptions';
2
+ import { handleMqttError, useStructuredMessage } from './hooks/useStructuredMessage';
3
+ import { validator } from './type/fun';
5
4
  import { CarpetCleanEnum } from './type/requestType';
6
- import { normalResolve } from './promise';
7
-
8
- // 地毯清扫响应类型
9
-
10
- // 设置地毯清扫函数类型定义
11
-
12
- // 请求地毯清扫函数类型定义
13
5
 
14
6
  /**
15
7
  * 自定义 Hook,用于地毯清扫
16
- * @param devId 设备ID
17
8
  * @returns 包含 requestCarpetClean 和 setCarpetClean 函数的对象
18
9
  */
19
- export const useCarpetClean = devId => {
10
+ export const useCarpetClean = () => {
11
+ const {
12
+ sendStructuredMessage
13
+ } = useStructuredMessage();
14
+
20
15
  /**
21
16
  * 请求地毯清扫信息
17
+ * @param data 可选参数(目前为空对象)
22
18
  * @returns Promise<CarpetCleanResponse> 响应结果
23
19
  */
24
20
 
25
21
  /**
26
22
  * 设置地毯清扫
27
- * @param carpetIds 地毯ID数组
23
+ * @param data 包含地毯ID数组的对象
28
24
  * @returns Promise<CarpetCleanResponse> 响应结果
29
25
  */
30
26
 
31
27
  return {
32
28
  requestCarpetClean: () => {
33
- try {
34
- const params = createSetCommonParams({
35
- deviceId: devId,
36
- reqType: CarpetCleanEnum.query
37
- });
38
- ty.device.sendMqttMessage(params);
39
- const {
40
- taskId
41
- } = params.message;
42
- return normalResolve(CarpetCleanEnum.query, taskId);
43
- } catch (error) {
44
- return Promise.reject(error instanceof Error ? error : new Error('Failed to request carpet clean'));
45
- }
29
+ return new Promise((resolve, reject) => {
30
+ try {
31
+ sendStructuredMessage(CarpetCleanEnum.query, {}, resolve, error => reject(handleMqttError(error, 'Failed to request carpet clean')), CarpetCleanEnum.query);
32
+ } catch (error) {
33
+ reject(handleMqttError(error, 'Failed to request carpet clean'));
34
+ }
35
+ });
46
36
  },
47
- setCarpetClean: carpetIds => {
48
- // 参数验证
49
- if (!Array.isArray(carpetIds) || carpetIds.length === 0) {
50
- throw new Error('carpetIds is required and must be a non-empty array');
51
- }
52
- carpetIds.forEach((id, index) => {
53
- if (typeof id !== 'number') {
54
- throw new Error(`carpetIds[${index}] must be a number`);
37
+ setCarpetClean: data => {
38
+ return new Promise((resolve, reject) => {
39
+ try {
40
+ // 使用 TypeBox Schema 进行参数验证
41
+ const validatedData = validator.validate('set_carpet_clean', data);
42
+ sendStructuredMessage(CarpetCleanEnum.set, {
43
+ ids: validatedData
44
+ }, resolve, error => reject(handleMqttError(error, 'Failed to set carpet clean')), CarpetCleanEnum.set);
45
+ } catch (error) {
46
+ reject(handleMqttError(error, 'Failed to set carpet clean'));
55
47
  }
56
48
  });
57
- try {
58
- const params = createSetCommonParams({
59
- deviceId: devId,
60
- reqType: CarpetCleanEnum.set,
61
- message: {
62
- ids: carpetIds
63
- }
64
- });
65
- ty.device.sendMqttMessage(params);
66
- const {
67
- taskId
68
- } = params.message;
69
- return normalResolve(CarpetCleanEnum.set, taskId);
70
- } catch (error) {
71
- throw error instanceof Error ? error : new Error('Failed to set carpet clean');
72
- }
73
49
  }
74
50
  };
75
51
  };
@@ -1,7 +1,9 @@
1
- import { BaseResponse } from './type';
2
- export interface DevInfoResponse extends BaseResponse {
3
- info: string;
4
- }
5
- export declare const useDevInfo: (devId: string) => {
6
- requestDevInfo: () => Promise<DevInfoResponse>;
1
+ import { type TRequestDevInfo } from './type/protocols/devInfoProtocol';
2
+ export type { DevInfoResponse } from './type/protocols/devInfoProtocol';
3
+ /**
4
+ * 自定义 Hook,用于设备信息管理
5
+ * @returns 包含 requestDevInfo 函数的对象
6
+ */
7
+ export declare const useDevInfo: () => {
8
+ requestDevInfo: TRequestDevInfo;
7
9
  };
@@ -1,52 +1,60 @@
1
1
  import { hexToUriDecodedString } from '@ray-js/robot-protocol';
2
2
  import { useContext } from 'react';
3
- import { createSetCommonParams } from './createCommonOptions';
3
+ import { handleMqttError, useStructuredMessage } from './hooks/useStructuredMessage';
4
4
  import { SingletonContext } from './mqttProvider';
5
- import { normalResolve } from './promise';
6
5
  import { DevInfoEnum } from './type';
7
6
 
8
- // 设备信息响应类型
7
+ // 导出类型供外部使用
9
8
 
10
- // 请求设备信息
11
- export const useDevInfo = devId => {
9
+ /**
10
+ * 自定义 Hook,用于设备信息管理
11
+ * @returns 包含 requestDevInfo 函数的对象
12
+ */
13
+ export const useDevInfo = () => {
12
14
  const {
13
15
  useMqtt,
14
- devices
16
+ devices,
17
+ commandVersion
15
18
  } = useContext(SingletonContext);
19
+ const {
20
+ sendStructuredMessage
21
+ } = useStructuredMessage();
22
+
23
+ /**
24
+ * 请求设备信息
25
+ * @returns Promise<DevInfoResponse> 响应结果,包含设备信息
26
+ */
27
+
16
28
  return {
17
29
  requestDevInfo: () => {
18
- if (useMqtt) {
19
- const params = createSetCommonParams({
20
- deviceId: devId,
21
- reqType: DevInfoEnum.query,
22
- message: {}
23
- });
24
- ty.device.sendMqttMessage(params);
25
- const {
26
- taskId
27
- } = params.message;
28
- return normalResolve(DevInfoEnum.query, taskId);
29
- }
30
+ return new Promise((resolve, reject) => {
31
+ try {
32
+ var _devices$common$model;
33
+ if (useMqtt) {
34
+ // request_dev_info 不需要参数,直接发送空对象
35
+ sendStructuredMessage(DevInfoEnum.query, {}, resolve, error => reject(handleMqttError(error, 'Failed to request device info')));
36
+ return;
37
+ }
30
38
 
31
- // 非 MQTT 模式:从设备属性中获取设备信息
32
- try {
33
- var _devices$common$model;
34
- const dpDevInfo = (_devices$common$model = devices.common.model.props) === null || _devices$common$model === void 0 ? void 0 : _devices$common$model.device_info;
35
- if (!dpDevInfo) {
36
- return Promise.reject(new Error('Device info is not available in device properties'));
39
+ // 非 MQTT 模式:从设备属性中获取设备信息
40
+ const dpDevInfo = (_devices$common$model = devices.common.model.props) === null || _devices$common$model === void 0 ? void 0 : _devices$common$model.device_info;
41
+ if (!dpDevInfo) {
42
+ reject(new Error('Device info is not available in device properties'));
43
+ return;
44
+ }
45
+ const info = hexToUriDecodedString(dpDevInfo);
46
+ resolve({
47
+ info,
48
+ success: true,
49
+ errCode: 0,
50
+ reqType: DevInfoEnum.query,
51
+ version: commandVersion || '1.0.0',
52
+ taskId: `${Date.now()}`
53
+ });
54
+ } catch (error) {
55
+ reject(handleMqttError(error, 'Failed to request device info'));
37
56
  }
38
- const info = hexToUriDecodedString(dpDevInfo);
39
- return Promise.resolve({
40
- info,
41
- success: true,
42
- errCode: 0,
43
- reqType: DevInfoEnum.query,
44
- version: '1.0.0',
45
- taskId: `${Date.now()}`
46
- });
47
- } catch (error) {
48
- return Promise.reject(error instanceof Error ? error : new Error('Failed to get device info from device properties'));
49
- }
57
+ });
50
58
  }
51
59
  };
52
60
  };
@@ -1,22 +1,9 @@
1
- import { BaseResponse } from './type';
2
- import { DeviceModelEnum } from './type/requestType';
3
- interface DeviceModelInfo {
4
- id: number;
5
- modelType: number;
6
- scale: number;
7
- size: [number, number, number];
8
- rotation: [number, number, number];
9
- position: [number, number, number];
10
- subDevId: string;
11
- }
12
- interface DeviceModelResponse extends BaseResponse {
13
- reqType: DeviceModelEnum.query;
14
- modelInfo: DeviceModelInfo[];
15
- }
16
- type TRequestDeviceList = () => Promise<DeviceModelResponse>;
17
- type TSetDeviceModel = (modelInfos: DeviceModelInfo[]) => Promise<DeviceModelResponse>;
18
- export declare const useDeviceModel: (devId: string) => {
1
+ import { type TRequestDeviceList, type TSetDeviceModel } from './type/protocols';
2
+ /**
3
+ * 自定义 Hook,用于设备模型管理
4
+ * @returns 包含 requestDeviceList 和 setDeviceModel 函数的对象
5
+ */
6
+ export declare const useDeviceModel: () => {
19
7
  requestDeviceList: TRequestDeviceList;
20
8
  setDeviceModel: TSetDeviceModel;
21
9
  };
22
- export {};