wok-server 0.5.0 → 0.7.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/README.en.md +61 -0
  2. package/README.md +44 -29
  3. package/dist/cache/cache.js +98 -98
  4. package/dist/cache/config.js +19 -19
  5. package/dist/cache/index.js +27 -27
  6. package/dist/cache/purge-task.js +46 -46
  7. package/dist/cache/stat.js +47 -47
  8. package/dist/config/convert.js +36 -36
  9. package/dist/config/exception.js +14 -14
  10. package/dist/config/index.js +81 -81
  11. package/dist/http-client/index.js +136 -136
  12. package/dist/i18n/ar.js +17 -17
  13. package/dist/i18n/de.js +17 -17
  14. package/dist/i18n/en-us.js +17 -17
  15. package/dist/i18n/es.js +17 -17
  16. package/dist/i18n/fr.js +17 -17
  17. package/dist/i18n/i18n.js +231 -231
  18. package/dist/i18n/index.js +52 -52
  19. package/dist/i18n/ja.js +17 -17
  20. package/dist/i18n/ko.js +17 -17
  21. package/dist/i18n/msg.js +2 -2
  22. package/dist/i18n/pt.js +17 -17
  23. package/dist/i18n/ru.js +17 -17
  24. package/dist/i18n/tag.js +18 -18
  25. package/dist/i18n/zh-HK.js +17 -17
  26. package/dist/i18n/zh-TW.js +17 -17
  27. package/dist/i18n/zh-cn.js +17 -17
  28. package/dist/index.js +14 -14
  29. package/dist/lock/index.js +114 -114
  30. package/dist/log/config.js +35 -35
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -198
  33. package/dist/log/index.js +135 -135
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -56
  36. package/dist/log/store.js +19 -19
  37. package/dist/mongodb/collection.js +2 -2
  38. package/dist/mongodb/config.js +34 -34
  39. package/dist/mongodb/doc.js +2 -2
  40. package/dist/mongodb/exception.js +14 -14
  41. package/dist/mongodb/index.js +58 -58
  42. package/dist/mongodb/manager/base.js +563 -563
  43. package/dist/mongodb/manager/index.js +63 -63
  44. package/dist/mongodb/manager/tx-strict.js +84 -84
  45. package/dist/mongodb/manager/tx.js +30 -30
  46. package/dist/mongodb/migration.js +52 -52
  47. package/dist/mvc/access-log.js +33 -33
  48. package/dist/mvc/config.js +27 -27
  49. package/dist/mvc/exchange.js +113 -113
  50. package/dist/mvc/handler/index.js +7 -6
  51. package/dist/mvc/handler/json.js +65 -65
  52. package/dist/mvc/handler/restful.js +35 -35
  53. package/dist/mvc/handler/sse.js +65 -0
  54. package/dist/mvc/handler/upload.js +31 -31
  55. package/dist/mvc/index.js +50 -50
  56. package/dist/mvc/interceptor.js +2 -2
  57. package/dist/mvc/query.js +43 -43
  58. package/dist/mvc/render/file.js +132 -132
  59. package/dist/mvc/render/html/html.js +90 -90
  60. package/dist/mvc/render/html/index.js +18 -18
  61. package/dist/mvc/render/html/style.js +2 -2
  62. package/dist/mvc/render/index.js +7 -7
  63. package/dist/mvc/render/json.js +26 -26
  64. package/dist/mvc/render/text.js +16 -16
  65. package/dist/mvc/router.js +2 -2
  66. package/dist/mvc/server.js +272 -272
  67. package/dist/mvc/static/header.js +67 -67
  68. package/dist/mvc/static/index.js +6 -6
  69. package/dist/mvc/static/mime-type.js +84 -84
  70. package/dist/mvc/static/server-cache-config.js +66 -66
  71. package/dist/mvc/static/server-cache.js +133 -133
  72. package/dist/mvc/static/static-handler.js +372 -372
  73. package/dist/mysql/config.js +51 -51
  74. package/dist/mysql/exception.js +14 -14
  75. package/dist/mysql/index.js +87 -87
  76. package/dist/mysql/manager/base.js +278 -239
  77. package/dist/mysql/manager/index.js +107 -107
  78. package/dist/mysql/manager/ops/count.js +20 -20
  79. package/dist/mysql/manager/ops/criteria.js +381 -356
  80. package/dist/mysql/manager/ops/delete.js +59 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +149 -169
  83. package/dist/mysql/manager/ops/index.js +16 -14
  84. package/dist/mysql/manager/ops/insert.js +132 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/order-by.js +28 -0
  87. package/dist/mysql/manager/ops/paginate.js +48 -23
  88. package/dist/mysql/manager/ops/query.js +9 -9
  89. package/dist/mysql/manager/ops/update.js +222 -216
  90. package/dist/mysql/manager/ops/upsert.js +178 -0
  91. package/dist/mysql/manager/ops/utils.js +28 -24
  92. package/dist/mysql/manager/tx-strict.js +103 -103
  93. package/dist/mysql/manager/tx.js +30 -30
  94. package/dist/mysql/manager/utils.js +56 -56
  95. package/dist/mysql/migration.js +136 -136
  96. package/dist/mysql/table-info.js +8 -8
  97. package/dist/task/daily.js +59 -59
  98. package/dist/task/fixed-delay.js +38 -38
  99. package/dist/task/fixed-rate.js +42 -42
  100. package/dist/task/index.js +9 -9
  101. package/dist/task/task.js +56 -56
  102. package/dist/validation/exception.js +36 -36
  103. package/dist/validation/index.js +40 -40
  104. package/dist/validation/validator/array.js +34 -34
  105. package/dist/validation/validator/enum.js +28 -28
  106. package/dist/validation/validator/index.js +14 -14
  107. package/dist/validation/validator/length.js +40 -40
  108. package/dist/validation/validator/max-length.js +35 -35
  109. package/dist/validation/validator/max.js +29 -29
  110. package/dist/validation/validator/min-length.js +33 -33
  111. package/dist/validation/validator/min.js +29 -29
  112. package/dist/validation/validator/not-blank.js +33 -33
  113. package/dist/validation/validator/not-null.js +21 -21
  114. package/dist/validation/validator/plain-obj.js +32 -32
  115. package/dist/validation/validator/regexp.js +34 -34
  116. package/documentation/en/cache.md +56 -0
  117. package/documentation/en/config.md +96 -0
  118. package/documentation/en/engineering.md +256 -0
  119. package/documentation/en/http-client.md +32 -0
  120. package/documentation/en/i18n.md +143 -0
  121. package/documentation/en/index.md +24 -0
  122. package/documentation/en/lock.md +51 -0
  123. package/documentation/en/log.md +109 -0
  124. package/documentation/en/mongodb.md +256 -0
  125. package/documentation/en/mvc.md +688 -0
  126. package/documentation/en/mysql.md +682 -0
  127. package/documentation/en/task.md +45 -0
  128. package/documentation/en/test.md +56 -0
  129. package/documentation/en/validate.md +130 -0
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +146 -17
  132. package/package.json +4 -1
  133. package/skills/wok-server-api-rules/SKILL.md +350 -0
  134. package/skills/wok-server-cache/SKILL.md +216 -0
  135. package/skills/wok-server-code-navigation/SKILL.md +153 -0
  136. package/skills/wok-server-config/SKILL.md +200 -0
  137. package/skills/wok-server-getting-started/SKILL.md +123 -0
  138. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  139. package/skills/wok-server-http-client/SKILL.md +164 -0
  140. package/skills/wok-server-i18n/SKILL.md +214 -0
  141. package/skills/wok-server-lock/SKILL.md +144 -0
  142. package/skills/wok-server-log/SKILL.md +218 -0
  143. package/skills/wok-server-mongodb/SKILL.md +235 -0
  144. package/skills/wok-server-mvc/SKILL.md +251 -0
  145. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  146. package/skills/wok-server-mvc/references/sse.md +121 -0
  147. package/skills/wok-server-mvc/references/static-files.md +47 -0
  148. package/skills/wok-server-mvc/references/upload.md +62 -0
  149. package/skills/wok-server-mvc/references/websocket.md +30 -0
  150. package/skills/wok-server-mysql/SKILL.md +388 -0
  151. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  152. package/skills/wok-server-mysql/references/version-control.md +22 -0
  153. package/skills/wok-server-task/SKILL.md +158 -0
  154. package/skills/wok-server-validate/SKILL.md +167 -0
  155. package/src/cache/cache.ts +118 -0
  156. package/src/cache/config.ts +53 -0
  157. package/src/cache/index.ts +27 -0
  158. package/src/cache/purge-task.ts +53 -0
  159. package/src/cache/stat.ts +47 -0
  160. package/src/config/convert.ts +27 -0
  161. package/src/config/exception.ts +8 -0
  162. package/src/config/index.ts +92 -0
  163. package/src/http-client/index.ts +202 -0
  164. package/src/i18n/ar.ts +16 -0
  165. package/src/i18n/de.ts +16 -0
  166. package/src/i18n/en-us.ts +16 -0
  167. package/src/i18n/es.ts +16 -0
  168. package/src/i18n/fr.ts +16 -0
  169. package/src/i18n/i18n.ts +230 -0
  170. package/src/i18n/index.ts +50 -0
  171. package/src/i18n/ja.ts +16 -0
  172. package/src/i18n/ko.ts +16 -0
  173. package/src/i18n/msg.ts +50 -0
  174. package/src/i18n/pt.ts +16 -0
  175. package/src/i18n/ru.ts +16 -0
  176. package/src/i18n/tag.ts +18 -0
  177. package/src/i18n/zh-HK.ts +16 -0
  178. package/src/i18n/zh-TW.ts +16 -0
  179. package/src/i18n/zh-cn.ts +16 -0
  180. package/src/index.ts +11 -0
  181. package/src/lock/index.ts +164 -0
  182. package/src/log/config.ts +71 -0
  183. package/src/log/date.ts +19 -0
  184. package/src/log/file.ts +215 -0
  185. package/src/log/index.ts +136 -0
  186. package/src/log/level.ts +29 -0
  187. package/src/log/log.ts +77 -0
  188. package/src/log/store.ts +31 -0
  189. package/src/mongodb/collection.ts +25 -0
  190. package/src/mongodb/config.ts +69 -0
  191. package/src/mongodb/doc.ts +12 -0
  192. package/src/mongodb/exception.ts +8 -0
  193. package/src/mongodb/index.ts +71 -0
  194. package/src/mongodb/manager/base.ts +674 -0
  195. package/src/mongodb/manager/index.ts +80 -0
  196. package/src/mongodb/manager/tx-strict.ts +153 -0
  197. package/src/mongodb/manager/tx.ts +34 -0
  198. package/src/mongodb/migration.ts +66 -0
  199. package/src/mvc/access-log.ts +33 -0
  200. package/src/mvc/config.ts +70 -0
  201. package/src/mvc/exchange.ts +126 -0
  202. package/src/mvc/handler/index.ts +4 -0
  203. package/src/mvc/handler/json.ts +96 -0
  204. package/src/mvc/handler/restful.ts +39 -0
  205. package/src/mvc/handler/sse.ts +90 -0
  206. package/src/mvc/handler/upload.ts +54 -0
  207. package/src/mvc/index.ts +48 -0
  208. package/src/mvc/interceptor.ts +12 -0
  209. package/src/mvc/query.ts +36 -0
  210. package/src/mvc/render/file.ts +148 -0
  211. package/src/mvc/render/html/html.ts +187 -0
  212. package/src/mvc/render/html/index.ts +16 -0
  213. package/src/mvc/render/html/style.ts +1201 -0
  214. package/src/mvc/render/index.ts +4 -0
  215. package/src/mvc/render/json.ts +24 -0
  216. package/src/mvc/render/text.ts +14 -0
  217. package/src/mvc/router.ts +13 -0
  218. package/src/mvc/server.ts +315 -0
  219. package/src/mvc/static/header.ts +86 -0
  220. package/src/mvc/static/index.ts +3 -0
  221. package/src/mvc/static/mime-type.ts +81 -0
  222. package/src/mvc/static/server-cache-config.ts +92 -0
  223. package/src/mvc/static/server-cache.ts +171 -0
  224. package/src/mvc/static/static-handler.ts +445 -0
  225. package/src/mysql/config.ts +130 -0
  226. package/src/mysql/exception.ts +8 -0
  227. package/src/mysql/index.ts +88 -0
  228. package/src/mysql/manager/base.ts +332 -0
  229. package/src/mysql/manager/index.ts +112 -0
  230. package/src/mysql/manager/ops/count.ts +30 -0
  231. package/src/mysql/manager/ops/criteria.ts +446 -0
  232. package/src/mysql/manager/ops/delete.ts +91 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +209 -0
  235. package/src/mysql/manager/ops/index.ts +13 -0
  236. package/src/mysql/manager/ops/insert.ts +158 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/order-by.ts +58 -0
  239. package/src/mysql/manager/ops/paginate.ts +100 -0
  240. package/src/mysql/manager/ops/query.ts +13 -0
  241. package/src/mysql/manager/ops/update.ts +318 -0
  242. package/src/mysql/manager/ops/upsert.ts +224 -0
  243. package/src/mysql/manager/ops/utils.ts +24 -0
  244. package/src/mysql/manager/tx-strict.ts +138 -0
  245. package/src/mysql/manager/tx.ts +31 -0
  246. package/src/mysql/manager/utils.ts +75 -0
  247. package/src/mysql/migration.ts +149 -0
  248. package/src/mysql/table-info.ts +41 -0
  249. package/src/task/daily.ts +70 -0
  250. package/src/task/fixed-delay.ts +45 -0
  251. package/src/task/fixed-rate.ts +49 -0
  252. package/src/task/index.ts +4 -0
  253. package/src/task/task.ts +70 -0
  254. package/src/validation/exception.ts +27 -0
  255. package/src/validation/index.ts +61 -0
  256. package/src/validation/validator/array.ts +32 -0
  257. package/src/validation/validator/enum.ts +25 -0
  258. package/src/validation/validator/index.ts +11 -0
  259. package/src/validation/validator/length.ts +42 -0
  260. package/src/validation/validator/max-length.ts +33 -0
  261. package/src/validation/validator/max.ts +26 -0
  262. package/src/validation/validator/min-length.ts +31 -0
  263. package/src/validation/validator/min.ts +26 -0
  264. package/src/validation/validator/not-blank.ts +31 -0
  265. package/src/validation/validator/not-null.ts +19 -0
  266. package/src/validation/validator/plain-obj.ts +30 -0
  267. package/src/validation/validator/regexp.ts +32 -0
  268. package/types/cache/cache.d.ts +52 -52
  269. package/types/cache/config.d.ts +32 -32
  270. package/types/cache/index.d.ts +2 -2
  271. package/types/cache/purge-task.d.ts +11 -11
  272. package/types/cache/stat.d.ts +26 -26
  273. package/types/config/convert.d.ts +6 -6
  274. package/types/config/exception.d.ts +7 -7
  275. package/types/config/index.d.ts +25 -25
  276. package/types/http-client/index.d.ts +71 -71
  277. package/types/i18n/ar.d.ts +2 -2
  278. package/types/i18n/de.d.ts +2 -2
  279. package/types/i18n/en-us.d.ts +2 -2
  280. package/types/i18n/es.d.ts +2 -2
  281. package/types/i18n/fr.d.ts +2 -2
  282. package/types/i18n/i18n.d.ts +102 -102
  283. package/types/i18n/index.d.ts +9 -9
  284. package/types/i18n/ja.d.ts +2 -2
  285. package/types/i18n/ko.d.ts +2 -2
  286. package/types/i18n/msg.d.ts +50 -50
  287. package/types/i18n/pt.d.ts +2 -2
  288. package/types/i18n/ru.d.ts +2 -2
  289. package/types/i18n/tag.d.ts +11 -11
  290. package/types/i18n/zh-HK.d.ts +2 -2
  291. package/types/i18n/zh-TW.d.ts +2 -2
  292. package/types/i18n/zh-cn.d.ts +2 -2
  293. package/types/index.d.ts +11 -11
  294. package/types/lock/index.d.ts +64 -64
  295. package/types/log/config.d.ts +35 -35
  296. package/types/log/date.d.ts +2 -2
  297. package/types/log/file.d.ts +13 -13
  298. package/types/log/index.d.ts +53 -53
  299. package/types/log/level.d.ts +14 -14
  300. package/types/log/log.d.ts +40 -40
  301. package/types/log/store.d.ts +19 -19
  302. package/types/mongodb/collection.d.ts +25 -25
  303. package/types/mongodb/config.d.ts +45 -45
  304. package/types/mongodb/doc.d.ts +11 -11
  305. package/types/mongodb/exception.d.ts +7 -7
  306. package/types/mongodb/index.d.ts +29 -29
  307. package/types/mongodb/manager/base.d.ts +188 -188
  308. package/types/mongodb/manager/index.d.ts +38 -38
  309. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  310. package/types/mongodb/manager/tx.d.ts +21 -21
  311. package/types/mongodb/migration.d.ts +12 -12
  312. package/types/mvc/access-log.d.ts +7 -7
  313. package/types/mvc/config.d.ts +42 -42
  314. package/types/mvc/exchange.d.ts +72 -72
  315. package/types/mvc/handler/index.d.ts +4 -3
  316. package/types/mvc/handler/json.d.ts +44 -44
  317. package/types/mvc/handler/restful.d.ts +11 -11
  318. package/types/mvc/handler/sse.d.ts +34 -0
  319. package/types/mvc/handler/upload.d.ts +36 -36
  320. package/types/mvc/index.d.ts +22 -22
  321. package/types/mvc/interceptor.d.ts +11 -11
  322. package/types/mvc/query.d.ts +13 -13
  323. package/types/mvc/render/file.d.ts +10 -10
  324. package/types/mvc/render/html/html.d.ts +98 -98
  325. package/types/mvc/render/html/index.d.ts +11 -11
  326. package/types/mvc/render/html/style.d.ts +1201 -1201
  327. package/types/mvc/render/index.d.ts +4 -4
  328. package/types/mvc/render/json.d.ts +17 -17
  329. package/types/mvc/render/text.d.ts +10 -10
  330. package/types/mvc/router.d.ts +11 -11
  331. package/types/mvc/server.d.ts +90 -90
  332. package/types/mvc/static/header.d.ts +27 -27
  333. package/types/mvc/static/index.d.ts +3 -3
  334. package/types/mvc/static/mime-type.d.ts +2 -2
  335. package/types/mvc/static/server-cache-config.d.ts +30 -30
  336. package/types/mvc/static/server-cache.d.ts +76 -76
  337. package/types/mvc/static/static-handler.d.ts +77 -77
  338. package/types/mysql/config.d.ts +90 -90
  339. package/types/mysql/exception.d.ts +7 -7
  340. package/types/mysql/index.d.ts +16 -16
  341. package/types/mysql/manager/base.d.ts +196 -165
  342. package/types/mysql/manager/index.d.ts +36 -36
  343. package/types/mysql/manager/ops/count.d.ts +13 -13
  344. package/types/mysql/manager/ops/criteria.d.ts +144 -134
  345. package/types/mysql/manager/ops/delete.d.ts +47 -46
  346. package/types/mysql/manager/ops/exist.d.ts +6 -6
  347. package/types/mysql/manager/ops/find.d.ts +87 -86
  348. package/types/mysql/manager/ops/index.d.ts +12 -10
  349. package/types/mysql/manager/ops/insert.d.ts +32 -18
  350. package/types/mysql/manager/ops/modify.d.ts +3 -3
  351. package/types/mysql/manager/ops/order-by.d.ts +38 -0
  352. package/types/mysql/manager/ops/paginate.d.ts +53 -36
  353. package/types/mysql/manager/ops/query.d.ts +3 -3
  354. package/types/mysql/manager/ops/update.d.ts +99 -76
  355. package/types/mysql/manager/ops/upsert.d.ts +36 -0
  356. package/types/mysql/manager/ops/utils.d.ts +5 -5
  357. package/types/mysql/manager/tx-strict.d.ts +36 -36
  358. package/types/mysql/manager/tx.d.ts +15 -15
  359. package/types/mysql/manager/utils.d.ts +17 -17
  360. package/types/mysql/migration.d.ts +8 -8
  361. package/types/mysql/table-info.d.ts +36 -36
  362. package/types/task/daily.d.ts +16 -16
  363. package/types/task/fixed-delay.d.ts +9 -9
  364. package/types/task/fixed-rate.d.ts +9 -9
  365. package/types/task/index.d.ts +4 -4
  366. package/types/task/task.d.ts +34 -34
  367. package/types/validation/exception.d.ts +38 -38
  368. package/types/validation/index.d.ts +32 -32
  369. package/types/validation/validator/array.d.ts +5 -5
  370. package/types/validation/validator/enum.d.ts +8 -8
  371. package/types/validation/validator/index.d.ts +11 -11
  372. package/types/validation/validator/length.d.ts +10 -10
  373. package/types/validation/validator/max-length.d.ts +8 -8
  374. package/types/validation/validator/max.d.ts +7 -7
  375. package/types/validation/validator/min-length.d.ts +6 -6
  376. package/types/validation/validator/min.d.ts +7 -7
  377. package/types/validation/validator/not-blank.d.ts +7 -7
  378. package/types/validation/validator/not-null.d.ts +6 -6
  379. package/types/validation/validator/plain-obj.d.ts +7 -7
  380. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,164 @@
1
+ ---
2
+ name: wok-server-http-client
3
+ description: wok-server HTTP 客户端组件使用指南,基于 Node.js 内置 http/https 模块封装的请求工具。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server HTTP 客户端
11
+
12
+ ## 概述
13
+
14
+ HTTP 客户端基于 Node.js 内置 `http` 和 `https` 模块封装,提供三个函数:`doRequest`(通用请求)、`postJson`(JSON 响应 POST)、`getJson`(JSON 响应 GET)。支持自动 HTTPS、重定向跟随、超时控制。
15
+
16
+ ## 源码与类型定义
17
+
18
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
19
+
20
+ - 源码目录:`node_modules/wok-server/src/http-client/`
21
+ - 类型定义:`node_modules/wok-server/types/` (引用 http-client 组件的 `.d.ts` 文件)
22
+
23
+ 核心源码文件:
24
+
25
+ | 文件 | 说明 |
26
+ | :-------------- | :--------------------------------- |
27
+ | `index.ts` | `doRequest`、`postJson`、`getJson` |
28
+
29
+ ---
30
+
31
+ ## 三个函数
32
+
33
+ | 函数 | 作用 |
34
+ | :---------- | :------------------------------------- |
35
+ | `doRequest` | 通用 HTTP 请求,自定义所有选项 |
36
+ | `postJson` | POST 请求 + JSON 响应,自动序列化 body |
37
+ | `getJson` | GET 请求 + JSON 响应,默认跟随重定向 |
38
+
39
+ ---
40
+
41
+ ## getJson — GET JSON 请求
42
+
43
+ ```ts
44
+ function getJson<T>(
45
+ opts: { url: string; query?: Record<string, string[] | string>; headers?: IncomingHttpHeaders; timeout?: number }
46
+ ): Promise<T>
47
+ ```
48
+
49
+ - 自动跟随重定向(`followRedirect: true`)
50
+ - 状态码非 200 抛异常(含响应体前 1024 字节)
51
+ - 空响应体返回 `{}`
52
+
53
+ ```ts
54
+ import { getJson } from 'wok-server'
55
+
56
+ const list = await getJson<User[]>({
57
+ url: 'https://api.example.com/users',
58
+ query: { status: 'active' },
59
+ headers: { 'Authorization': 'Bearer xxx' },
60
+ timeout: 3000
61
+ })
62
+ ```
63
+
64
+ ---
65
+
66
+ ## postJson — POST JSON 请求
67
+
68
+ ```ts
69
+ function postJson<T>(
70
+ opts: { url: string; body: any; query?: Record<string, string[] | string>; headers?: IncomingHttpHeaders; timeout?: number }
71
+ ): Promise<T>
72
+ ```
73
+
74
+ - 自动设置 `Content-Type: application/json; charset=utf-8`
75
+ - 自动将 `body` 序列化为 JSON 字符串
76
+ - 不跟随重定向(`followRedirect: false`)
77
+ - 状态码非 200 抛异常
78
+
79
+ ```ts
80
+ import { postJson } from 'wok-server'
81
+
82
+ const res = await postJson<{ id: string }>({
83
+ url: 'https://api.example.com/users',
84
+ body: { name: 'jack', age: 33 },
85
+ timeout: 5000
86
+ })
87
+ ```
88
+
89
+ ---
90
+
91
+ ## doRequest — 通用请求
92
+
93
+ ```ts
94
+ function doRequest(opts: HttpRequestOpts): Promise<HttpResponseInfo>
95
+ ```
96
+
97
+ 完整选项:
98
+
99
+ | 选项 | 类型 | 说明 |
100
+ | :--------------- | :------------------------------------------------ | :------------------------------------- |
101
+ | `url` | `string` | 请求地址(支持 `http://` 和 `https://`) |
102
+ | `method` | `GET \| POST \| PUT \| DELETE \| ...` | 请求方法 |
103
+ | `body` | `string \| Buffer` | 请求正文(可选) |
104
+ | `query` | `Record<string, string \| string[]>` | 查询参数,自动拼接 URL(可选) |
105
+ | `headers` | `IncomingHttpHeaders` | 自定义消息头(可选) |
106
+ | `timeout` | `number` | 超时时间(ms),默认 5000 |
107
+ | `followRedirect` | `boolean` | 是否跟随重定向(301/302/303/307/308) |
108
+
109
+ 返回值 `HttpResponseInfo`:
110
+
111
+ ```ts
112
+ interface HttpResponseInfo {
113
+ status: number
114
+ headers: IncomingHttpHeaders
115
+ body: Buffer
116
+ }
117
+ ```
118
+
119
+ 示例:
120
+
121
+ ```ts
122
+ import { doRequest } from 'wok-server'
123
+
124
+ // DELETE 请求
125
+ const res = await doRequest({
126
+ url: 'https://api.example.com/users/001',
127
+ method: 'DELETE',
128
+ timeout: 5000
129
+ })
130
+
131
+ // 带查询参数
132
+ const res2 = await doRequest({
133
+ url: 'https://api.example.com/search',
134
+ method: 'GET',
135
+ query: { keyword: 'test', tags: ['a', 'b'] }
136
+ })
137
+
138
+ // 跟随重定向
139
+ const res3 = await doRequest({
140
+ url: 'https://short.link/abc',
141
+ method: 'GET',
142
+ followRedirect: true
143
+ })
144
+ ```
145
+
146
+ ---
147
+
148
+ ## 内部实现要点
149
+
150
+ ### URL 解析
151
+
152
+ 使用 Node.js 内置 `URL` 类解析,根据 `protocol` 自动选择 `http.request` 或 `https.request`。`query` 通过 `url.searchParams.append` 拼接(支持 `string` 和 `string[]`)。
153
+
154
+ ### 重定向
155
+
156
+ `doRequest` 中检测 301/302/303/307/308 状态码时,取 `location` 头作为新 URL 递归调用。递归只进行一次(二次请求强制 `followRedirect: false`),防止死循环。
157
+
158
+ ### 超时
159
+
160
+ 通过 `req.on('timeout', ...)` 处理超时,timeout 默认为 5000ms。也可以传入自定义值,`<=0` 视为无效使用默认值。
161
+
162
+ ### HTTPS
163
+
164
+ `rejectUnauthorized: false`,不验证服务端证书,适用于自签名证书场景。
@@ -0,0 +1,214 @@
1
+ ---
2
+ name: wok-server-i18n
3
+ description: wok-server 国际化组件使用指南,支持多语言消息构建、语言绑定、扩展业务国际化内容。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server 国际化组件
11
+
12
+ ## 概述
13
+
14
+ 国际化组件提供多语言消息构建能力,内置 12 种语言,支持扩展新语言和业务国际化内容。`getI18n()` 返回全局单例。
15
+
16
+ 注意:全局 i18n 对象是共享的,异步请求中可能出现语言被其他请求串改的问题——请使用绑定功能(`bindByRequest` / `bindLang`)解决。
17
+
18
+ ## 源码与类型定义
19
+
20
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
21
+
22
+ - 源码目录:`node_modules/wok-server/src/i18n/`
23
+ - 类型定义:`node_modules/wok-server/types/` (引用 i18n 组件的 `.d.ts` 文件)
24
+
25
+ 核心源码文件:
26
+
27
+ | 文件 | 说明 |
28
+ | :-------------- | :--------------------------------- |
29
+ | `i18n.ts` | `I18n`、`BoundI18n`、`ExtensibleI18n` 三个类 |
30
+ | `index.ts` | 模块入口,`getI18n()` 初始化 12 种语言 |
31
+ | `tag.ts` | 语言标签解析(`zh-CN` → `{lang, region}`) |
32
+ | `msg.ts` | 内置消息模板类型定义 `I18nMsgs` |
33
+ | `zh-cn.ts` 等 | 各语言的消息模板文件 |
34
+
35
+ ---
36
+
37
+ ## 获取实例
38
+
39
+ ```ts
40
+ import { getI18n } from 'wok-server'
41
+ const i18n = getI18n()
42
+ ```
43
+
44
+ 首次调用完成初始化后始终返回同一实例。初始化时会根据环境变量 `LANG` 或 `LC_CTYPE` 自动切换语言。
45
+
46
+ ---
47
+
48
+ ## 基本操作
49
+
50
+ ### 获取 / 切换语言
51
+
52
+ ```ts
53
+ const lang = i18n.getLang() // 'zh-CN'
54
+ const ok = i18n.setLang('en') // true 成功,false 不支持
55
+ ```
56
+
57
+ ### 构建消息
58
+
59
+ ```ts
60
+ const msg = i18n.buildMsg('validate-err-max', '7')
61
+ // zh-CN: "7 以下である必要があります" → 实际看当前语言
62
+ ```
63
+
64
+ `buildMsg(key, ...args)` 中 `key` 有类型约束(`I18nMsgs`),模板中用 `{}` 占位,按顺序替换。
65
+
66
+ ### 支持的语言标签检测
67
+
68
+ ```ts
69
+ const supported = i18n.getSupportedLanguageTags('zh-CN', 'xx', 'ja')
70
+ // ['zh-CN', 'ja'] — 过滤掉不支持的
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 内置语言
76
+
77
+ | 语言标签 | 语言 |
78
+ | :------- | :----------- |
79
+ | en | 英语(默认) |
80
+ | zh-CN | 简体中文 |
81
+ | zh-TW | 繁体中文 |
82
+ | zh-HK | 香港繁体 |
83
+ | ja | 日语 |
84
+ | ko | 韩语 |
85
+ | ru | 俄语 |
86
+ | es | 西班牙语 |
87
+ | de | 德语 |
88
+ | fr | 法语 |
89
+ | ar | 阿拉伯语 |
90
+ | pt | 葡萄牙语 |
91
+
92
+ ---
93
+
94
+ ## 语言匹配规则
95
+
96
+ `setLang` 的匹配逻辑(实现在 `findMsgsByLang`):
97
+
98
+ 1. 解析语言标签为 `{lang, region}`
99
+ 2. 查 `lang` 下的 region → 精确匹配 region
100
+ 3. 未命中查默认区域 `-`
101
+ 4. 仍未命中取该语言下第一个 region
102
+ 5. 全部未命中返回 `undefined`,`setLang` 返回 `false`,语言不变
103
+
104
+ **注意**:匹配失败不会回退到英文默认语言,而是保持原有语言不变。
105
+
106
+ ---
107
+
108
+ ## 配置新语言
109
+
110
+ 如果需要的语言未内置,通过 `setMsgs` 添加消息模板后即可切换:
111
+
112
+ ```ts
113
+ i18n.setMsgs('ja', {
114
+ 'validate-err-array': '値が配列ではありません',
115
+ 'validate-err-max': '{} 以下である必要があります',
116
+ 'validate-err-min': '{} 以上である必要があります',
117
+ 'validate-err-empty': '空であってはいけません',
118
+ 'validate-err-string': '値が文字列のタイプではありません',
119
+ // ... 其他 key 来自 I18nMsgs
120
+ })
121
+ i18n.setLang('ja')
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 扩展业务国际化内容
127
+
128
+ 通过 `extend` 创建独立的 i18n 对象,与全局 i18n 自动保持语言同步:
129
+
130
+ ```ts
131
+ interface ExtMsgs { hello: string; world: string }
132
+
133
+ const extI18n = i18n.extend<ExtMsgs>({ hello: 'hello', world: 'world' })
134
+ extI18n.setMsgs('zh-CN', { hello: '你好', world: '世界' })
135
+
136
+ i18n.setLang('zh-CN')
137
+ extI18n.buildMsg('hello') // "你好"
138
+ ```
139
+
140
+ **约束**:所有消息模板 value 必须是 `string`,模板支持 `{}` 占位。扩展对象的 `setLang` 会自动被全局 i18n 的 `setLang` 同步调用(`ExtensibleI18n` 覆写了 `setLang`,遍历 `extendedI18ns` 逐个同步)。
141
+
142
+ ---
143
+
144
+ ## 绑定语言 — 解决异步串扰
145
+
146
+ 由于全局 i18n 共享,请求 A 切换语言后执行异步操作,请求 B 可能在此期间切换语言,导致 A 的消息构建语言错误。解决方案:
147
+
148
+ ### bindByRequest — 根据请求头绑定
149
+
150
+ ```ts
151
+ async function handleReq(exchange: RouterExchange): Promise<void> {
152
+ const boundI18n = extI18n.bindByRequest(exchange.headers)
153
+ await query1()
154
+ await query2()
155
+ const hello = boundI18n.buildMsg('hello') // 语言固定,不受其他请求影响
156
+ }
157
+ ```
158
+
159
+ 解析 `accept-language` 头,取第一个支持的语言,生成 `BoundI18n`。`BoundI18n` 没有 `setLang` 方法,语言不可变。
160
+
161
+ ### bindLang — 手动绑定
162
+
163
+ ```ts
164
+ const bound = i18n.bindLang('zh-CN') // 绑定指定语言
165
+ const bound2 = i18n.bindLang() // 绑定当前语言
166
+ bound.buildMsg('validate-err-empty')
167
+ ```
168
+
169
+ `bindLang` 不传参时绑定当前语言,传参且语言不支持时抛出 `Error`。
170
+
171
+ ### switchByRequest — 直接切换
172
+
173
+ ```ts
174
+ i18n.switchByRequest(exchange.headers)
175
+ ```
176
+
177
+ 根据 `accept-language` 直接切换全局语言(不创建绑定对象)。适合没有异步串扰风险的场景。
178
+
179
+ ---
180
+
181
+ ## 无国际化需求时固定中文
182
+
183
+ 在 import 框架之前设置:
184
+
185
+ ```ts
186
+ process.env.LANG = 'zh-CN'
187
+ import { startWebServer } from 'wok-server'
188
+ ```
189
+
190
+ 或者在容器中设置 `LANG=zh-CN` 环境变量。
191
+
192
+ ---
193
+
194
+ ## 内部实现要点
195
+
196
+ ### 类层次
197
+
198
+ ```
199
+ I18n<T> — 核心类:setLang/getLang/buildMsg/bindLang/bindByRequest/switchByRequest
200
+ └── ExtensibleI18n<T> — 增加 extend 方法,覆写 setLang 同步扩展子对象
201
+ BoundI18n<T> — 轻量只读绑定对象,仅 getLang/buildMsg
202
+ ```
203
+
204
+ ### 消息存储结构
205
+
206
+ `msgsMap: Map<lang, Map<region, T>>`。两层 Map:第一层 key 为语言(`en`),第二层 key 为地区(`us` 或 `-` 表示默认)。全小写存储。
207
+
208
+ ### 语言标签解析 (`tag.ts`)
209
+
210
+ 仅支持 `语言-地区` 格式(如 `zh-CN`),不支持完整 BCP 47。统一转小写后匹配。
211
+
212
+ ### 初始化 (`index.ts`)
213
+
214
+ `getI18n()` 首次调用:创建 `ExtensibleI18n(enUS)` → 注册 11 种语言(不含默认 en)→ 根据 `LANG`/`LC_CTYPE` 环境变量自动切换语言。
@@ -0,0 +1,144 @@
1
+ ---
2
+ name: wok-server-lock
3
+ description: wok-server 锁组件使用指南,协调并发请求中的异步操作,防止数据竞争。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server 锁组件
11
+
12
+ ## 概述
13
+
14
+ 锁组件基于内存实现简单的异步并发控制,用于将不确定顺序、有冲突的异步操作按顺序执行。典型场景:减库存、抽奖等并发修改操作。
15
+
16
+ **注意**:这是进程内锁,只能协调单进程内的异步流程。如果需要分布式锁,应使用外部方案(如 Redis)。
17
+
18
+ ## 源码与类型定义
19
+
20
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
21
+
22
+ - 源码目录:`node_modules/wok-server/src/lock/`
23
+ - 类型定义:`node_modules/wok-server/types/` (引用 lock 组件的 `.d.ts` 文件)
24
+
25
+ 核心源码文件:
26
+
27
+ | 文件 | 说明 |
28
+ | :-------------- | :--------------------------------- |
29
+ | `index.ts` | `ServerLockManager`、`getLockManager` |
30
+
31
+ ---
32
+
33
+ ## 使用
34
+
35
+ ```ts
36
+ import { getLockManager } from 'wok-server'
37
+
38
+ const lockManager = getLockManager()
39
+ ```
40
+
41
+ `getLockManager()` 返回全局单例 `ServerLockManager`。
42
+
43
+ ---
44
+
45
+ ## tryLock — 竞争锁
46
+
47
+ ```ts
48
+ function tryLock(opts: {
49
+ key: string
50
+ run: () => Promise<void>
51
+ waitSeconds?: number
52
+ expiresInSeconds?: number
53
+ }): Promise<boolean>
54
+ ```
55
+
56
+ | 参数 | 说明 |
57
+ | :----------------- | :------------------------------------------------------------------- |
58
+ | `key` | 锁标识,相同 key 产生竞争关系,排队执行 |
59
+ | `run` | 获取锁成功后执行的异步函数 |
60
+ | `waitSeconds` | 等待秒数(可选),不设置或 ≤0 则获取不到立即返回 `false` |
61
+ | `expiresInSeconds` | 锁过期时间(秒),默认 60。防止持有者异常退出导致死锁 |
62
+
63
+ 返回值 `boolean`:`true` 表示成功获取锁并执行完毕,`false` 表示等待超时未获取到锁。
64
+
65
+ ---
66
+
67
+ ## 完整示例
68
+
69
+ ```ts
70
+ import { createJsonHandler, getLockManager, notBlank, notNull, min, max } from 'wok-server'
71
+
72
+ interface Form {
73
+ id: string
74
+ quantity: number
75
+ }
76
+
77
+ createJsonHandler<Form>({
78
+ validation: {
79
+ id: [notBlank()],
80
+ quantity: [notNull(), min(1), max(10)]
81
+ },
82
+ async handle(body) {
83
+ const lock = getLockManager()
84
+ const acquired = await lock.tryLock({
85
+ key: `reduce-quantity-${body.id}`,
86
+ waitSeconds: 2,
87
+ expiresInSeconds: 600,
88
+ async run() {
89
+ const product = await findProductById(body.id)
90
+ if (product.quantity < body.quantity) {
91
+ throw new BusinessException('库存不足')
92
+ }
93
+ await reduceQuantity(body.id, body.quantity)
94
+ }
95
+ })
96
+ if (!acquired) {
97
+ throw new BusinessException('系统繁忙,请稍后重试')
98
+ }
99
+ }
100
+ })
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 内部实现要点
106
+
107
+ ### 锁结构
108
+
109
+ ```ts
110
+ interface LockInfo {
111
+ value: string // 随机 UUID,验证锁归属
112
+ expiresAt: number // 过期时间戳(ms)
113
+ }
114
+ ```
115
+
116
+ 底层为 `Map<string, LockInfo>`,`key` 是锁标识,`value` 是随机值 + 过期时间。
117
+
118
+ ### 竞争流程
119
+
120
+ `tryLock` → `waitLock`(循环尝试获取锁):
121
+
122
+ 1. 检查 `lockMap` 中是否存在对应 key
123
+ 2. 不存在或已过期 → `lockMap.set(key, { value, expiresAt })` → 获取成功
124
+ 3. 存在且未过期 → 等待一次 `setTimeout(0)`(让出事件循环)→ 继续循环
125
+ 4. 超时 `waitSeconds` → 返回 `false`
126
+
127
+ ### 锁释放
128
+
129
+ `run()` 执行完(成功或抛异常)后,在 `finally` 中验证 `value` 一致后 `delete(key)` 释放锁。
130
+
131
+ ### 死锁防护
132
+
133
+ - **过期机制**:每个锁有 `expiresAt`,到期后其他竞争者可以覆盖获取
134
+ - **定期清理**:`ServerLockManager` 构造时启动 10 秒间隔的过期锁清理,防止 `lockMap` 内存泄漏
135
+
136
+ ### sleep 实现
137
+
138
+ ```ts
139
+ private sleep() {
140
+ return new Promise<void>(resolve => setTimeout(resolve, 0))
141
+ }
142
+ ```
143
+
144
+ 通过 `setTimeout(0)` 让出事件循环,给其他异步操作(包括锁持有者的 `run()` 执行和释放)创造执行机会。