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.
- package/README.en.md +61 -0
- package/README.md +44 -29
- package/dist/cache/cache.js +98 -98
- package/dist/cache/config.js +19 -19
- package/dist/cache/index.js +27 -27
- package/dist/cache/purge-task.js +46 -46
- package/dist/cache/stat.js +47 -47
- package/dist/config/convert.js +36 -36
- package/dist/config/exception.js +14 -14
- package/dist/config/index.js +81 -81
- package/dist/http-client/index.js +136 -136
- package/dist/i18n/ar.js +17 -17
- package/dist/i18n/de.js +17 -17
- package/dist/i18n/en-us.js +17 -17
- package/dist/i18n/es.js +17 -17
- package/dist/i18n/fr.js +17 -17
- package/dist/i18n/i18n.js +231 -231
- package/dist/i18n/index.js +52 -52
- package/dist/i18n/ja.js +17 -17
- package/dist/i18n/ko.js +17 -17
- package/dist/i18n/msg.js +2 -2
- package/dist/i18n/pt.js +17 -17
- package/dist/i18n/ru.js +17 -17
- package/dist/i18n/tag.js +18 -18
- package/dist/i18n/zh-HK.js +17 -17
- package/dist/i18n/zh-TW.js +17 -17
- package/dist/i18n/zh-cn.js +17 -17
- package/dist/index.js +14 -14
- package/dist/lock/index.js +114 -114
- package/dist/log/config.js +35 -29
- package/dist/log/date.js +21 -21
- package/dist/log/file.js +198 -72
- package/dist/log/index.js +135 -105
- package/dist/log/level.js +33 -33
- package/dist/log/log.js +56 -0
- package/dist/log/store.js +19 -16
- package/dist/mongodb/collection.js +2 -2
- package/dist/mongodb/config.js +34 -34
- package/dist/mongodb/doc.js +2 -2
- package/dist/mongodb/exception.js +14 -14
- package/dist/mongodb/index.js +58 -58
- package/dist/mongodb/manager/base.js +563 -563
- package/dist/mongodb/manager/index.js +63 -63
- package/dist/mongodb/manager/tx-strict.js +84 -84
- package/dist/mongodb/manager/tx.js +30 -30
- package/dist/mongodb/migration.js +52 -52
- package/dist/mvc/access-log.js +33 -33
- package/dist/mvc/config.js +27 -27
- package/dist/mvc/exchange.js +113 -113
- package/dist/mvc/handler/index.js +7 -6
- package/dist/mvc/handler/json.js +65 -65
- package/dist/mvc/handler/restful.js +35 -35
- package/dist/mvc/handler/sse.js +65 -0
- package/dist/mvc/handler/upload.js +31 -31
- package/dist/mvc/index.js +50 -50
- package/dist/mvc/interceptor.js +2 -2
- package/dist/mvc/query.js +43 -43
- package/dist/mvc/render/file.js +132 -132
- package/dist/mvc/render/html/html.js +90 -90
- package/dist/mvc/render/html/index.js +18 -18
- package/dist/mvc/render/html/style.js +2 -2
- package/dist/mvc/render/index.js +7 -7
- package/dist/mvc/render/json.js +26 -26
- package/dist/mvc/render/text.js +16 -16
- package/dist/mvc/router.js +2 -2
- package/dist/mvc/server.js +272 -272
- package/dist/mvc/static/header.js +67 -67
- package/dist/mvc/static/index.js +6 -6
- package/dist/mvc/static/mime-type.js +84 -84
- package/dist/mvc/static/server-cache-config.js +66 -66
- package/dist/mvc/static/server-cache.js +133 -133
- package/dist/mvc/static/static-handler.js +372 -372
- package/dist/mysql/config.js +51 -51
- package/dist/mysql/exception.js +14 -14
- package/dist/mysql/index.js +87 -87
- package/dist/mysql/manager/base.js +239 -231
- package/dist/mysql/manager/index.js +107 -107
- package/dist/mysql/manager/ops/count.js +20 -20
- package/dist/mysql/manager/ops/criteria.js +356 -356
- package/dist/mysql/manager/ops/delete.js +65 -65
- package/dist/mysql/manager/ops/exist.js +26 -26
- package/dist/mysql/manager/ops/find.js +169 -130
- package/dist/mysql/manager/ops/index.js +14 -14
- package/dist/mysql/manager/ops/insert.js +106 -106
- package/dist/mysql/manager/ops/modify.js +10 -10
- package/dist/mysql/manager/ops/paginate.js +23 -23
- package/dist/mysql/manager/ops/query.js +9 -9
- package/dist/mysql/manager/ops/update.js +216 -216
- package/dist/mysql/manager/ops/utils.js +24 -24
- package/dist/mysql/manager/tx-strict.js +103 -100
- package/dist/mysql/manager/tx.js +30 -30
- package/dist/mysql/manager/utils.js +56 -56
- package/dist/mysql/migration.js +136 -136
- package/dist/mysql/table-info.js +8 -8
- package/dist/task/daily.js +59 -59
- package/dist/task/fixed-delay.js +38 -38
- package/dist/task/fixed-rate.js +42 -42
- package/dist/task/index.js +9 -9
- package/dist/task/task.js +56 -56
- package/dist/validation/exception.js +36 -36
- package/dist/validation/index.js +40 -40
- package/dist/validation/validator/array.js +34 -34
- package/dist/validation/validator/enum.js +28 -28
- package/dist/validation/validator/index.js +14 -14
- package/dist/validation/validator/length.js +40 -40
- package/dist/validation/validator/max-length.js +35 -35
- package/dist/validation/validator/max.js +29 -29
- package/dist/validation/validator/min-length.js +33 -33
- package/dist/validation/validator/min.js +29 -29
- package/dist/validation/validator/not-blank.js +33 -33
- package/dist/validation/validator/not-null.js +21 -21
- package/dist/validation/validator/plain-obj.js +32 -32
- package/dist/validation/validator/regexp.js +34 -34
- package/documentation/en/cache.md +56 -0
- package/documentation/en/config.md +96 -0
- package/documentation/en/engineering.md +256 -0
- package/documentation/en/http-client.md +32 -0
- package/documentation/en/i18n.md +143 -0
- package/documentation/en/index.md +24 -0
- package/documentation/en/lock.md +51 -0
- package/documentation/en/log.md +109 -0
- package/documentation/en/mongodb.md +256 -0
- package/documentation/en/mvc.md +688 -0
- package/documentation/en/mysql.md +552 -0
- package/documentation/en/task.md +45 -0
- package/documentation/en/test.md +56 -0
- package/documentation/en/validate.md +130 -0
- package/documentation/zh-cn/engineering.md +1 -1
- package/documentation/zh-cn/log.md +81 -8
- package/documentation/zh-cn/mvc.md +66 -24
- package/documentation/zh-cn/mysql.md +24 -23
- package/documentation/zh-cn/validate.md +2 -2
- package/package.json +3 -1
- package/skills/wok-server-api-rules/SKILL.md +350 -0
- package/skills/wok-server-cache/SKILL.md +216 -0
- package/skills/wok-server-config/SKILL.md +200 -0
- package/skills/wok-server-getting-started/SKILL.md +123 -0
- package/skills/wok-server-getting-started/references/engineering.md +169 -0
- package/skills/wok-server-http-client/SKILL.md +164 -0
- package/skills/wok-server-i18n/SKILL.md +214 -0
- package/skills/wok-server-lock/SKILL.md +144 -0
- package/skills/wok-server-log/SKILL.md +218 -0
- package/skills/wok-server-mongodb/SKILL.md +235 -0
- package/skills/wok-server-mvc/SKILL.md +251 -0
- package/skills/wok-server-mvc/references/respond-html.md +157 -0
- package/skills/wok-server-mvc/references/sse.md +121 -0
- package/skills/wok-server-mvc/references/static-files.md +47 -0
- package/skills/wok-server-mvc/references/upload.md +62 -0
- package/skills/wok-server-mvc/references/websocket.md +30 -0
- package/skills/wok-server-mysql/SKILL.md +315 -0
- package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
- package/skills/wok-server-mysql/references/version-control.md +22 -0
- package/skills/wok-server-task/SKILL.md +158 -0
- package/skills/wok-server-validate/SKILL.md +167 -0
- package/src/cache/cache.ts +118 -0
- package/src/cache/config.ts +53 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/purge-task.ts +53 -0
- package/src/cache/stat.ts +47 -0
- package/src/config/convert.ts +27 -0
- package/src/config/exception.ts +8 -0
- package/src/config/index.ts +92 -0
- package/src/http-client/index.ts +202 -0
- package/src/i18n/ar.ts +16 -0
- package/src/i18n/de.ts +16 -0
- package/src/i18n/en-us.ts +16 -0
- package/src/i18n/es.ts +16 -0
- package/src/i18n/fr.ts +16 -0
- package/src/i18n/i18n.ts +230 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/ja.ts +16 -0
- package/src/i18n/ko.ts +16 -0
- package/src/i18n/msg.ts +50 -0
- package/src/i18n/pt.ts +16 -0
- package/src/i18n/ru.ts +16 -0
- package/src/i18n/tag.ts +18 -0
- package/src/i18n/zh-HK.ts +16 -0
- package/src/i18n/zh-TW.ts +16 -0
- package/src/i18n/zh-cn.ts +16 -0
- package/src/index.ts +11 -0
- package/src/lock/index.ts +164 -0
- package/src/log/config.ts +71 -0
- package/src/log/date.ts +19 -0
- package/src/log/file.ts +215 -0
- package/src/log/index.ts +136 -0
- package/src/log/level.ts +29 -0
- package/src/log/log.ts +77 -0
- package/src/log/store.ts +31 -0
- package/src/mongodb/collection.ts +25 -0
- package/src/mongodb/config.ts +69 -0
- package/src/mongodb/doc.ts +12 -0
- package/src/mongodb/exception.ts +8 -0
- package/src/mongodb/index.ts +71 -0
- package/src/mongodb/manager/base.ts +674 -0
- package/src/mongodb/manager/index.ts +80 -0
- package/src/mongodb/manager/tx-strict.ts +153 -0
- package/src/mongodb/manager/tx.ts +34 -0
- package/src/mongodb/migration.ts +66 -0
- package/src/mvc/access-log.ts +33 -0
- package/src/mvc/config.ts +70 -0
- package/src/mvc/exchange.ts +126 -0
- package/src/mvc/handler/index.ts +4 -0
- package/src/mvc/handler/json.ts +96 -0
- package/src/mvc/handler/restful.ts +39 -0
- package/src/mvc/handler/sse.ts +90 -0
- package/src/mvc/handler/upload.ts +54 -0
- package/src/mvc/index.ts +48 -0
- package/src/mvc/interceptor.ts +12 -0
- package/src/mvc/query.ts +36 -0
- package/src/mvc/render/file.ts +148 -0
- package/src/mvc/render/html/html.ts +187 -0
- package/src/mvc/render/html/index.ts +16 -0
- package/src/mvc/render/html/style.ts +1201 -0
- package/src/mvc/render/index.ts +4 -0
- package/src/mvc/render/json.ts +24 -0
- package/src/mvc/render/text.ts +14 -0
- package/src/mvc/router.ts +13 -0
- package/src/mvc/server.ts +315 -0
- package/src/mvc/static/header.ts +86 -0
- package/src/mvc/static/index.ts +3 -0
- package/src/mvc/static/mime-type.ts +81 -0
- package/src/mvc/static/server-cache-config.ts +92 -0
- package/src/mvc/static/server-cache.ts +171 -0
- package/src/mvc/static/static-handler.ts +445 -0
- package/src/mysql/config.ts +130 -0
- package/src/mysql/exception.ts +8 -0
- package/src/mysql/index.ts +88 -0
- package/src/mysql/manager/base.ts +285 -0
- package/src/mysql/manager/index.ts +112 -0
- package/src/mysql/manager/ops/count.ts +30 -0
- package/src/mysql/manager/ops/criteria.ts +412 -0
- package/src/mysql/manager/ops/delete.ts +96 -0
- package/src/mysql/manager/ops/exist.ts +41 -0
- package/src/mysql/manager/ops/find.ts +226 -0
- package/src/mysql/manager/ops/index.ts +11 -0
- package/src/mysql/manager/ops/insert.ts +120 -0
- package/src/mysql/manager/ops/modify.ts +14 -0
- package/src/mysql/manager/ops/paginate.ts +60 -0
- package/src/mysql/manager/ops/query.ts +13 -0
- package/src/mysql/manager/ops/update.ts +294 -0
- package/src/mysql/manager/ops/utils.ts +20 -0
- package/src/mysql/manager/tx-strict.ts +138 -0
- package/src/mysql/manager/tx.ts +31 -0
- package/src/mysql/manager/utils.ts +75 -0
- package/src/mysql/migration.ts +149 -0
- package/src/mysql/table-info.ts +41 -0
- package/src/task/daily.ts +70 -0
- package/src/task/fixed-delay.ts +45 -0
- package/src/task/fixed-rate.ts +49 -0
- package/src/task/index.ts +4 -0
- package/src/task/task.ts +70 -0
- package/src/validation/exception.ts +27 -0
- package/src/validation/index.ts +61 -0
- package/src/validation/validator/array.ts +32 -0
- package/src/validation/validator/enum.ts +25 -0
- package/src/validation/validator/index.ts +11 -0
- package/src/validation/validator/length.ts +42 -0
- package/src/validation/validator/max-length.ts +33 -0
- package/src/validation/validator/max.ts +26 -0
- package/src/validation/validator/min-length.ts +31 -0
- package/src/validation/validator/min.ts +26 -0
- package/src/validation/validator/not-blank.ts +31 -0
- package/src/validation/validator/not-null.ts +19 -0
- package/src/validation/validator/plain-obj.ts +30 -0
- package/src/validation/validator/regexp.ts +32 -0
- package/types/cache/cache.d.ts +52 -52
- package/types/cache/config.d.ts +32 -32
- package/types/cache/index.d.ts +2 -2
- package/types/cache/purge-task.d.ts +11 -11
- package/types/cache/stat.d.ts +26 -26
- package/types/config/convert.d.ts +6 -6
- package/types/config/exception.d.ts +7 -7
- package/types/config/index.d.ts +25 -25
- package/types/http-client/index.d.ts +71 -71
- package/types/i18n/ar.d.ts +2 -2
- package/types/i18n/de.d.ts +2 -2
- package/types/i18n/en-us.d.ts +2 -2
- package/types/i18n/es.d.ts +2 -2
- package/types/i18n/fr.d.ts +2 -2
- package/types/i18n/i18n.d.ts +102 -102
- package/types/i18n/index.d.ts +9 -9
- package/types/i18n/ja.d.ts +2 -2
- package/types/i18n/ko.d.ts +2 -2
- package/types/i18n/msg.d.ts +50 -50
- package/types/i18n/pt.d.ts +2 -2
- package/types/i18n/ru.d.ts +2 -2
- package/types/i18n/tag.d.ts +11 -11
- package/types/i18n/zh-HK.d.ts +2 -2
- package/types/i18n/zh-TW.d.ts +2 -2
- package/types/i18n/zh-cn.d.ts +2 -2
- package/types/index.d.ts +11 -11
- package/types/lock/index.d.ts +64 -64
- package/types/log/config.d.ts +35 -27
- package/types/log/date.d.ts +2 -2
- package/types/log/file.d.ts +13 -5
- package/types/log/index.d.ts +53 -34
- package/types/log/level.d.ts +14 -14
- package/types/log/log.d.ts +40 -0
- package/types/log/store.d.ts +19 -12
- package/types/mongodb/collection.d.ts +25 -25
- package/types/mongodb/config.d.ts +45 -45
- package/types/mongodb/doc.d.ts +11 -11
- package/types/mongodb/exception.d.ts +7 -7
- package/types/mongodb/index.d.ts +29 -29
- package/types/mongodb/manager/base.d.ts +188 -188
- package/types/mongodb/manager/index.d.ts +38 -38
- package/types/mongodb/manager/tx-strict.d.ts +41 -41
- package/types/mongodb/manager/tx.d.ts +21 -21
- package/types/mongodb/migration.d.ts +12 -12
- package/types/mvc/access-log.d.ts +7 -7
- package/types/mvc/config.d.ts +42 -42
- package/types/mvc/exchange.d.ts +72 -72
- package/types/mvc/handler/index.d.ts +4 -3
- package/types/mvc/handler/json.d.ts +44 -44
- package/types/mvc/handler/restful.d.ts +11 -11
- package/types/mvc/handler/sse.d.ts +34 -0
- package/types/mvc/handler/upload.d.ts +36 -36
- package/types/mvc/index.d.ts +22 -22
- package/types/mvc/interceptor.d.ts +11 -11
- package/types/mvc/query.d.ts +13 -13
- package/types/mvc/render/file.d.ts +10 -10
- package/types/mvc/render/html/html.d.ts +98 -98
- package/types/mvc/render/html/index.d.ts +11 -11
- package/types/mvc/render/html/style.d.ts +1201 -1201
- package/types/mvc/render/index.d.ts +4 -4
- package/types/mvc/render/json.d.ts +17 -17
- package/types/mvc/render/text.d.ts +10 -10
- package/types/mvc/router.d.ts +11 -11
- package/types/mvc/server.d.ts +90 -90
- package/types/mvc/static/header.d.ts +27 -27
- package/types/mvc/static/index.d.ts +3 -3
- package/types/mvc/static/mime-type.d.ts +2 -2
- package/types/mvc/static/server-cache-config.d.ts +30 -30
- package/types/mvc/static/server-cache.d.ts +76 -76
- package/types/mvc/static/static-handler.d.ts +77 -77
- package/types/mysql/config.d.ts +90 -90
- package/types/mysql/exception.d.ts +7 -7
- package/types/mysql/index.d.ts +16 -16
- package/types/mysql/manager/base.d.ts +165 -159
- package/types/mysql/manager/index.d.ts +36 -36
- package/types/mysql/manager/ops/count.d.ts +13 -13
- package/types/mysql/manager/ops/criteria.d.ts +134 -134
- package/types/mysql/manager/ops/delete.d.ts +46 -46
- package/types/mysql/manager/ops/exist.d.ts +6 -6
- package/types/mysql/manager/ops/find.d.ts +86 -70
- package/types/mysql/manager/ops/index.d.ts +10 -10
- package/types/mysql/manager/ops/insert.d.ts +18 -18
- package/types/mysql/manager/ops/modify.d.ts +3 -3
- package/types/mysql/manager/ops/paginate.d.ts +36 -36
- package/types/mysql/manager/ops/query.d.ts +3 -3
- package/types/mysql/manager/ops/update.d.ts +76 -76
- package/types/mysql/manager/ops/utils.d.ts +5 -5
- package/types/mysql/manager/tx-strict.d.ts +36 -35
- package/types/mysql/manager/tx.d.ts +15 -15
- package/types/mysql/manager/utils.d.ts +17 -17
- package/types/mysql/migration.d.ts +8 -8
- package/types/mysql/table-info.d.ts +36 -36
- package/types/task/daily.d.ts +16 -16
- package/types/task/fixed-delay.d.ts +9 -9
- package/types/task/fixed-rate.d.ts +9 -9
- package/types/task/index.d.ts +4 -4
- package/types/task/task.d.ts +34 -34
- package/types/validation/exception.d.ts +38 -38
- package/types/validation/index.d.ts +32 -32
- package/types/validation/validator/array.d.ts +5 -5
- package/types/validation/validator/enum.d.ts +8 -8
- package/types/validation/validator/index.d.ts +11 -11
- package/types/validation/validator/length.d.ts +10 -10
- package/types/validation/validator/max-length.d.ts +8 -8
- package/types/validation/validator/max.d.ts +7 -7
- package/types/validation/validator/min-length.d.ts +6 -6
- package/types/validation/validator/min.d.ts +7 -7
- package/types/validation/validator/not-blank.d.ts +7 -7
- package/types/validation/validator/not-null.d.ts +6 -6
- package/types/validation/validator/plain-obj.d.ts +7 -7
- package/types/validation/validator/regexp.d.ts +8 -8
package/README.en.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
[简体中文](./README.md) | English
|
|
2
|
+
|
|
3
|
+
# Wok Server
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/wok-server)
|
|
6
|
+
[](https://github.com/nicepkg/wok-server/blob/master/LICENSE)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
|
|
9
|
+
A lightweight, restrained backend framework for Node.js and TypeScript.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Infrastructure** — Configuration, Logging, i18n, Caching
|
|
14
|
+
- **Web Layer** — Routing, Validation, MVC
|
|
15
|
+
- **Database** — MySQL, MongoDB
|
|
16
|
+
- **Others** — Scheduled Tasks
|
|
17
|
+
|
|
18
|
+
## Why Wok Server
|
|
19
|
+
|
|
20
|
+
- Functional-first with minimal OOP, low learning curve
|
|
21
|
+
- Deliberately restrained — no decorators, proxies, or metaprogramming
|
|
22
|
+
- Lightweight wrapper, compatible with the broader HTTP ecosystem
|
|
23
|
+
- Full TypeScript definitions with IDE IntelliSense support
|
|
24
|
+
- Self-documenting code with detailed method and parameter annotations
|
|
25
|
+
- Built-in i18n with extensible language support
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm i wok-server
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { startWebServer } from 'wok-server'
|
|
35
|
+
|
|
36
|
+
startWebServer({
|
|
37
|
+
routers: {
|
|
38
|
+
'/': async exchange => exchange.respondText('Hello world!')
|
|
39
|
+
}
|
|
40
|
+
}).catch(e => {
|
|
41
|
+
console.error('Start server failed', e)
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Visit `http://localhost:8080` to see the output.
|
|
46
|
+
|
|
47
|
+
For more configuration via environment variables, see the [full documentation](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md).
|
|
48
|
+
|
|
49
|
+
### Install AI Skills
|
|
50
|
+
|
|
51
|
+
wok-server provides AI skills that help AI coding assistants better understand and use wok-server components.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npx skills add peaktai/wok-server --all
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
If GitHub access is slow, use the Gitee mirror:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx skills add https://gitee.com/tai/wok-server.git --all
|
|
61
|
+
```
|
package/README.md
CHANGED
|
@@ -1,57 +1,72 @@
|
|
|
1
|
+
[English](./README.en.md) | 简体中文
|
|
2
|
+
|
|
1
3
|
# Wok Server
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/wok-server)
|
|
6
|
+
[](https://github.com/nicepkg/wok-server/blob/master/LICENSE)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
一个基于 Node.js 和 TypeScript 的后端框架,轻量、克制、简洁。
|
|
6
10
|
|
|
7
|
-
|
|
11
|
+
## 功能概览
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
- **基础设施** — 配置管理、日志、国际化、缓存
|
|
14
|
+
- **Web 层** — 路由、参数校验、MVC
|
|
15
|
+
- **数据库** — MySQL、MongoDB
|
|
16
|
+
- **其他** — 周期任务
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
- 功能简单,使用方便,保持克制,不引入太多特性
|
|
13
|
-
- 轻量封装,最大限度兼容已有生态,支持集成第三方 http 相关的库来处理请求
|
|
14
|
-
- 支持国际化,自带多种语言的支持,国际化内容支持扩展
|
|
15
|
-
- 有完整的类型约束和定义,结合 IDE 的代码补全功能,开发效率高
|
|
16
|
-
- 注释详细,文档就在代码中,方法和参数都有详细说明,可在 IDE 的辅助下方便查看
|
|
18
|
+
## 为什么选择 Wok Server
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
- 函数式为主,少量面向对象,学习成本低
|
|
21
|
+
- 保持克制,不引入代理、装饰器等增强技术
|
|
22
|
+
- 轻量封装,兼容第三方 HTTP 生态
|
|
23
|
+
- 完整的类型定义,配合 IDE 智能补全,开发效率高
|
|
24
|
+
- 注释即文档,方法及参数均有详细说明
|
|
25
|
+
- 内置国际化支持,可扩展多语言
|
|
19
26
|
|
|
20
|
-
|
|
27
|
+
## 快速开始
|
|
21
28
|
|
|
29
|
+
```bash
|
|
30
|
+
npm i wok-server
|
|
22
31
|
```
|
|
23
|
-
npm i wok-server --save
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
入口文件:
|
|
27
32
|
|
|
28
33
|
```ts
|
|
29
34
|
import { startWebServer } from 'wok-server'
|
|
30
35
|
|
|
31
36
|
startWebServer({
|
|
32
37
|
routers: {
|
|
33
|
-
'/': async exchange => exchange.respondText('Hello world
|
|
38
|
+
'/': async exchange => exchange.respondText('Hello world!')
|
|
34
39
|
}
|
|
35
40
|
}).catch(e => {
|
|
36
41
|
console.error('Start server failed', e)
|
|
37
42
|
})
|
|
38
43
|
```
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
启动后访问 `http://localhost:8080` 即可看到输出。
|
|
46
|
+
|
|
47
|
+
更多配置通过环境变量设置,详见[完整文档](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md)。
|
|
48
|
+
|
|
49
|
+
### AI 技能安装
|
|
50
|
+
|
|
51
|
+
wok-server 提供了 AI 技能,安装后可以让 AI 编程助手更好地理解和使用 wok-server 组件。
|
|
41
52
|
|
|
42
|
-
相关的设置可以通过环境变量来修改,查看[完整文档](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md)了解细节。
|
|
43
53
|
|
|
44
|
-
|
|
54
|
+
```bash
|
|
55
|
+
npx skills add peaktai/wok-server --all
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
国内用户访问 github 速度慢,可以使用 gitee 仓库地址来安装。
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx skills add https://gitee.com/tai/wok-server.git --all
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## FAQ
|
|
45
65
|
|
|
46
|
-
###
|
|
66
|
+
### 为什么内置 MySQL 和 MongoDB 驱动?
|
|
47
67
|
|
|
48
|
-
|
|
49
|
-
单独拆分成一个独立的包以供按需引入。这样做是为了方便,不需要安装那么多包,安装的包多了
|
|
50
|
-
之后,还有可能需要解决依赖冲突问题,找到版本匹配的包,使用和维护都麻烦。对于后端程序来说,
|
|
51
|
-
体积大一些问题也不大。
|
|
68
|
+
mysql2 和 mongodb 驱动已直接集成,安装一个包即可使用,避免多个包的版本冲突和维护成本。对于后端应用,包体积的增加影响有限。
|
|
52
69
|
|
|
53
|
-
###
|
|
70
|
+
### 为什么 WebSocket、文件上传等功能需要自行引入?
|
|
54
71
|
|
|
55
|
-
|
|
56
|
-
这些库是基于 Nodejs 内置的模块 http,不用担心与框架的兼容性问题,框架只要保持支持即可,
|
|
57
|
-
也可以充分利用已有的生态,不需要专门为框架编写扩展。
|
|
72
|
+
这些功能基于 Node.js 原生 `http` 模块,天然兼容框架,无需专门适配。由用户按需引入第三方库,可以充分利用社区生态,同时减少框架的维护负担。
|
package/dist/cache/cache.js
CHANGED
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Cache = void 0;
|
|
4
|
-
const config_1 = require("./config");
|
|
5
|
-
class Cache {
|
|
6
|
-
valueMap;
|
|
7
|
-
stat;
|
|
8
|
-
/**
|
|
9
|
-
* promise 表,作用是处理异步并发问题,如果有相同的 key 同时请求,保证异步的 provider 只执行一次
|
|
10
|
-
*/
|
|
11
|
-
promiseMap = new Map();
|
|
12
|
-
constructor(valueMap, stat) {
|
|
13
|
-
this.valueMap = valueMap;
|
|
14
|
-
this.stat = stat;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* 放入缓存
|
|
18
|
-
* @param key
|
|
19
|
-
* @param val
|
|
20
|
-
* @param expiresInSeconds
|
|
21
|
-
*/
|
|
22
|
-
put(key, val, expiresInSeconds) {
|
|
23
|
-
const finalExpiresInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
|
|
24
|
-
this.valueMap.set(key, {
|
|
25
|
-
val,
|
|
26
|
-
expireAt: new Date().getTime() + finalExpiresInSeconds * 1000
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 获取缓存值
|
|
31
|
-
* @param key
|
|
32
|
-
* @returns
|
|
33
|
-
*/
|
|
34
|
-
get(key) {
|
|
35
|
-
const content = this.valueMap.get(key);
|
|
36
|
-
if (!content) {
|
|
37
|
-
this.stat?.addGet(false);
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
if (content.expireAt < new Date().getTime()) {
|
|
41
|
-
this.stat?.addGet(false);
|
|
42
|
-
this.valueMap.delete(key);
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
this.stat?.addGet(true);
|
|
46
|
-
return content.val;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 清除所有缓存
|
|
50
|
-
*/
|
|
51
|
-
clear() {
|
|
52
|
-
this.valueMap.clear();
|
|
53
|
-
this.stat?.clear();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 删除.
|
|
57
|
-
* @param key
|
|
58
|
-
*/
|
|
59
|
-
remove(key) {
|
|
60
|
-
this.valueMap.delete(key);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* 在缓存值不存在时计算缓存的值,然后放入并返回.
|
|
64
|
-
* @param key
|
|
65
|
-
* @param provider
|
|
66
|
-
* @param expiresInSeconds
|
|
67
|
-
*/
|
|
68
|
-
async computeIfAbsent(key, provider, expiresInSeconds) {
|
|
69
|
-
const content = this.valueMap.get(key);
|
|
70
|
-
if (content && content.expireAt >= new Date().getTime()) {
|
|
71
|
-
this.stat?.addGet(true);
|
|
72
|
-
return content.val;
|
|
73
|
-
}
|
|
74
|
-
this.stat?.addGet(false);
|
|
75
|
-
// 如果已经在处理中,则直接返回 promise
|
|
76
|
-
const ep = this.promiseMap.get(key);
|
|
77
|
-
if (ep) {
|
|
78
|
-
return ep;
|
|
79
|
-
}
|
|
80
|
-
// 创建新的异步流程
|
|
81
|
-
const promise = Promise.resolve().then(async () => {
|
|
82
|
-
try {
|
|
83
|
-
const finalExpireInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
|
|
84
|
-
// 计算值
|
|
85
|
-
const res = provider();
|
|
86
|
-
const val = res instanceof Promise ? await res : res;
|
|
87
|
-
this.put(key, val, finalExpireInSeconds);
|
|
88
|
-
return val;
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
this.promiseMap.delete(key);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
this.promiseMap.set(key, promise);
|
|
95
|
-
return promise;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
exports.Cache = Cache;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Cache = void 0;
|
|
4
|
+
const config_1 = require("./config");
|
|
5
|
+
class Cache {
|
|
6
|
+
valueMap;
|
|
7
|
+
stat;
|
|
8
|
+
/**
|
|
9
|
+
* promise 表,作用是处理异步并发问题,如果有相同的 key 同时请求,保证异步的 provider 只执行一次
|
|
10
|
+
*/
|
|
11
|
+
promiseMap = new Map();
|
|
12
|
+
constructor(valueMap, stat) {
|
|
13
|
+
this.valueMap = valueMap;
|
|
14
|
+
this.stat = stat;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 放入缓存
|
|
18
|
+
* @param key
|
|
19
|
+
* @param val
|
|
20
|
+
* @param expiresInSeconds
|
|
21
|
+
*/
|
|
22
|
+
put(key, val, expiresInSeconds) {
|
|
23
|
+
const finalExpiresInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
|
|
24
|
+
this.valueMap.set(key, {
|
|
25
|
+
val,
|
|
26
|
+
expireAt: new Date().getTime() + finalExpiresInSeconds * 1000
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 获取缓存值
|
|
31
|
+
* @param key
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
get(key) {
|
|
35
|
+
const content = this.valueMap.get(key);
|
|
36
|
+
if (!content) {
|
|
37
|
+
this.stat?.addGet(false);
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (content.expireAt < new Date().getTime()) {
|
|
41
|
+
this.stat?.addGet(false);
|
|
42
|
+
this.valueMap.delete(key);
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
this.stat?.addGet(true);
|
|
46
|
+
return content.val;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 清除所有缓存
|
|
50
|
+
*/
|
|
51
|
+
clear() {
|
|
52
|
+
this.valueMap.clear();
|
|
53
|
+
this.stat?.clear();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 删除.
|
|
57
|
+
* @param key
|
|
58
|
+
*/
|
|
59
|
+
remove(key) {
|
|
60
|
+
this.valueMap.delete(key);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 在缓存值不存在时计算缓存的值,然后放入并返回.
|
|
64
|
+
* @param key
|
|
65
|
+
* @param provider
|
|
66
|
+
* @param expiresInSeconds
|
|
67
|
+
*/
|
|
68
|
+
async computeIfAbsent(key, provider, expiresInSeconds) {
|
|
69
|
+
const content = this.valueMap.get(key);
|
|
70
|
+
if (content && content.expireAt >= new Date().getTime()) {
|
|
71
|
+
this.stat?.addGet(true);
|
|
72
|
+
return content.val;
|
|
73
|
+
}
|
|
74
|
+
this.stat?.addGet(false);
|
|
75
|
+
// 如果已经在处理中,则直接返回 promise
|
|
76
|
+
const ep = this.promiseMap.get(key);
|
|
77
|
+
if (ep) {
|
|
78
|
+
return ep;
|
|
79
|
+
}
|
|
80
|
+
// 创建新的异步流程
|
|
81
|
+
const promise = Promise.resolve().then(async () => {
|
|
82
|
+
try {
|
|
83
|
+
const finalExpireInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
|
|
84
|
+
// 计算值
|
|
85
|
+
const res = provider();
|
|
86
|
+
const val = res instanceof Promise ? await res : res;
|
|
87
|
+
this.put(key, val, finalExpireInSeconds);
|
|
88
|
+
return val;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
this.promiseMap.delete(key);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
this.promiseMap.set(key, promise);
|
|
95
|
+
return promise;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.Cache = Cache;
|
package/dist/cache/config.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.config = void 0;
|
|
4
|
-
const config_1 = require("../config");
|
|
5
|
-
const validation_1 = require("../validation");
|
|
6
|
-
const ENV_PREFIX = 'CACHE';
|
|
7
|
-
exports.config = (0, config_1.registerConfig)({
|
|
8
|
-
defaultExpireInSeconds: 60,
|
|
9
|
-
statTaskEnabled: false,
|
|
10
|
-
statInterval: 300,
|
|
11
|
-
maxElements: 1024,
|
|
12
|
-
cleaningInterval: 60
|
|
13
|
-
}, ENV_PREFIX, {
|
|
14
|
-
defaultExpireInSeconds: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)],
|
|
15
|
-
statTaskEnabled: [(0, validation_1.notNull)()],
|
|
16
|
-
statInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600 * 24)],
|
|
17
|
-
maxElements: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(Number.MAX_VALUE)],
|
|
18
|
-
cleaningInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)]
|
|
19
|
-
});
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
const config_1 = require("../config");
|
|
5
|
+
const validation_1 = require("../validation");
|
|
6
|
+
const ENV_PREFIX = 'CACHE';
|
|
7
|
+
exports.config = (0, config_1.registerConfig)({
|
|
8
|
+
defaultExpireInSeconds: 60,
|
|
9
|
+
statTaskEnabled: false,
|
|
10
|
+
statInterval: 300,
|
|
11
|
+
maxElements: 1024,
|
|
12
|
+
cleaningInterval: 60
|
|
13
|
+
}, ENV_PREFIX, {
|
|
14
|
+
defaultExpireInSeconds: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)],
|
|
15
|
+
statTaskEnabled: [(0, validation_1.notNull)()],
|
|
16
|
+
statInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600 * 24)],
|
|
17
|
+
maxElements: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(Number.MAX_VALUE)],
|
|
18
|
+
cleaningInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)]
|
|
19
|
+
});
|
package/dist/cache/index.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getCache = void 0;
|
|
4
|
-
const task_1 = require("../task");
|
|
5
|
-
const cache_1 = require("./cache");
|
|
6
|
-
const config_1 = require("./config");
|
|
7
|
-
const purge_task_1 = require("./purge-task");
|
|
8
|
-
const stat_1 = require("./stat");
|
|
9
|
-
const valueMap = new Map();
|
|
10
|
-
const stat = config_1.config.statTaskEnabled ? new stat_1.CacheStat(valueMap) : undefined;
|
|
11
|
-
const cache = new cache_1.Cache(valueMap, stat);
|
|
12
|
-
// 清理任务
|
|
13
|
-
(0, task_1.scheduleWithFixedDelay)(config_1.config.cleaningInterval, config_1.config.cleaningInterval, new purge_task_1.PurgeTask(valueMap));
|
|
14
|
-
// 统计任务
|
|
15
|
-
if (config_1.config.statTaskEnabled) {
|
|
16
|
-
(0, task_1.scheduleWithFixedDelay)(config_1.config.statInterval, config_1.config.statInterval, {
|
|
17
|
-
name: 'Cache statistics',
|
|
18
|
-
async run() {
|
|
19
|
-
stat?.log();
|
|
20
|
-
stat?.clear();
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function getCache() {
|
|
25
|
-
return cache;
|
|
26
|
-
}
|
|
27
|
-
exports.getCache = getCache;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCache = void 0;
|
|
4
|
+
const task_1 = require("../task");
|
|
5
|
+
const cache_1 = require("./cache");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
const purge_task_1 = require("./purge-task");
|
|
8
|
+
const stat_1 = require("./stat");
|
|
9
|
+
const valueMap = new Map();
|
|
10
|
+
const stat = config_1.config.statTaskEnabled ? new stat_1.CacheStat(valueMap) : undefined;
|
|
11
|
+
const cache = new cache_1.Cache(valueMap, stat);
|
|
12
|
+
// 清理任务
|
|
13
|
+
(0, task_1.scheduleWithFixedDelay)(config_1.config.cleaningInterval, config_1.config.cleaningInterval, new purge_task_1.PurgeTask(valueMap));
|
|
14
|
+
// 统计任务
|
|
15
|
+
if (config_1.config.statTaskEnabled) {
|
|
16
|
+
(0, task_1.scheduleWithFixedDelay)(config_1.config.statInterval, config_1.config.statInterval, {
|
|
17
|
+
name: 'Cache statistics',
|
|
18
|
+
async run() {
|
|
19
|
+
stat?.log();
|
|
20
|
+
stat?.clear();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function getCache() {
|
|
25
|
+
return cache;
|
|
26
|
+
}
|
|
27
|
+
exports.getCache = getCache;
|
package/dist/cache/purge-task.js
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PurgeTask = void 0;
|
|
4
|
-
const log_1 = require("../log");
|
|
5
|
-
const config_1 = require("./config");
|
|
6
|
-
/**
|
|
7
|
-
* 缓存清理任务
|
|
8
|
-
*/
|
|
9
|
-
class PurgeTask {
|
|
10
|
-
valueMap;
|
|
11
|
-
name = 'Cache purge';
|
|
12
|
-
constructor(valueMap) {
|
|
13
|
-
this.valueMap = valueMap;
|
|
14
|
-
}
|
|
15
|
-
async run() {
|
|
16
|
-
let removeCount = 0;
|
|
17
|
-
for (const entry of this.valueMap.entries()) {
|
|
18
|
-
const [key, value] = entry;
|
|
19
|
-
if (value.expireAt < new Date().getTime()) {
|
|
20
|
-
this.valueMap.delete(key);
|
|
21
|
-
removeCount++;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
if (removeCount > 0) {
|
|
25
|
-
(0, log_1.getLogger)().info(`A total of ${removeCount} expired cache ${removeCount > 1 ? 'records' : 'record'} have been cleared.`);
|
|
26
|
-
}
|
|
27
|
-
// 如果过期的都清理掉,但是元素总数仍然超出,则删除多余元素,删除是从头开始删除的
|
|
28
|
-
// 看上去是按put顺序清理最早的,实际上随机的,重复 set 相同的 key,key 的位置是不会变的,不保证 key 的顺序
|
|
29
|
-
// 所以,缓存是随机驱逐的
|
|
30
|
-
// 目前没有考虑支持其它的策略,因为需要额外记录信息,清理的逻辑也可能更复杂
|
|
31
|
-
// nodejs 是单线程模式的,规模上去后,可能需要执行较长的时间带来阻塞
|
|
32
|
-
if (this.valueMap.size > config_1.config.maxElements) {
|
|
33
|
-
let diff = this.valueMap.size - config_1.config.maxElements;
|
|
34
|
-
let evictedCount = 0;
|
|
35
|
-
for (const key of this.valueMap.keys()) {
|
|
36
|
-
this.valueMap.delete(key);
|
|
37
|
-
evictedCount++;
|
|
38
|
-
if (evictedCount >= diff) {
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
(0, log_1.getLogger)().info(`A total of ${evictedCount} cache ${evictedCount > 1 ? 'records' : 'record'} have been evicted.`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
exports.PurgeTask = PurgeTask;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PurgeTask = void 0;
|
|
4
|
+
const log_1 = require("../log");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
/**
|
|
7
|
+
* 缓存清理任务
|
|
8
|
+
*/
|
|
9
|
+
class PurgeTask {
|
|
10
|
+
valueMap;
|
|
11
|
+
name = 'Cache purge';
|
|
12
|
+
constructor(valueMap) {
|
|
13
|
+
this.valueMap = valueMap;
|
|
14
|
+
}
|
|
15
|
+
async run() {
|
|
16
|
+
let removeCount = 0;
|
|
17
|
+
for (const entry of this.valueMap.entries()) {
|
|
18
|
+
const [key, value] = entry;
|
|
19
|
+
if (value.expireAt < new Date().getTime()) {
|
|
20
|
+
this.valueMap.delete(key);
|
|
21
|
+
removeCount++;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (removeCount > 0) {
|
|
25
|
+
(0, log_1.getLogger)().info(`A total of ${removeCount} expired cache ${removeCount > 1 ? 'records' : 'record'} have been cleared.`);
|
|
26
|
+
}
|
|
27
|
+
// 如果过期的都清理掉,但是元素总数仍然超出,则删除多余元素,删除是从头开始删除的
|
|
28
|
+
// 看上去是按put顺序清理最早的,实际上随机的,重复 set 相同的 key,key 的位置是不会变的,不保证 key 的顺序
|
|
29
|
+
// 所以,缓存是随机驱逐的
|
|
30
|
+
// 目前没有考虑支持其它的策略,因为需要额外记录信息,清理的逻辑也可能更复杂
|
|
31
|
+
// nodejs 是单线程模式的,规模上去后,可能需要执行较长的时间带来阻塞
|
|
32
|
+
if (this.valueMap.size > config_1.config.maxElements) {
|
|
33
|
+
let diff = this.valueMap.size - config_1.config.maxElements;
|
|
34
|
+
let evictedCount = 0;
|
|
35
|
+
for (const key of this.valueMap.keys()) {
|
|
36
|
+
this.valueMap.delete(key);
|
|
37
|
+
evictedCount++;
|
|
38
|
+
if (evictedCount >= diff) {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
(0, log_1.getLogger)().info(`A total of ${evictedCount} cache ${evictedCount > 1 ? 'records' : 'record'} have been evicted.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.PurgeTask = PurgeTask;
|
package/dist/cache/stat.js
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CacheStat = void 0;
|
|
4
|
-
const log_1 = require("../log");
|
|
5
|
-
const date_1 = require("../log/date");
|
|
6
|
-
const config_1 = require("./config");
|
|
7
|
-
/**
|
|
8
|
-
* 缓存统计.
|
|
9
|
-
*/
|
|
10
|
-
class CacheStat {
|
|
11
|
-
valueMap;
|
|
12
|
-
/**
|
|
13
|
-
* 开始统计时间
|
|
14
|
-
*/
|
|
15
|
-
start;
|
|
16
|
-
totalGet = 0;
|
|
17
|
-
totalHit = 0;
|
|
18
|
-
constructor(valueMap) {
|
|
19
|
-
this.valueMap = valueMap;
|
|
20
|
-
this.start = new Date();
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* 添加 get 次数
|
|
24
|
-
* @param hit 是否命中
|
|
25
|
-
*/
|
|
26
|
-
addGet(hit) {
|
|
27
|
-
this.totalGet++;
|
|
28
|
-
if (hit) {
|
|
29
|
-
this.totalHit++;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* 清空统计信息,重新开始统计.
|
|
34
|
-
*/
|
|
35
|
-
clear() {
|
|
36
|
-
this.start = new Date();
|
|
37
|
-
this.totalGet = 0;
|
|
38
|
-
this.totalHit = 0;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* 输出日志
|
|
42
|
-
*/
|
|
43
|
-
log() {
|
|
44
|
-
(0, log_1.getLogger)().info(`Cache statistics,time window :${(0, date_1.formatDateTime)(this.start)} - now, hit :${this.totalHit}/${this.totalGet},capacity:${this.valueMap.size}/${config_1.config.maxElements}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
exports.CacheStat = CacheStat;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CacheStat = void 0;
|
|
4
|
+
const log_1 = require("../log");
|
|
5
|
+
const date_1 = require("../log/date");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
/**
|
|
8
|
+
* 缓存统计.
|
|
9
|
+
*/
|
|
10
|
+
class CacheStat {
|
|
11
|
+
valueMap;
|
|
12
|
+
/**
|
|
13
|
+
* 开始统计时间
|
|
14
|
+
*/
|
|
15
|
+
start;
|
|
16
|
+
totalGet = 0;
|
|
17
|
+
totalHit = 0;
|
|
18
|
+
constructor(valueMap) {
|
|
19
|
+
this.valueMap = valueMap;
|
|
20
|
+
this.start = new Date();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 添加 get 次数
|
|
24
|
+
* @param hit 是否命中
|
|
25
|
+
*/
|
|
26
|
+
addGet(hit) {
|
|
27
|
+
this.totalGet++;
|
|
28
|
+
if (hit) {
|
|
29
|
+
this.totalHit++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 清空统计信息,重新开始统计.
|
|
34
|
+
*/
|
|
35
|
+
clear() {
|
|
36
|
+
this.start = new Date();
|
|
37
|
+
this.totalGet = 0;
|
|
38
|
+
this.totalHit = 0;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 输出日志
|
|
42
|
+
*/
|
|
43
|
+
log() {
|
|
44
|
+
(0, log_1.getLogger)().info(`Cache statistics,time window :${(0, date_1.formatDateTime)(this.start)} - now, hit :${this.totalHit}/${this.totalGet},capacity:${this.valueMap.size}/${config_1.config.maxElements}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.CacheStat = CacheStat;
|