wok-server 0.4.13 → 0.6.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 (376) 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 -29
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -72
  33. package/dist/log/index.js +135 -105
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -0
  36. package/dist/log/store.js +19 -16
  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 +239 -231
  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 +356 -356
  80. package/dist/mysql/manager/ops/delete.js +65 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +169 -130
  83. package/dist/mysql/manager/ops/index.js +14 -14
  84. package/dist/mysql/manager/ops/insert.js +106 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/paginate.js +23 -23
  87. package/dist/mysql/manager/ops/query.js +9 -9
  88. package/dist/mysql/manager/ops/update.js +216 -216
  89. package/dist/mysql/manager/ops/utils.js +24 -24
  90. package/dist/mysql/manager/tx-strict.js +103 -100
  91. package/dist/mysql/manager/tx.js +30 -30
  92. package/dist/mysql/manager/utils.js +56 -56
  93. package/dist/mysql/migration.js +136 -136
  94. package/dist/mysql/table-info.js +8 -8
  95. package/dist/task/daily.js +59 -59
  96. package/dist/task/fixed-delay.js +38 -38
  97. package/dist/task/fixed-rate.js +42 -42
  98. package/dist/task/index.js +9 -9
  99. package/dist/task/task.js +56 -56
  100. package/dist/validation/exception.js +36 -36
  101. package/dist/validation/index.js +40 -40
  102. package/dist/validation/validator/array.js +34 -34
  103. package/dist/validation/validator/enum.js +28 -28
  104. package/dist/validation/validator/index.js +14 -14
  105. package/dist/validation/validator/length.js +40 -40
  106. package/dist/validation/validator/max-length.js +35 -35
  107. package/dist/validation/validator/max.js +29 -29
  108. package/dist/validation/validator/min-length.js +33 -33
  109. package/dist/validation/validator/min.js +29 -29
  110. package/dist/validation/validator/not-blank.js +33 -33
  111. package/dist/validation/validator/not-null.js +21 -21
  112. package/dist/validation/validator/plain-obj.js +32 -32
  113. package/dist/validation/validator/regexp.js +34 -34
  114. package/documentation/en/cache.md +56 -0
  115. package/documentation/en/config.md +96 -0
  116. package/documentation/en/engineering.md +256 -0
  117. package/documentation/en/http-client.md +32 -0
  118. package/documentation/en/i18n.md +143 -0
  119. package/documentation/en/index.md +24 -0
  120. package/documentation/en/lock.md +51 -0
  121. package/documentation/en/log.md +109 -0
  122. package/documentation/en/mongodb.md +256 -0
  123. package/documentation/en/mvc.md +688 -0
  124. package/documentation/en/mysql.md +552 -0
  125. package/documentation/en/task.md +45 -0
  126. package/documentation/en/test.md +56 -0
  127. package/documentation/en/validate.md +130 -0
  128. package/documentation/zh-cn/engineering.md +1 -1
  129. package/documentation/zh-cn/log.md +81 -8
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +24 -23
  132. package/documentation/zh-cn/validate.md +2 -2
  133. package/package.json +3 -1
  134. package/skills/wok-server-api-rules/SKILL.md +350 -0
  135. package/skills/wok-server-cache/SKILL.md +216 -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 +315 -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 +285 -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 +412 -0
  232. package/src/mysql/manager/ops/delete.ts +96 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +226 -0
  235. package/src/mysql/manager/ops/index.ts +11 -0
  236. package/src/mysql/manager/ops/insert.ts +120 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/paginate.ts +60 -0
  239. package/src/mysql/manager/ops/query.ts +13 -0
  240. package/src/mysql/manager/ops/update.ts +294 -0
  241. package/src/mysql/manager/ops/utils.ts +20 -0
  242. package/src/mysql/manager/tx-strict.ts +138 -0
  243. package/src/mysql/manager/tx.ts +31 -0
  244. package/src/mysql/manager/utils.ts +75 -0
  245. package/src/mysql/migration.ts +149 -0
  246. package/src/mysql/table-info.ts +41 -0
  247. package/src/task/daily.ts +70 -0
  248. package/src/task/fixed-delay.ts +45 -0
  249. package/src/task/fixed-rate.ts +49 -0
  250. package/src/task/index.ts +4 -0
  251. package/src/task/task.ts +70 -0
  252. package/src/validation/exception.ts +27 -0
  253. package/src/validation/index.ts +61 -0
  254. package/src/validation/validator/array.ts +32 -0
  255. package/src/validation/validator/enum.ts +25 -0
  256. package/src/validation/validator/index.ts +11 -0
  257. package/src/validation/validator/length.ts +42 -0
  258. package/src/validation/validator/max-length.ts +33 -0
  259. package/src/validation/validator/max.ts +26 -0
  260. package/src/validation/validator/min-length.ts +31 -0
  261. package/src/validation/validator/min.ts +26 -0
  262. package/src/validation/validator/not-blank.ts +31 -0
  263. package/src/validation/validator/not-null.ts +19 -0
  264. package/src/validation/validator/plain-obj.ts +30 -0
  265. package/src/validation/validator/regexp.ts +32 -0
  266. package/types/cache/cache.d.ts +52 -52
  267. package/types/cache/config.d.ts +32 -32
  268. package/types/cache/index.d.ts +2 -2
  269. package/types/cache/purge-task.d.ts +11 -11
  270. package/types/cache/stat.d.ts +26 -26
  271. package/types/config/convert.d.ts +6 -6
  272. package/types/config/exception.d.ts +7 -7
  273. package/types/config/index.d.ts +25 -25
  274. package/types/http-client/index.d.ts +71 -71
  275. package/types/i18n/ar.d.ts +2 -2
  276. package/types/i18n/de.d.ts +2 -2
  277. package/types/i18n/en-us.d.ts +2 -2
  278. package/types/i18n/es.d.ts +2 -2
  279. package/types/i18n/fr.d.ts +2 -2
  280. package/types/i18n/i18n.d.ts +102 -102
  281. package/types/i18n/index.d.ts +9 -9
  282. package/types/i18n/ja.d.ts +2 -2
  283. package/types/i18n/ko.d.ts +2 -2
  284. package/types/i18n/msg.d.ts +50 -50
  285. package/types/i18n/pt.d.ts +2 -2
  286. package/types/i18n/ru.d.ts +2 -2
  287. package/types/i18n/tag.d.ts +11 -11
  288. package/types/i18n/zh-HK.d.ts +2 -2
  289. package/types/i18n/zh-TW.d.ts +2 -2
  290. package/types/i18n/zh-cn.d.ts +2 -2
  291. package/types/index.d.ts +11 -11
  292. package/types/lock/index.d.ts +64 -64
  293. package/types/log/config.d.ts +35 -27
  294. package/types/log/date.d.ts +2 -2
  295. package/types/log/file.d.ts +13 -5
  296. package/types/log/index.d.ts +53 -34
  297. package/types/log/level.d.ts +14 -14
  298. package/types/log/log.d.ts +40 -0
  299. package/types/log/store.d.ts +19 -12
  300. package/types/mongodb/collection.d.ts +25 -25
  301. package/types/mongodb/config.d.ts +45 -45
  302. package/types/mongodb/doc.d.ts +11 -11
  303. package/types/mongodb/exception.d.ts +7 -7
  304. package/types/mongodb/index.d.ts +29 -29
  305. package/types/mongodb/manager/base.d.ts +188 -188
  306. package/types/mongodb/manager/index.d.ts +38 -38
  307. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  308. package/types/mongodb/manager/tx.d.ts +21 -21
  309. package/types/mongodb/migration.d.ts +12 -12
  310. package/types/mvc/access-log.d.ts +7 -7
  311. package/types/mvc/config.d.ts +42 -42
  312. package/types/mvc/exchange.d.ts +72 -72
  313. package/types/mvc/handler/index.d.ts +4 -3
  314. package/types/mvc/handler/json.d.ts +44 -44
  315. package/types/mvc/handler/restful.d.ts +11 -11
  316. package/types/mvc/handler/sse.d.ts +34 -0
  317. package/types/mvc/handler/upload.d.ts +36 -36
  318. package/types/mvc/index.d.ts +22 -22
  319. package/types/mvc/interceptor.d.ts +11 -11
  320. package/types/mvc/query.d.ts +13 -13
  321. package/types/mvc/render/file.d.ts +10 -10
  322. package/types/mvc/render/html/html.d.ts +98 -98
  323. package/types/mvc/render/html/index.d.ts +11 -11
  324. package/types/mvc/render/html/style.d.ts +1201 -1201
  325. package/types/mvc/render/index.d.ts +4 -4
  326. package/types/mvc/render/json.d.ts +17 -17
  327. package/types/mvc/render/text.d.ts +10 -10
  328. package/types/mvc/router.d.ts +11 -11
  329. package/types/mvc/server.d.ts +90 -90
  330. package/types/mvc/static/header.d.ts +27 -27
  331. package/types/mvc/static/index.d.ts +3 -3
  332. package/types/mvc/static/mime-type.d.ts +2 -2
  333. package/types/mvc/static/server-cache-config.d.ts +30 -30
  334. package/types/mvc/static/server-cache.d.ts +76 -76
  335. package/types/mvc/static/static-handler.d.ts +77 -77
  336. package/types/mysql/config.d.ts +90 -90
  337. package/types/mysql/exception.d.ts +7 -7
  338. package/types/mysql/index.d.ts +16 -16
  339. package/types/mysql/manager/base.d.ts +165 -159
  340. package/types/mysql/manager/index.d.ts +36 -36
  341. package/types/mysql/manager/ops/count.d.ts +13 -13
  342. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  343. package/types/mysql/manager/ops/delete.d.ts +46 -46
  344. package/types/mysql/manager/ops/exist.d.ts +6 -6
  345. package/types/mysql/manager/ops/find.d.ts +86 -70
  346. package/types/mysql/manager/ops/index.d.ts +10 -10
  347. package/types/mysql/manager/ops/insert.d.ts +18 -18
  348. package/types/mysql/manager/ops/modify.d.ts +3 -3
  349. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  350. package/types/mysql/manager/ops/query.d.ts +3 -3
  351. package/types/mysql/manager/ops/update.d.ts +76 -76
  352. package/types/mysql/manager/ops/utils.d.ts +5 -5
  353. package/types/mysql/manager/tx-strict.d.ts +36 -35
  354. package/types/mysql/manager/tx.d.ts +15 -15
  355. package/types/mysql/manager/utils.d.ts +17 -17
  356. package/types/mysql/migration.d.ts +8 -8
  357. package/types/mysql/table-info.d.ts +36 -36
  358. package/types/task/daily.d.ts +16 -16
  359. package/types/task/fixed-delay.d.ts +9 -9
  360. package/types/task/fixed-rate.d.ts +9 -9
  361. package/types/task/index.d.ts +4 -4
  362. package/types/task/task.d.ts +34 -34
  363. package/types/validation/exception.d.ts +38 -38
  364. package/types/validation/index.d.ts +32 -32
  365. package/types/validation/validator/array.d.ts +5 -5
  366. package/types/validation/validator/enum.d.ts +8 -8
  367. package/types/validation/validator/index.d.ts +11 -11
  368. package/types/validation/validator/length.d.ts +10 -10
  369. package/types/validation/validator/max-length.d.ts +8 -8
  370. package/types/validation/validator/max.d.ts +7 -7
  371. package/types/validation/validator/min-length.d.ts +6 -6
  372. package/types/validation/validator/min.d.ts +7 -7
  373. package/types/validation/validator/not-blank.d.ts +7 -7
  374. package/types/validation/validator/not-null.d.ts +6 -6
  375. package/types/validation/validator/plain-obj.d.ts +7 -7
  376. package/types/validation/validator/regexp.d.ts +8 -8
@@ -1,16 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderText = void 0;
4
- /**
5
- * 渲染 json 格式数据.
6
- * @param response 响应信息
7
- * @param text 文本
8
- * @param status 状态码,默认 200
9
- * @returns
10
- */
11
- function renderText(response, text, status = 200) {
12
- response.setHeader('content-type', 'text/plain; charset=UTF-8');
13
- response.statusCode = status;
14
- response.end(text);
15
- }
16
- exports.renderText = renderText;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderText = void 0;
4
+ /**
5
+ * 渲染 json 格式数据.
6
+ * @param response 响应信息
7
+ * @param text 文本
8
+ * @param status 状态码,默认 200
9
+ * @returns
10
+ */
11
+ function renderText(response, text, status = 200) {
12
+ response.setHeader('content-type', 'text/plain; charset=UTF-8');
13
+ response.statusCode = status;
14
+ response.end(text);
15
+ }
16
+ exports.renderText = renderText;
@@ -1,2 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,272 +1,272 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WokServer = void 0;
4
- const fs_1 = require("fs");
5
- const http_1 = require("http");
6
- const https_1 = require("https");
7
- const os_1 = require("os");
8
- const path_1 = require("path");
9
- const log_1 = require("../log");
10
- const access_log_1 = require("./access-log");
11
- const config_1 = require("./config");
12
- const exchange_1 = require("./exchange");
13
- const render_1 = require("./render");
14
- const static_1 = require("./static");
15
- const validation_1 = require("../validation");
16
- function resolvePath(path) {
17
- if ((0, path_1.isAbsolute)(path)) {
18
- return path;
19
- }
20
- return (0, path_1.resolve)(process.cwd(), path);
21
- }
22
- /**
23
- * web 服务
24
- */
25
- class WokServer {
26
- opts;
27
- config;
28
- server;
29
- interceptors;
30
- routers;
31
- defaultRouter;
32
- staticHandler;
33
- constructor(opts) {
34
- this.opts = opts;
35
- this.config = (0, config_1.getConfig)();
36
- // https
37
- let tls;
38
- if (this.config.tlsEnable) {
39
- (0, validation_1.validate)(this.config, {
40
- tlsCert: [(0, validation_1.notBlank)()],
41
- tlsKey: [(0, validation_1.notBlank)()]
42
- });
43
- tls = {
44
- cert: (0, fs_1.readFileSync)(resolvePath(this.config.tlsCert)),
45
- key: (0, fs_1.readFileSync)(resolvePath(this.config.tlsKey))
46
- };
47
- }
48
- // 路由
49
- this.routers = opts.routers;
50
- this.defaultRouter = this.routers['*'];
51
- // 拦截器
52
- this.interceptors = [];
53
- if (this.config.accessLog) {
54
- this.interceptors.push(access_log_1.accessLogInterceptor);
55
- }
56
- if (opts.interceptors) {
57
- this.interceptors.push(...opts.interceptors);
58
- }
59
- // 静态处理
60
- if (opts.static) {
61
- this.staticHandler = new static_1.StaticHandler(opts.static);
62
- }
63
- // 主服务
64
- if (!tls) {
65
- this.server = (0, http_1.createServer)((req, res) => {
66
- res.setHeader('Server', 'Wok Server');
67
- res.on('error', error => {
68
- // 如果响应流发生错误,只能把信息记录下来
69
- (0, log_1.getLogger)().error(`Response Error:${req.url}`, error);
70
- });
71
- this.handleRequest(req, res).catch(error => {
72
- (0, log_1.getLogger)().error(`Handle request failed:${req.url}`, error);
73
- if (!res.writableEnded) {
74
- // 响应 500
75
- (0, render_1.renderError)(res, error.message ? error.message : 'Internal Server Error', 500);
76
- }
77
- });
78
- });
79
- }
80
- else {
81
- this.server = (0, https_1.createServer)({
82
- key: tls.key,
83
- cert: tls.cert
84
- }, (req, res) => {
85
- res.setHeader('Server', 'Wok Server');
86
- res.on('error', error => {
87
- // 如果响应流发生错误,只能把信息记录下来
88
- (0, log_1.getLogger)().error(`Response Error:${req.url}`, error);
89
- });
90
- this.handleRequest(req, res).catch(error => {
91
- (0, log_1.getLogger)().error(`Handle request failed:${req.url}`, error);
92
- if (!res.writableEnded) {
93
- // 响应 500
94
- (0, render_1.renderError)(res, error.message ? error.message : 'Internal Server Error', 500);
95
- }
96
- });
97
- });
98
- }
99
- this.server.setTimeout(this.config.timeout);
100
- this.server.on('timeout', (socket) => {
101
- socket.end('HTTP/1.1 408 Timeout\r\ncontent-type: application/json; charset=utf-8\r\n\r\n{"message":"Request timeout"}');
102
- });
103
- }
104
- /**
105
- * 处理请求,完成拦截器和路由的流程.
106
- *
107
- * @param req
108
- * @param res
109
- */
110
- async handleRequest(req, res) {
111
- req.socket.remoteAddress;
112
- const { method } = req;
113
- // cros 支持
114
- res.setHeader('Access-Control-Allow-Origin', this.config.corsAllowOrigin);
115
- res.setHeader('Access-Control-Allow-Headers', this.config.corsAllowHeaders);
116
- res.setHeader('Access-Control-Allow-Methods', this.config.corsAllowMethods);
117
- if (method === 'OPTIONS') {
118
- res.statusCode = 200;
119
- res.end();
120
- return;
121
- }
122
- const exchange = new exchange_1.ServerExchange(req, res);
123
- // 顺序执行拦截器
124
- await this.handleInterceptor(0, exchange, req, res);
125
- }
126
- /**
127
- * 处理拦截器.
128
- * @param idx 当前要执行的拦截器下标
129
- * @param exchange 传输对象
130
- * @param req
131
- * @param res
132
- */
133
- async handleInterceptor(idx, exchange, req, res) {
134
- const interceptor = this.interceptors[idx];
135
- // 到最后一个了,那么执行路由处理
136
- if (!interceptor) {
137
- await this.handleRouter(exchange);
138
- return;
139
- }
140
- await interceptor(exchange, () => this.handleInterceptor(idx + 1, exchange, req, res));
141
- }
142
- /**
143
- * 处理路由.
144
- * @param exchange
145
- * @param routers
146
- * @param staticSettings
147
- * @returns
148
- */
149
- async handleRouter(exchange) {
150
- const url = exchange.request.url;
151
- if (url === undefined) {
152
- return;
153
- }
154
- // 判定路由
155
- const idx = url.indexOf('?');
156
- let path = idx === -1 ? url : url.substring(0, idx);
157
- const router = this.routers[path];
158
- if (!router) {
159
- // 路由找不不到,尝试静态文件
160
- if (this.staticHandler) {
161
- const method = (exchange.request.method || '').toLowerCase();
162
- if (method === 'head') {
163
- if (await this.staticHandler.handleHead(path, exchange.response)) {
164
- return;
165
- }
166
- }
167
- if (method === 'get') {
168
- if (await this.staticHandler.handleGet(exchange.request, exchange.response, path)) {
169
- return;
170
- }
171
- }
172
- }
173
- this.respond404(exchange, path);
174
- return;
175
- }
176
- // 执行路由
177
- await router(exchange);
178
- // 在路由顺利处理的情况下,如果 res 没有 end ,就表示响应没有完成
179
- // 也就是说路由没有做响应处理,或处理没有完成就结束了,给予错误提示
180
- if (!exchange.response.writableEnded) {
181
- throw new Error(`RouterHandler unresponsive, url: ${url}`);
182
- }
183
- }
184
- /**
185
- * 404响应
186
- *
187
- * @param exchange
188
- * @param path
189
- */
190
- async respond404(exchange, path) {
191
- if (this.defaultRouter) {
192
- await this.defaultRouter(exchange);
193
- }
194
- else {
195
- exchange.respondErrMsg(`${path} not found`, 404);
196
- }
197
- }
198
- /**
199
- * 启动
200
- */
201
- async start() {
202
- if (this.opts.preHandler) {
203
- await this.opts.preHandler(this.server);
204
- }
205
- await new Promise((resolve, reject) => {
206
- this.server.on('error', e => {
207
- if (e.code === 'EADDRINUSE') {
208
- reject(`Port ${this.config.port} is already in use.`);
209
- }
210
- else {
211
- reject(e);
212
- }
213
- });
214
- this.server.listen(this.config.port, resolve);
215
- });
216
- console.log('App running at: ');
217
- let portOmitted = (this.server instanceof https_1.Server && this.config.port === 443) ||
218
- (this.server instanceof http_1.Server && this.config.port === 80);
219
- this.getIpv4List().forEach(ip => {
220
- if (portOmitted) {
221
- console.log(`http://${ip}`);
222
- }
223
- else {
224
- console.log(`http://${ip}:${this.config.port}`);
225
- }
226
- });
227
- }
228
- /**
229
- * 获取 ipv4 地址列表
230
- * @returns
231
- */
232
- getIpv4List() {
233
- const ifs = (0, os_1.networkInterfaces)();
234
- const res = [];
235
- for (const name in ifs) {
236
- const list = ifs[name];
237
- if (!list) {
238
- continue;
239
- }
240
- res.push(...list.filter(info => info.family === 'IPv4').map(info => info.address));
241
- }
242
- return res;
243
- }
244
- /**
245
- * 删除服务器端静态资源缓存
246
- * @param path
247
- */
248
- removeServerStaticCache(path) {
249
- if (this.staticHandler) {
250
- this.staticHandler.removeServerCache(path);
251
- }
252
- }
253
- /**
254
- * 停止
255
- */
256
- async stop() {
257
- if (!this.server.listening) {
258
- return;
259
- }
260
- await new Promise((res, rej) => {
261
- this.server.close(err => {
262
- if (err) {
263
- rej(err);
264
- }
265
- else {
266
- res();
267
- }
268
- });
269
- });
270
- }
271
- }
272
- exports.WokServer = WokServer;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WokServer = void 0;
4
+ const fs_1 = require("fs");
5
+ const http_1 = require("http");
6
+ const https_1 = require("https");
7
+ const os_1 = require("os");
8
+ const path_1 = require("path");
9
+ const log_1 = require("../log");
10
+ const access_log_1 = require("./access-log");
11
+ const config_1 = require("./config");
12
+ const exchange_1 = require("./exchange");
13
+ const render_1 = require("./render");
14
+ const static_1 = require("./static");
15
+ const validation_1 = require("../validation");
16
+ function resolvePath(path) {
17
+ if ((0, path_1.isAbsolute)(path)) {
18
+ return path;
19
+ }
20
+ return (0, path_1.resolve)(process.cwd(), path);
21
+ }
22
+ /**
23
+ * web 服务
24
+ */
25
+ class WokServer {
26
+ opts;
27
+ config;
28
+ server;
29
+ interceptors;
30
+ routers;
31
+ defaultRouter;
32
+ staticHandler;
33
+ constructor(opts) {
34
+ this.opts = opts;
35
+ this.config = (0, config_1.getConfig)();
36
+ // https
37
+ let tls;
38
+ if (this.config.tlsEnable) {
39
+ (0, validation_1.validate)(this.config, {
40
+ tlsCert: [(0, validation_1.notBlank)()],
41
+ tlsKey: [(0, validation_1.notBlank)()]
42
+ });
43
+ tls = {
44
+ cert: (0, fs_1.readFileSync)(resolvePath(this.config.tlsCert)),
45
+ key: (0, fs_1.readFileSync)(resolvePath(this.config.tlsKey))
46
+ };
47
+ }
48
+ // 路由
49
+ this.routers = opts.routers;
50
+ this.defaultRouter = this.routers['*'];
51
+ // 拦截器
52
+ this.interceptors = [];
53
+ if (this.config.accessLog) {
54
+ this.interceptors.push(access_log_1.accessLogInterceptor);
55
+ }
56
+ if (opts.interceptors) {
57
+ this.interceptors.push(...opts.interceptors);
58
+ }
59
+ // 静态处理
60
+ if (opts.static) {
61
+ this.staticHandler = new static_1.StaticHandler(opts.static);
62
+ }
63
+ // 主服务
64
+ if (!tls) {
65
+ this.server = (0, http_1.createServer)((req, res) => {
66
+ res.setHeader('Server', 'Wok Server');
67
+ res.on('error', error => {
68
+ // 如果响应流发生错误,只能把信息记录下来
69
+ (0, log_1.getLogger)().error(`Response Error:${req.url}`, error);
70
+ });
71
+ this.handleRequest(req, res).catch(error => {
72
+ (0, log_1.getLogger)().error(`Handle request failed:${req.url}`, error);
73
+ if (!res.writableEnded) {
74
+ // 响应 500
75
+ (0, render_1.renderError)(res, error.message ? error.message : 'Internal Server Error', 500);
76
+ }
77
+ });
78
+ });
79
+ }
80
+ else {
81
+ this.server = (0, https_1.createServer)({
82
+ key: tls.key,
83
+ cert: tls.cert
84
+ }, (req, res) => {
85
+ res.setHeader('Server', 'Wok Server');
86
+ res.on('error', error => {
87
+ // 如果响应流发生错误,只能把信息记录下来
88
+ (0, log_1.getLogger)().error(`Response Error:${req.url}`, error);
89
+ });
90
+ this.handleRequest(req, res).catch(error => {
91
+ (0, log_1.getLogger)().error(`Handle request failed:${req.url}`, error);
92
+ if (!res.writableEnded) {
93
+ // 响应 500
94
+ (0, render_1.renderError)(res, error.message ? error.message : 'Internal Server Error', 500);
95
+ }
96
+ });
97
+ });
98
+ }
99
+ this.server.setTimeout(this.config.timeout);
100
+ this.server.on('timeout', (socket) => {
101
+ socket.end('HTTP/1.1 408 Timeout\r\ncontent-type: application/json; charset=utf-8\r\n\r\n{"message":"Request timeout"}');
102
+ });
103
+ }
104
+ /**
105
+ * 处理请求,完成拦截器和路由的流程.
106
+ *
107
+ * @param req
108
+ * @param res
109
+ */
110
+ async handleRequest(req, res) {
111
+ req.socket.remoteAddress;
112
+ const { method } = req;
113
+ // cros 支持
114
+ res.setHeader('Access-Control-Allow-Origin', this.config.corsAllowOrigin);
115
+ res.setHeader('Access-Control-Allow-Headers', this.config.corsAllowHeaders);
116
+ res.setHeader('Access-Control-Allow-Methods', this.config.corsAllowMethods);
117
+ if (method === 'OPTIONS') {
118
+ res.statusCode = 200;
119
+ res.end();
120
+ return;
121
+ }
122
+ const exchange = new exchange_1.ServerExchange(req, res);
123
+ // 顺序执行拦截器
124
+ await this.handleInterceptor(0, exchange, req, res);
125
+ }
126
+ /**
127
+ * 处理拦截器.
128
+ * @param idx 当前要执行的拦截器下标
129
+ * @param exchange 传输对象
130
+ * @param req
131
+ * @param res
132
+ */
133
+ async handleInterceptor(idx, exchange, req, res) {
134
+ const interceptor = this.interceptors[idx];
135
+ // 到最后一个了,那么执行路由处理
136
+ if (!interceptor) {
137
+ await this.handleRouter(exchange);
138
+ return;
139
+ }
140
+ await interceptor(exchange, () => this.handleInterceptor(idx + 1, exchange, req, res));
141
+ }
142
+ /**
143
+ * 处理路由.
144
+ * @param exchange
145
+ * @param routers
146
+ * @param staticSettings
147
+ * @returns
148
+ */
149
+ async handleRouter(exchange) {
150
+ const url = exchange.request.url;
151
+ if (url === undefined) {
152
+ return;
153
+ }
154
+ // 判定路由
155
+ const idx = url.indexOf('?');
156
+ let path = idx === -1 ? url : url.substring(0, idx);
157
+ const router = this.routers[path];
158
+ if (!router) {
159
+ // 路由找不不到,尝试静态文件
160
+ if (this.staticHandler) {
161
+ const method = (exchange.request.method || '').toLowerCase();
162
+ if (method === 'head') {
163
+ if (await this.staticHandler.handleHead(path, exchange.response)) {
164
+ return;
165
+ }
166
+ }
167
+ if (method === 'get') {
168
+ if (await this.staticHandler.handleGet(exchange.request, exchange.response, path)) {
169
+ return;
170
+ }
171
+ }
172
+ }
173
+ this.respond404(exchange, path);
174
+ return;
175
+ }
176
+ // 执行路由
177
+ await router(exchange);
178
+ // 在路由顺利处理的情况下,如果 res 没有 end ,就表示响应没有完成
179
+ // 也就是说路由没有做响应处理,或处理没有完成就结束了,给予错误提示
180
+ if (!exchange.response.writableEnded) {
181
+ throw new Error(`RouterHandler unresponsive, url: ${url}`);
182
+ }
183
+ }
184
+ /**
185
+ * 404响应
186
+ *
187
+ * @param exchange
188
+ * @param path
189
+ */
190
+ async respond404(exchange, path) {
191
+ if (this.defaultRouter) {
192
+ await this.defaultRouter(exchange);
193
+ }
194
+ else {
195
+ exchange.respondErrMsg(`${path} not found`, 404);
196
+ }
197
+ }
198
+ /**
199
+ * 启动
200
+ */
201
+ async start() {
202
+ if (this.opts.preHandler) {
203
+ await this.opts.preHandler(this.server);
204
+ }
205
+ await new Promise((resolve, reject) => {
206
+ this.server.on('error', e => {
207
+ if (e.code === 'EADDRINUSE') {
208
+ reject(`Port ${this.config.port} is already in use.`);
209
+ }
210
+ else {
211
+ reject(e);
212
+ }
213
+ });
214
+ this.server.listen(this.config.port, resolve);
215
+ });
216
+ console.log('App running at: ');
217
+ let portOmitted = (this.server instanceof https_1.Server && this.config.port === 443) ||
218
+ (this.server instanceof http_1.Server && this.config.port === 80);
219
+ this.getIpv4List().forEach(ip => {
220
+ if (portOmitted) {
221
+ console.log(`http://${ip}`);
222
+ }
223
+ else {
224
+ console.log(`http://${ip}:${this.config.port}`);
225
+ }
226
+ });
227
+ }
228
+ /**
229
+ * 获取 ipv4 地址列表
230
+ * @returns
231
+ */
232
+ getIpv4List() {
233
+ const ifs = (0, os_1.networkInterfaces)();
234
+ const res = [];
235
+ for (const name in ifs) {
236
+ const list = ifs[name];
237
+ if (!list) {
238
+ continue;
239
+ }
240
+ res.push(...list.filter(info => info.family === 'IPv4').map(info => info.address));
241
+ }
242
+ return res;
243
+ }
244
+ /**
245
+ * 删除服务器端静态资源缓存
246
+ * @param path
247
+ */
248
+ removeServerStaticCache(path) {
249
+ if (this.staticHandler) {
250
+ this.staticHandler.removeServerCache(path);
251
+ }
252
+ }
253
+ /**
254
+ * 停止
255
+ */
256
+ async stop() {
257
+ if (!this.server.listening) {
258
+ return;
259
+ }
260
+ await new Promise((res, rej) => {
261
+ this.server.close(err => {
262
+ if (err) {
263
+ rej(err);
264
+ }
265
+ else {
266
+ res();
267
+ }
268
+ });
269
+ });
270
+ }
271
+ }
272
+ exports.WokServer = WokServer;