mm_os 3.3.0 → 4.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 (380) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +491 -99
  3. package/README_EN.md +498 -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/com/event/com.json +5 -0
  28. package/{core/com → com}/event/config.tpl.json +8 -8
  29. package/com/event/drive.js +59 -0
  30. package/com/event/index.js +409 -0
  31. package/com/event/script.tpl.js +23 -0
  32. package/com/mqtt/com.json +5 -0
  33. package/{core/com → com}/mqtt/config.tpl.json +3 -5
  34. package/com/mqtt/drive.js +676 -0
  35. package/com/mqtt/index.js +822 -0
  36. package/com/mqtt/mm_mqtt.js +425 -0
  37. package/com/mqtt/script.tpl.js +723 -0
  38. package/com/nav/com.json +5 -0
  39. package/com/nav/config.tpl.json +84 -0
  40. package/com/nav/drive.js +702 -0
  41. package/com/nav/index.js +231 -0
  42. package/{core/com → com}/nav/tpl/admin_pc/page_config.vue +280 -280
  43. package/{core/com → com}/nav/tpl/admin_pc/page_config_form.vue +194 -194
  44. package/com/nav/tpl/admin_pc/page_form.vue +180 -0
  45. package/com/nav/tpl/admin_pc/page_view.vue +124 -0
  46. package/com/nav/tpl/dev_pc/page_default.vue +247 -0
  47. package/com/nav/tpl/dev_pc/page_type.vue +313 -0
  48. package/com/nav/tpl/home_pc/page_default.vue +234 -0
  49. package/com/nav/tpl/home_pc/page_form.vue +137 -0
  50. package/com/nav/tpl/home_pc/page_list.vue +234 -0
  51. package/com/nav/tpl/home_pc/page_nav.vue +221 -0
  52. package/com/nav/tpl/home_pc/page_type.vue +234 -0
  53. package/com/nav/tpl/home_pc/page_view.vue +125 -0
  54. package/com/nav/tpl/home_phone/page_channel.vue +234 -0
  55. package/com/nav/tpl/home_phone/page_default.vue +234 -0
  56. package/com/nav/tpl/home_phone/page_form.vue +137 -0
  57. package/com/nav/tpl/home_phone/page_nav.vue +237 -0
  58. package/com/nav/tpl/home_phone/page_type.vue +234 -0
  59. package/com/nav/tpl/home_phone/page_view.vue +125 -0
  60. package/com/nav/viewmodel.js +446 -0
  61. package/com/param/com.json +5 -0
  62. package/{core/com → com}/param/config.tpl.json +7 -1
  63. package/com/param/drive.js +502 -0
  64. package/com/param/index.js +155 -0
  65. package/com/param/script.tpl.js +12 -0
  66. package/com/pendant/com.json +5 -0
  67. package/{core/com/component → com/pendant}/config.tpl.json +15 -13
  68. package/com/pendant/drive.js +204 -0
  69. package/com/pendant/index.js +441 -0
  70. package/com/pendant/pendant.html +16 -0
  71. package/com/pendant/script.tpl.js +18 -0
  72. package/com/socket/com.json +5 -0
  73. package/com/socket/config.tpl.json +12 -0
  74. package/com/socket/drive.js +651 -0
  75. package/com/socket/index.js +351 -0
  76. package/com/socket/script.tpl.js +41 -0
  77. package/com/sql/com.json +5 -0
  78. package/{core/com → com}/sql/config.tpl.json +13 -9
  79. package/com/sql/drive.js +1259 -0
  80. package/com/sql/index.js +150 -0
  81. package/com/sql/script.tpl.js +47 -0
  82. package/com/static/com.json +5 -0
  83. package/{core/com → com}/static/config.tpl.json +10 -6
  84. package/com/static/drive.js +194 -0
  85. package/com/static/index.js +226 -0
  86. package/com/static/script.tpl.js +28 -0
  87. package/com/task/com.json +5 -0
  88. package/{core/com → com}/task/config.tpl.json +4 -6
  89. package/com/task/drive.js +405 -0
  90. package/com/task/index.js +148 -0
  91. package/com/task/script.tpl.js +37 -0
  92. package/com/template/com.json +5 -0
  93. package/com/template/config.tpl.json +16 -0
  94. package/com/template/drive.js +80 -0
  95. package/com/template/index.js +141 -0
  96. package/com.js +156 -0
  97. package/common/README.md +2 -0
  98. package/common/handler/msg/handler.json +22 -0
  99. package/common/handler/msg/index.js +23 -0
  100. package/common/handler/player/handler.json +22 -0
  101. package/common/handler/player/index.js +287 -0
  102. package/common/handler/user/handler.json +22 -0
  103. package/common/handler/user/index.js +23 -0
  104. package/common/middleware/web_after/index.js +29 -0
  105. package/common/middleware/web_after/middleware.json +9 -0
  106. package/common/middleware/web_base/index.js +113 -0
  107. package/common/middleware/web_base/middleware.json +19 -0
  108. package/common/middleware/web_before/index.js +33 -0
  109. package/common/middleware/web_before/middleware.json +9 -0
  110. package/common/middleware/web_cors/index.js +87 -0
  111. package/common/middleware/web_cors/middleware.json +24 -0
  112. package/common/middleware/web_error/index.js +119 -0
  113. package/common/middleware/web_error/middleware.json +18 -0
  114. package/common/middleware/web_ip/index.js +15 -0
  115. package/common/middleware/web_ip/middleware.json +14 -0
  116. package/common/middleware/web_logger/index.js +156 -0
  117. package/common/middleware/web_logger/middleware.json +14 -0
  118. package/common/middleware/web_main/index.js +24 -0
  119. package/common/middleware/web_main/middleware.json +9 -0
  120. package/common/middleware/web_static/index.js +73 -0
  121. package/common/middleware/web_static/middleware.json +54 -0
  122. package/common/middleware/web_waf/index.js +385 -0
  123. package/common/middleware/web_waf/middleware.json +13 -0
  124. package/common/model/msg/index.js +88 -0
  125. package/common/model/msg/model.json +401 -0
  126. package/common/model/player/index.js +63 -0
  127. package/common/model/player/model.json +185 -0
  128. package/common/model/user/index.js +11 -0
  129. package/common/model/user/model.json +219 -0
  130. package/core/app/config.tpl.json +67 -0
  131. package/core/app/index.js +632 -0
  132. package/core/app/script.tpl.js +52 -0
  133. package/core/channel/index.js +899 -0
  134. package/core/channel/matcher.js +585 -0
  135. package/core/com/config.tpl.json +16 -0
  136. package/core/com/index.js +74 -0
  137. package/core/com/script.tpl.js +5 -0
  138. package/core/component/component.js +42 -0
  139. package/core/component/config.tpl.json +63 -0
  140. package/core/component/index.js +273 -0
  141. package/core/component/script.tpl.js +19 -0
  142. package/core/controller/config.tpl.json +14 -0
  143. package/core/controller/index.js +373 -0
  144. package/core/controller/script.tpl.js +27 -0
  145. package/core/factory/config.tpl.json +14 -0
  146. package/core/factory/entity.js +275 -0
  147. package/core/factory/index.js +241 -0
  148. package/core/factory/script.tpl.js +16 -0
  149. package/core/game/bat/index.js +137 -0
  150. package/core/game/bat/world.js +622 -0
  151. package/core/game/config.tpl.json +16 -0
  152. package/core/game/entity_admin.js +230 -0
  153. package/core/game/index.js +186 -0
  154. package/core/handler/config.tpl.json +22 -0
  155. package/core/handler/index.js +181 -0
  156. package/core/handler/script.tpl.js +23 -0
  157. package/core/logic/config.tpl.json +14 -0
  158. package/core/logic/index.js +59 -0
  159. package/core/logic/script.tpl.js +19 -0
  160. package/core/middleware/config.tpl.json +16 -0
  161. package/core/middleware/index.js +125 -0
  162. package/core/middleware/script.tpl.js +37 -0
  163. package/core/mod/config.tpl.json +22 -0
  164. package/core/mod/index.js +130 -0
  165. package/core/mod/script.tpl.js +34 -0
  166. package/core/model/config.tpl.json +219 -0
  167. package/core/model/index.js +272 -0
  168. package/core/model/model.js +27 -0
  169. package/core/model/script.tpl.js +20 -0
  170. package/core/notifier/config.tpl.json +14 -0
  171. package/core/notifier/index.js +77 -0
  172. package/core/notifier/script.tpl.js +20 -0
  173. package/core/plugin/config.tpl.json +24 -0
  174. package/core/plugin/index.js +232 -0
  175. package/core/plugin/script.tpl.js +51 -0
  176. package/core/pusher/config.tpl.json +14 -0
  177. package/core/pusher/index.js +161 -0
  178. package/core/pusher/script.tpl.js +20 -0
  179. package/core/room/bat/index.js +170 -0
  180. package/core/room/bat/room.js +524 -0
  181. package/core/room/config.tpl.json +20 -0
  182. package/core/room/index.js +249 -0
  183. package/core/room/room.js +61 -0
  184. package/core/scene/config.tpl.json +14 -0
  185. package/core/scene/index.js +466 -0
  186. package/core/scene/loop.js +1255 -0
  187. package/core/scene/map.js +28 -0
  188. package/core/scene/script.tpl.js +22 -0
  189. package/core/sender/config.tpl.json +14 -0
  190. package/core/sender/index.js +79 -0
  191. package/core/sender/script.tpl.js +20 -0
  192. package/core/service/config.tpl.json +14 -0
  193. package/core/service/index.js +100 -0
  194. package/core/service/script.tpl.js +25 -0
  195. package/core/store/config.tpl.json +26 -0
  196. package/core/store/index.js +1755 -0
  197. package/core/store/script.tpl.js +22 -0
  198. package/core/store/sql.js +1464 -0
  199. package/core/system/config.tpl.json +18 -0
  200. package/core/system/index.js +312 -0
  201. package/core/system/script.tpl.js +77 -0
  202. package/core/view/config.tpl.json +14 -0
  203. package/core/view/index.js +91 -0
  204. package/core/view/script.tpl.js +20 -0
  205. package/core/zone/bat/index.js +725 -0
  206. package/core/zone/config.tpl.json +54 -0
  207. package/core/zone/index.js +614 -0
  208. package/core/zone/script.tpl.js +10 -0
  209. package/core/zone/zone_bat.js +136 -0
  210. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +24 -0
  211. package/index.js +17 -314
  212. package/os.js +57 -0
  213. package/package.json +60 -58
  214. package/server.js +598 -0
  215. package/README.en.md +0 -36
  216. package/conf.json +0 -3
  217. package/core/base/mqtt/index.js +0 -1107
  218. package/core/base/mqtt/lib.js +0 -40
  219. package/core/base/web/index.js +0 -243
  220. package/core/com/api/com.json +0 -4
  221. package/core/com/api/drive.js +0 -668
  222. package/core/com/api/index.js +0 -108
  223. package/core/com/api/oauth.js +0 -158
  224. package/core/com/api/script.js +0 -32
  225. package/core/com/app/README.md +0 -3
  226. package/core/com/app/com.json +0 -4
  227. package/core/com/app/config.tpl.json +0 -16
  228. package/core/com/app/drive.js +0 -309
  229. package/core/com/app/index.js +0 -211
  230. package/core/com/app/script.js +0 -155
  231. package/core/com/cmd/com.json +0 -4
  232. package/core/com/cmd/config.tpl.json +0 -66
  233. package/core/com/cmd/drive.js +0 -513
  234. package/core/com/cmd/index.js +0 -354
  235. package/core/com/cmd/old/5w2h.js +0 -54
  236. package/core/com/cmd/old/drive.js +0 -423
  237. package/core/com/cmd/script.js +0 -11
  238. package/core/com/component/README.md +0 -3
  239. package/core/com/component/com.json +0 -4
  240. package/core/com/component/component.html +0 -16
  241. package/core/com/component/drive.js +0 -197
  242. package/core/com/component/index.js +0 -312
  243. package/core/com/component/script.js +0 -18
  244. package/core/com/db/com.json +0 -4
  245. package/core/com/db/drive.js +0 -1160
  246. package/core/com/db/index.js +0 -176
  247. package/core/com/event/com.json +0 -4
  248. package/core/com/event/drive.js +0 -133
  249. package/core/com/event/index.js +0 -345
  250. package/core/com/event/script.js +0 -26
  251. package/core/com/eventer/com.js +0 -477
  252. package/core/com/eventer/com.json +0 -4
  253. package/core/com/middleware/com.js +0 -153
  254. package/core/com/middleware/com.json +0 -4
  255. package/core/com/middleware/config.tpl.json +0 -8
  256. package/core/com/middleware/script.js +0 -9
  257. package/core/com/mqtt/com.json +0 -4
  258. package/core/com/mqtt/drive.js +0 -600
  259. package/core/com/mqtt/index.js +0 -572
  260. package/core/com/mqtt/mm_mqtt.js +0 -330
  261. package/core/com/mqtt/script.js +0 -604
  262. package/core/com/msg/com.js +0 -296
  263. package/core/com/msg/com.json +0 -4
  264. package/core/com/nav/com.json +0 -4
  265. package/core/com/nav/config.tpl.json +0 -75
  266. package/core/com/nav/drive.js +0 -549
  267. package/core/com/nav/index.js +0 -182
  268. package/core/com/nav/tpl/admin_pc/page_form.vue +0 -180
  269. package/core/com/nav/tpl/admin_pc/page_view.vue +0 -124
  270. package/core/com/nav/tpl/dev_pc/page_default.vue +0 -247
  271. package/core/com/nav/tpl/dev_pc/page_type.vue +0 -313
  272. package/core/com/nav/tpl/home_pc/page_default.vue +0 -234
  273. package/core/com/nav/tpl/home_pc/page_form.vue +0 -137
  274. package/core/com/nav/tpl/home_pc/page_list.vue +0 -234
  275. package/core/com/nav/tpl/home_pc/page_nav.vue +0 -221
  276. package/core/com/nav/tpl/home_pc/page_type.vue +0 -234
  277. package/core/com/nav/tpl/home_pc/page_view.vue +0 -125
  278. package/core/com/nav/tpl/home_phone/page_channel.vue +0 -234
  279. package/core/com/nav/tpl/home_phone/page_default.vue +0 -234
  280. package/core/com/nav/tpl/home_phone/page_form.vue +0 -137
  281. package/core/com/nav/tpl/home_phone/page_nav.vue +0 -237
  282. package/core/com/nav/tpl/home_phone/page_type.vue +0 -234
  283. package/core/com/nav/tpl/home_phone/page_view.vue +0 -125
  284. package/core/com/nav/viewmodel.js +0 -296
  285. package/core/com/param/drive.js +0 -366
  286. package/core/com/param/index.js +0 -80
  287. package/core/com/param/script.js +0 -12
  288. package/core/com/param/test.js +0 -98
  289. package/core/com/plugin/README.md +0 -3
  290. package/core/com/plugin/com.json +0 -4
  291. package/core/com/plugin/config.tpl.json +0 -26
  292. package/core/com/plugin/drive.js +0 -536
  293. package/core/com/plugin/index.js +0 -259
  294. package/core/com/plugin/script.js +0 -213
  295. package/core/com/rpc/com.json +0 -4
  296. package/core/com/rpc/drive.js +0 -160
  297. package/core/com/rpc/index.js +0 -87
  298. package/core/com/rpc/rpc.js +0 -118
  299. package/core/com/socket/com.json +0 -4
  300. package/core/com/socket/config.tpl.json +0 -14
  301. package/core/com/socket/drive.js +0 -403
  302. package/core/com/socket/index.js +0 -62
  303. package/core/com/socket/script.js +0 -42
  304. package/core/com/sql/drive.js +0 -1087
  305. package/core/com/sql/index.js +0 -83
  306. package/core/com/sql/script.js +0 -48
  307. package/core/com/static/com.json +0 -4
  308. package/core/com/static/drive.js +0 -220
  309. package/core/com/static/index.js +0 -149
  310. package/core/com/static/script.js +0 -28
  311. package/core/com/task/com.json +0 -4
  312. package/core/com/task/drive.js +0 -403
  313. package/core/com/task/index.js +0 -110
  314. package/core/com/task/script.js +0 -37
  315. package/core/com/timer/com.js +0 -217
  316. package/core/com/timer/com.json +0 -4
  317. package/core/com/tpl/com.js +0 -19
  318. package/core/com/tpl/com.json +0 -4
  319. package/lib/actions.js +0 -50
  320. package/lib/base.js +0 -361
  321. package/lib/com.js +0 -29
  322. package/lib/ref.js +0 -121
  323. package/middleware/mqtt_base/index.js +0 -10
  324. package/middleware/mqtt_base/middleware.json +0 -10
  325. package/middleware/performance/index.js +0 -151
  326. package/middleware/performance/middleware.json +0 -16
  327. package/middleware/security_audit/index.js +0 -549
  328. package/middleware/security_audit/middleware.json +0 -48
  329. package/middleware/security_headers/index.js +0 -487
  330. package/middleware/security_headers/middleware.json +0 -45
  331. package/middleware/waf/index.js +0 -348
  332. package/middleware/waf/middleware.json +0 -10
  333. package/middleware/waf_ddos/index.js +0 -520
  334. package/middleware/waf_ddos/middleware.json +0 -38
  335. package/middleware/waf_ip/index.js +0 -379
  336. package/middleware/waf_ip/middleware.json +0 -49
  337. package/middleware/waf_xss/index.js +0 -269
  338. package/middleware/waf_xss/middleware.json +0 -18
  339. package/middleware/web_after/index.js +0 -33
  340. package/middleware/web_after/middleware.json +0 -9
  341. package/middleware/web_base/index.js +0 -90
  342. package/middleware/web_base/middleware.json +0 -9
  343. package/middleware/web_before/index.js +0 -27
  344. package/middleware/web_before/middleware.json +0 -9
  345. package/middleware/web_check/index.js +0 -28
  346. package/middleware/web_check/middleware.json +0 -9
  347. package/middleware/web_main/index.js +0 -28
  348. package/middleware/web_main/middleware.json +0 -9
  349. package/middleware/web_proxy/index.js +0 -37
  350. package/middleware/web_proxy/middleware.json +0 -9
  351. package/middleware/web_render/index.js +0 -87
  352. package/middleware/web_render/middleware.json +0 -9
  353. package/middleware/web_socket/index.js +0 -34
  354. package/middleware/web_socket/middleware.json +0 -9
  355. package/middleware/web_static/index.js +0 -115
  356. package/middleware/web_static/middleware.json +0 -9
  357. /package/{core/com → com}/api/README.md +0 -0
  358. /package/{core/com → com}/db/README.md +0 -0
  359. /package/{core/com → com}/event/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;