mm_os 4.3.6 → 5.0.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 (234) hide show
  1. package/README.md +101 -504
  2. package/index.js +26 -19
  3. package/lib/loader.js +787 -0
  4. package/lib/os.js +369 -0
  5. package/package.json +55 -80
  6. package/LICENSE +0 -21
  7. package/README_EN.md +0 -505
  8. package/adapter/adapter.js +0 -484
  9. package/adapter/custom_persistence.js +0 -661
  10. package/adapter/mqtt.js +0 -254
  11. package/adapter/socket.js +0 -244
  12. package/adapter/web.js +0 -92
  13. package/adapter/websocket.js +0 -43
  14. package/ai.js +0 -130
  15. package/com/api/README.md +0 -3
  16. package/com/api/com.json +0 -5
  17. package/com/api/config.tpl.json +0 -41
  18. package/com/api/drive.js +0 -732
  19. package/com/api/index.js +0 -201
  20. package/com/api/oauth.js +0 -200
  21. package/com/api/script.tpl.js +0 -32
  22. package/com/cmd/README.md +0 -11
  23. package/com/cmd/com.json +0 -5
  24. package/com/cmd/config.tpl.json +0 -48
  25. package/com/cmd/drive.js +0 -176
  26. package/com/cmd/index.js +0 -287
  27. package/com/cmd/job/config.json +0 -66
  28. package/com/cmd/job/index.js +0 -241
  29. package/com/cmd/job/test.js +0 -188
  30. package/com/cmd/msg.json +0 -48
  31. package/com/cmd/script.tpl.js +0 -12
  32. package/com/db/README.md +0 -3
  33. package/com/db/com.json +0 -5
  34. package/com/db/drive.js +0 -2206
  35. package/com/db/index.js +0 -241
  36. package/com/event/README.md +0 -4
  37. package/com/event/com.json +0 -5
  38. package/com/event/config.tpl.json +0 -20
  39. package/com/event/drive.js +0 -61
  40. package/com/event/index.js +0 -438
  41. package/com/event/script.tpl.js +0 -23
  42. package/com/mqtt/README.md +0 -47
  43. package/com/mqtt/com.json +0 -5
  44. package/com/mqtt/config.tpl.json +0 -42
  45. package/com/mqtt/drive.js +0 -696
  46. package/com/mqtt/index.js +0 -1017
  47. package/com/mqtt/index.test.js +0 -503
  48. package/com/mqtt/mm_mqtt.js +0 -446
  49. package/com/mqtt/script.tpl.js +0 -719
  50. package/com/nav/README.md +0 -2
  51. package/com/nav/com.json +0 -5
  52. package/com/nav/config.tpl.json +0 -84
  53. package/com/nav/drive.js +0 -702
  54. package/com/nav/index.js +0 -228
  55. package/com/nav/tpl/admin_pc/page_channel.vue +0 -305
  56. package/com/nav/tpl/admin_pc/page_config.vue +0 -280
  57. package/com/nav/tpl/admin_pc/page_config_form.vue +0 -194
  58. package/com/nav/tpl/admin_pc/page_default.vue +0 -247
  59. package/com/nav/tpl/admin_pc/page_form.vue +0 -180
  60. package/com/nav/tpl/admin_pc/page_lang.vue +0 -264
  61. package/com/nav/tpl/admin_pc/page_nav.vue +0 -321
  62. package/com/nav/tpl/admin_pc/page_table.vue +0 -296
  63. package/com/nav/tpl/admin_pc/page_type.vue +0 -321
  64. package/com/nav/tpl/admin_pc/page_view.vue +0 -124
  65. package/com/nav/tpl/dev_pc/page_channel.vue +0 -253
  66. package/com/nav/tpl/dev_pc/page_config.vue +0 -253
  67. package/com/nav/tpl/dev_pc/page_default.vue +0 -247
  68. package/com/nav/tpl/dev_pc/page_form.vue +0 -162
  69. package/com/nav/tpl/dev_pc/page_nav.vue +0 -253
  70. package/com/nav/tpl/dev_pc/page_table.vue +0 -247
  71. package/com/nav/tpl/dev_pc/page_type.vue +0 -313
  72. package/com/nav/tpl/home_pc/page_channel.vue +0 -234
  73. package/com/nav/tpl/home_pc/page_default.vue +0 -234
  74. package/com/nav/tpl/home_pc/page_form.vue +0 -137
  75. package/com/nav/tpl/home_pc/page_list.vue +0 -234
  76. package/com/nav/tpl/home_pc/page_nav.vue +0 -221
  77. package/com/nav/tpl/home_pc/page_type.vue +0 -234
  78. package/com/nav/tpl/home_pc/page_view.vue +0 -125
  79. package/com/nav/tpl/home_phone/page_channel.vue +0 -234
  80. package/com/nav/tpl/home_phone/page_default.vue +0 -234
  81. package/com/nav/tpl/home_phone/page_form.vue +0 -137
  82. package/com/nav/tpl/home_phone/page_list.vue +0 -234
  83. package/com/nav/tpl/home_phone/page_nav.vue +0 -237
  84. package/com/nav/tpl/home_phone/page_type.vue +0 -234
  85. package/com/nav/tpl/home_phone/page_view.vue +0 -125
  86. package/com/nav/viewmodel.js +0 -446
  87. package/com/param/README.md +0 -2
  88. package/com/param/com.json +0 -5
  89. package/com/param/config.tpl.json +0 -136
  90. package/com/param/drive.js +0 -502
  91. package/com/param/index.js +0 -158
  92. package/com/param/script.tpl.js +0 -12
  93. package/com/pendant/README.md +0 -3
  94. package/com/pendant/com.json +0 -5
  95. package/com/pendant/config.tpl.json +0 -32
  96. package/com/pendant/drive.js +0 -204
  97. package/com/pendant/index.js +0 -467
  98. package/com/pendant/pendant.html +0 -16
  99. package/com/pendant/script.tpl.js +0 -18
  100. package/com/socket/README.md +0 -47
  101. package/com/socket/com.json +0 -5
  102. package/com/socket/config.tpl.json +0 -12
  103. package/com/socket/drive.js +0 -679
  104. package/com/socket/index.js +0 -402
  105. package/com/socket/script.tpl.js +0 -41
  106. package/com/sql/README.md +0 -3
  107. package/com/sql/com.json +0 -5
  108. package/com/sql/config.tpl.json +0 -74
  109. package/com/sql/drive.js +0 -1283
  110. package/com/sql/index.js +0 -152
  111. package/com/sql/script.tpl.js +0 -47
  112. package/com/static/README.md +0 -2
  113. package/com/static/com.json +0 -5
  114. package/com/static/config.tpl.json +0 -24
  115. package/com/static/drive.js +0 -194
  116. package/com/static/index.js +0 -237
  117. package/com/static/script.tpl.js +0 -28
  118. package/com/task/README.md +0 -3
  119. package/com/task/com.json +0 -5
  120. package/com/task/config.tpl.json +0 -24
  121. package/com/task/drive.js +0 -428
  122. package/com/task/index.js +0 -159
  123. package/com/task/script.tpl.js +0 -40
  124. package/com/template/com.json +0 -5
  125. package/com/template/config.tpl.json +0 -16
  126. package/com/template/drive.js +0 -81
  127. package/com/template/index.js +0 -141
  128. package/com.js +0 -237
  129. package/common/README.md +0 -2
  130. package/common/middleware/web_after/index.js +0 -26
  131. package/common/middleware/web_after/middleware.json +0 -9
  132. package/common/middleware/web_base/index.js +0 -113
  133. package/common/middleware/web_base/middleware.json +0 -19
  134. package/common/middleware/web_before/index.js +0 -33
  135. package/common/middleware/web_before/middleware.json +0 -9
  136. package/common/middleware/web_cors/index.js +0 -87
  137. package/common/middleware/web_cors/middleware.json +0 -24
  138. package/common/middleware/web_error/index.js +0 -131
  139. package/common/middleware/web_error/middleware.json +0 -19
  140. package/common/middleware/web_ip/index.js +0 -15
  141. package/common/middleware/web_ip/middleware.json +0 -14
  142. package/common/middleware/web_logger/index.js +0 -156
  143. package/common/middleware/web_logger/middleware.json +0 -14
  144. package/common/middleware/web_main/index.js +0 -26
  145. package/common/middleware/web_main/middleware.json +0 -9
  146. package/common/middleware/web_static/index.js +0 -73
  147. package/common/middleware/web_static/middleware.json +0 -54
  148. package/common/middleware/web_waf/index.js +0 -385
  149. package/common/middleware/web_waf/middleware.json +0 -13
  150. package/core/app/config.tpl.json +0 -67
  151. package/core/app/index.js +0 -710
  152. package/core/app/script.tpl.js +0 -52
  153. package/core/channel/index.js +0 -899
  154. package/core/channel/matcher.js +0 -585
  155. package/core/com/config.tpl.json +0 -16
  156. package/core/com/index.js +0 -77
  157. package/core/com/script.tpl.js +0 -5
  158. package/core/component/component.js +0 -42
  159. package/core/component/config.tpl.json +0 -63
  160. package/core/component/index.js +0 -273
  161. package/core/component/script.tpl.js +0 -19
  162. package/core/controller/config.tpl.json +0 -14
  163. package/core/controller/index.js +0 -371
  164. package/core/controller/script.tpl.js +0 -27
  165. package/core/factory/config.tpl.json +0 -14
  166. package/core/factory/entity.js +0 -275
  167. package/core/factory/index.js +0 -241
  168. package/core/factory/script.tpl.js +0 -16
  169. package/core/game/bat/index.js +0 -137
  170. package/core/game/bat/world.js +0 -622
  171. package/core/game/config.tpl.json +0 -16
  172. package/core/game/entity_admin.js +0 -230
  173. package/core/game/index.js +0 -186
  174. package/core/handler/config.tpl.json +0 -22
  175. package/core/handler/index.js +0 -181
  176. package/core/handler/script.tpl.js +0 -23
  177. package/core/logic/config.tpl.json +0 -14
  178. package/core/logic/index.js +0 -59
  179. package/core/logic/script.tpl.js +0 -19
  180. package/core/middleware/config.tpl.json +0 -16
  181. package/core/middleware/index.js +0 -117
  182. package/core/middleware/script.tpl.js +0 -37
  183. package/core/mod/config.tpl.json +0 -22
  184. package/core/mod/index.js +0 -136
  185. package/core/mod/script.tpl.js +0 -34
  186. package/core/model/config.tpl.json +0 -219
  187. package/core/model/index.js +0 -272
  188. package/core/model/model.js +0 -27
  189. package/core/model/script.tpl.js +0 -20
  190. package/core/notifier/config.tpl.json +0 -14
  191. package/core/notifier/index.js +0 -77
  192. package/core/notifier/script.tpl.js +0 -20
  193. package/core/plugin/config.tpl.json +0 -36
  194. package/core/plugin/index.js +0 -297
  195. package/core/plugin/script.tpl.js +0 -51
  196. package/core/pusher/config.tpl.json +0 -14
  197. package/core/pusher/index.js +0 -158
  198. package/core/pusher/script.tpl.js +0 -20
  199. package/core/room/bat/index.js +0 -170
  200. package/core/room/bat/room.js +0 -524
  201. package/core/room/config.tpl.json +0 -20
  202. package/core/room/index.js +0 -249
  203. package/core/room/room.js +0 -61
  204. package/core/scene/config.tpl.json +0 -14
  205. package/core/scene/index.js +0 -467
  206. package/core/scene/loop.js +0 -1306
  207. package/core/scene/map.js +0 -28
  208. package/core/scene/script.tpl.js +0 -22
  209. package/core/sender/config.tpl.json +0 -14
  210. package/core/sender/index.js +0 -79
  211. package/core/sender/script.tpl.js +0 -20
  212. package/core/service/config.tpl.json +0 -14
  213. package/core/service/index.js +0 -100
  214. package/core/service/script.tpl.js +0 -25
  215. package/core/store/config.tpl.json +0 -26
  216. package/core/store/index.js +0 -1794
  217. package/core/store/script.tpl.js +0 -22
  218. package/core/store/sql.js +0 -1488
  219. package/core/system/config.tpl.json +0 -18
  220. package/core/system/index.js +0 -312
  221. package/core/system/script.tpl.js +0 -77
  222. package/core/view/config.tpl.json +0 -14
  223. package/core/view/index.js +0 -91
  224. package/core/view/script.tpl.js +0 -20
  225. package/core/zone/bat/index.js +0 -744
  226. package/core/zone/config.tpl.json +0 -54
  227. package/core/zone/index.js +0 -655
  228. package/core/zone/script.tpl.js +0 -10
  229. package/core/zone/zone_bat.js +0 -136
  230. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +0 -24
  231. package/os.js +0 -53
  232. package/server.js +0 -595
  233. package/ulits/id_gen.js +0 -134
  234. package/ulits/word.js +0 -206
@@ -1,484 +0,0 @@
1
- /**
2
- * 适配器基类
3
- * 定义了基础的网络通信接口
4
- */
5
- const { idGen } = require('../ulits/id_gen.js');
6
-
7
- class Adapter {
8
- static config = {
9
- name: 'adapter',
10
- host: '0.0.0.0',
11
- port: 8000
12
- };
13
-
14
- /**
15
- * 构造函数
16
- * @param {object} config 配置参数
17
- * @param {object} parent 父对象
18
- */
19
- constructor(config, parent) {
20
- if (parent) {
21
- this.getParent = function () {
22
- return parent;
23
- };
24
- }
25
- // 客户端连接列表
26
- this.clients = new Map();
27
- // 中间件数组
28
- this.mw_list = [];
29
- // 回调函数映射表,使用消息ID作为键
30
- this.callback = new Map();
31
-
32
- this.setConfig(config);
33
- }
34
- }
35
-
36
- /**
37
- * 设置配置参数
38
- * @param {object} config 配置参数
39
- */
40
- Adapter.prototype.setConfig = function (config) {
41
- this.config = { ...Adapter.config, ...config };
42
- this._preset();
43
- };
44
-
45
- Adapter.prototype._preset = function () {
46
- // 默认预设,子类可以重写
47
- };
48
-
49
- Adapter.prototype.getParent = function () {
50
- return null;
51
- };
52
-
53
- /**
54
- * 初始化适配器
55
- * @private
56
- */
57
- Adapter.prototype._init = function (...args) {
58
- return this;
59
- };
60
-
61
- /**
62
- * 初始化适配器
63
- * @param {...*} args 初始化参数
64
- * @returns {object} this
65
- */
66
- Adapter.prototype.init = function (...args) {
67
- // 默认初始化,子类可以重写
68
- return this._init(...args);
69
- };
70
-
71
- /**
72
- * 记录日志
73
- * @param {string} level 日志级别,如 'debug', 'info', 'warn', 'error'
74
- * @param {string} message 日志消息
75
- * @param {...*} args 可选,日志消息的参数
76
- */
77
- Adapter.prototype.log = function (level, message, ...args) {
78
- let logger = this.getParent().getLogger();
79
- logger[level](`[${this.constructor.name}] ${message}`, ...args);
80
- };
81
-
82
- /**
83
- * 生成ID
84
- * @param {string} type ID类型,可选值:'client'(客户端ID)或'msg'(消息ID)
85
- * @returns {string} 唯一ID
86
- */
87
- Adapter.prototype.genId = function (type = 'client') {
88
- return idGen.genId(type);
89
- };
90
-
91
- /**
92
- * 生成客户端ID
93
- * @returns {string} 唯一客户端ID
94
- */
95
- Adapter.prototype.genClientId = function () {
96
- return this.genId('client');
97
- };
98
-
99
- /**
100
- * 生成消息ID
101
- * @returns {string} 唯一消息ID
102
- */
103
- Adapter.prototype.genMsgId = function () {
104
- return this.genId('msg');
105
- };
106
-
107
- /**
108
- * 使用中间件
109
- * @param {Function} middleware 中间件函数,格式: async (ctx, next) => {}
110
- * @returns {object} this
111
- */
112
- Adapter.prototype.use = function (middleware) {
113
- if (typeof middleware !== 'function') {
114
- throw new Error('中间件必须是一个函数');
115
- }
116
- this.mw_list.push(middleware);
117
- return this; // 支持链式调用
118
- };
119
-
120
- /**
121
- * 设置中间件(子类可以重写以提供特定实现)
122
- */
123
- Adapter.prototype._setupMw = function () {
124
- // 默认中间件设置,子类可以重写
125
- };
126
-
127
- /**
128
- * 发送消息(需要子类实现)
129
- * @param {string} clientid 客户端ID
130
- * @param {string} message 消息内容
131
- * @returns {void}
132
- */
133
- Adapter.prototype._send = function (clientid, message) {
134
- this.log('debug', '发送消息', { clientid, message });
135
- throw new Error('子类必须实现_send方法');
136
- };
137
-
138
- /**
139
- * 向指定客户端发送消息(JSON 2.0格式)
140
- * @param {string} clientid 客户端ID
141
- * @param {string} method 方法名
142
- * @param {object} params 参数对象
143
- * @param {Function} cb 可选,接收客户端回复的回调函数
144
- * @returns {void}
145
- */
146
- Adapter.prototype.send = function (clientid, method, params = {}, cb = null) {
147
- // 生成唯一消息ID
148
- let message_id = this.genMsgId();
149
-
150
- // 构建JSON 2.0格式的消息
151
- let msg = {
152
- id: message_id,
153
- method: method,
154
- params: params
155
- };
156
-
157
- // 转换为字符串
158
- let message = JSON.stringify(msg);
159
-
160
- // 如果提供了回调函数,保存起来等待客户端回复
161
- if (typeof cb === 'function') {
162
- this.callback.set(message_id, cb);
163
- }
164
-
165
- return this._send(clientid, message);
166
- };
167
-
168
- /**
169
- * 异步发送消息
170
- * @param {string} clientid 客户端ID
171
- * @param {string} method 方法名
172
- * @param {object} params 参数对象
173
- * @returns {Promise} 异步操作的结果
174
- */
175
- Adapter.prototype.sendAsync = function (clientid, method, params = {}) {
176
- return new Promise((resolve, reject) => {
177
- // 发送消息
178
- this.send(clientid, method, params, (msg, error) => {
179
- if (error) {
180
- reject(error);
181
- } else {
182
- resolve(msg);
183
- }
184
- });
185
- });
186
- };
187
-
188
- /**
189
- * 组合中间件(洋葱模型)
190
- * @param {object} ctx 上下文对象
191
- */
192
- Adapter.prototype._composeMw = async function (ctx) {
193
- let index = -1;
194
-
195
- let dispatch = async (i) => {
196
- if (i <= index) {
197
- throw new Error('next() 不能被多次调用');
198
- }
199
- index = i;
200
-
201
- let middleware = this.mw_list[i];
202
- if (!middleware) {
203
- return Promise.resolve();
204
- }
205
-
206
- try {
207
- return await middleware(ctx, () => dispatch(i + 1));
208
- } catch (error) {
209
- this.log('error', '中间件执行错误:', error);
210
- throw error;
211
- }
212
- };
213
-
214
- try {
215
- await dispatch(0);
216
- this._autoReply(ctx);
217
- } catch (error) {
218
- this._runMwError(ctx, error);
219
- }
220
- };
221
-
222
- /**
223
- * 自动回复客户端
224
- * @param {object} ctx 上下文对象
225
- * @private
226
- */
227
- Adapter.prototype._autoReply = function (ctx) {
228
- if (ctx.body === undefined || ctx.body === null) return;
229
-
230
- // 检查原始消息是否是JSON 2.0格式
231
- if (typeof ctx.message === 'object' && ctx.message.id) {
232
- // 构建JSON 2.0格式的回复
233
- let response = {
234
- id: ctx.message.id,
235
- result: ctx.body,
236
- error: null
237
- };
238
- this._send(ctx.clientid, JSON.stringify(response));
239
- } else {
240
- // 非JSON格式消息,直接发送
241
- this._send(ctx.clientid, ctx.body.toString());
242
- }
243
- };
244
-
245
- /**
246
- * 处理中间件错误
247
- * @param {object} ctx 上下文对象
248
- * @param {Error} error 错误对象
249
- * @private
250
- */
251
- Adapter.prototype._runMwError = function (ctx, error) {
252
- this.log('error', '中间件链执行错误:', error);
253
- // 如果是JSON 2.0格式的请求,发送错误回复
254
- if (typeof ctx.message === 'object' && ctx.message.id) {
255
- let response = {
256
- id: ctx.message.id,
257
- result: null,
258
- error: { message: error.message }
259
- };
260
- this._send(ctx.clientid, JSON.stringify(response));
261
- }
262
- };
263
-
264
- /**
265
- * 消息接收处理
266
- * @param {string} clientid 客户端ID
267
- * @param {object} socket 客户端socket对象
268
- * @param {string} data 接收的消息
269
- */
270
- Adapter.prototype._onMsg = function (clientid, socket, data) {
271
- // 检查参数是否有效
272
- if (!this._check(clientid, data)) return;
273
-
274
- // 处理消息数据
275
- let clientid_str = this._getClientIdStr(clientid);
276
- let message = this._parseStr(data);
277
-
278
- // 解析消息并处理
279
- let msg = this._parseMessage(clientid_str, message);
280
-
281
- // 创建上下文对象并执行中间件
282
- let ctx = this._createContext(clientid_str, socket, msg);
283
- this._composeMw(ctx);
284
- };
285
-
286
- /**
287
- * 验证参数有效性
288
- * @param {string} clientid 客户端ID
289
- * @param {string} data 消息数据
290
- * @returns {boolean} 参数是否有效
291
- * @private
292
- */
293
- Adapter.prototype._check = function (clientid, data) {
294
- if (!clientid) {
295
- this.log('error', '客户端ID无效:', clientid);
296
- return false;
297
- }
298
-
299
- if (!data) {
300
- this.log('error', '消息数据无效:', data);
301
- return false;
302
- }
303
-
304
- return true;
305
- };
306
-
307
- /**
308
- * 获取客户端ID字符串
309
- * @param {string|object} clientid 客户端ID
310
- * @returns {string} 客户端ID字符串
311
- * @private
312
- */
313
- Adapter.prototype._getClientIdStr = function (clientid) {
314
- return typeof clientid === 'object' ? clientid.id || 'unknown' : clientid;
315
- };
316
-
317
- /**
318
- * 解析数据为字符串
319
- * @param {any} data 原始数据
320
- * @returns {string} 字符串消息
321
- * @private
322
- */
323
- Adapter.prototype._parseStr = function (data) {
324
- if (Buffer.isBuffer(data)) {
325
- return data.toString();
326
- } else if (typeof data === 'string') {
327
- return data;
328
- } else {
329
- return String(data);
330
- }
331
- };
332
-
333
- /**
334
- * 解析消息内容
335
- * @param {string} clientid_str 客户端ID字符串
336
- * @param {string} message 消息内容
337
- * @returns {any} 解析后的消息
338
- * @private
339
- */
340
- Adapter.prototype._parseMessage = function (clientid_str, message) {
341
- try {
342
- let msg = JSON.parse(message);
343
- // 检查是否是回复消息(具有id属性)
344
- if (typeof msg === 'object' && msg.id) {
345
- this._onMessage(clientid_str, msg);
346
- }
347
- return msg;
348
- } catch (error) {
349
- this.log('warn', `客户端 ${clientid_str} 发送的消息不是有效的JSON格式: ${message}`, error);
350
- // 如果不是JSON格式,仍传递给中间件处理
351
- return message;
352
- }
353
- };
354
-
355
- /**
356
- * 创建上下文对象
357
- * @param {string} clientid_str 客户端ID字符串
358
- * @param {object} socket 客户端socket对象
359
- * @param {any} msg 消息内容
360
- * @returns {object} 上下文对象
361
- * @private
362
- */
363
- Adapter.prototype._createContext = function (clientid_str, socket, msg) {
364
- return {
365
- clientid: clientid_str,
366
- socket: socket,
367
- message: msg,
368
- adapter: this,
369
- response: '',
370
- body: null,
371
- // 发送消息给当前客户端
372
- send: (method, params, cb) => {
373
- this.send(clientid_str, method, params, cb);
374
- },
375
- // 异步发送消息
376
- sendAsync: (method, params = {}) => {
377
- return this.sendAsync(clientid_str, method, params);
378
- }
379
- };
380
- };
381
-
382
- /**
383
- * 消息接收处理
384
- * @param {string} clientid 客户端ID
385
- * @param {object} msg 接收的消息
386
- */
387
- Adapter.prototype._onMessage = function (clientid, msg) {
388
- // 查找对应的回调函数
389
- this.log('debug', '收到消息', { clientid });
390
- let callback = this.callback.get(msg.id);
391
- if (callback) {
392
- // 执行回调函数并移除
393
- this.callback.delete(msg.id);
394
- // 回调参数:消息对象,错误对象(如果有)
395
- let error = msg.error ? new Error(msg.error.message) : null;
396
- callback(msg, error);
397
- return;
398
- }
399
- };
400
-
401
- /**
402
- * 连接关闭处理
403
- * @param {string} clientid 客户端ID
404
- */
405
- Adapter.prototype._onClose = function (clientid) {
406
- // 移除客户端连接
407
- this.clients.delete(clientid);
408
- this.log('info', `客户端断开连接: ${clientid}`);
409
- };
410
-
411
- /**
412
- * 错误处理
413
- * @param {string} clientid 客户端ID
414
- * @param {Error} error 错误对象
415
- */
416
- Adapter.prototype._onError = function (clientid, error) {
417
- this.log('error', `客户端 ${clientid} 发生错误:`, error);
418
- // 移除客户端连接
419
- this.clients.delete(clientid);
420
- };
421
-
422
- /**
423
- * 停止Adapter服务器(子类可以重写以提供特定实现)
424
- */
425
- Adapter.prototype._stop = function () {
426
- // 关闭所有客户端连接
427
- for (let [id, client] of this.clients) {
428
- try {
429
- if (client.destroy) {
430
- // Socket客户端使用destroy方法
431
- client.destroy();
432
- } else if (client.close) {
433
- // WebSocket客户端使用close方法
434
- client.close();
435
- }
436
- } catch (error) {
437
- this.log('error', `关闭客户端 ${id} 连接时发生错误:`, error);
438
- }
439
- }
440
- };
441
-
442
- /**
443
- * 停止Adapter服务器
444
- */
445
- Adapter.prototype.stop = function () {
446
- this._stop();
447
- this.clients.clear();
448
-
449
- // 关闭服务器
450
- if (this.server) {
451
- this.server.close(() => {
452
- this.log('info', '服务器已停止');
453
- });
454
- }
455
- };
456
-
457
- /**
458
- * 广播消息
459
- * @param {string} message 消息内容
460
- * @param {Array<string>} ids 可选,客户端ID数组,为空则向所有客户端广播
461
- */
462
- Adapter.prototype.bcast = function (message, ids = null) {
463
- if (ids && Array.isArray(ids)) {
464
- // 向指定客户端数组广播
465
- for (let id of ids) {
466
- this._send(id, message);
467
- }
468
- this.log('debug', `服务器向指定客户端广播消息: ${message}`);
469
- } else {
470
- // 向所有客户端广播
471
- for (let [id] of this.clients) {
472
- this._send(id, message);
473
- }
474
- this.log('debug', `服务器广播消息: ${message}`);
475
- }
476
- };
477
-
478
- /**
479
- * 启动Adapter服务器
480
- */
481
- Adapter.prototype.start = function () {
482
- };
483
-
484
- exports.Adapter = Adapter;