mm_os 3.3.1 → 4.0.1

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