@nest-omni/core 4.1.3-2 → 4.1.3-4

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 (235) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +15 -0
  3. package/audit/controllers/audit.controller.d.ts +24 -0
  4. package/audit/controllers/audit.controller.js +24 -0
  5. package/audit/decorators/audit-controller.decorator.d.ts +8 -0
  6. package/audit/decorators/audit-controller.decorator.js +9 -0
  7. package/audit/decorators/audit-operation.decorator.d.ts +45 -0
  8. package/audit/decorators/audit-operation.decorator.js +49 -0
  9. package/audit/decorators/entity-audit.decorator.d.ts +8 -0
  10. package/audit/decorators/entity-audit.decorator.js +9 -0
  11. package/audit/dto/audit-log-query.dto.d.ts +3 -0
  12. package/audit/dto/audit-log-query.dto.js +3 -0
  13. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  14. package/audit/dto/begin-transaction.dto.js +3 -0
  15. package/audit/dto/compare-entities.dto.d.ts +3 -0
  16. package/audit/dto/compare-entities.dto.js +3 -0
  17. package/audit/dto/pre-check-restore.dto.d.ts +3 -0
  18. package/audit/dto/pre-check-restore.dto.js +3 -0
  19. package/audit/dto/restore-entity.dto.d.ts +3 -0
  20. package/audit/dto/restore-entity.dto.js +3 -0
  21. package/audit/entities/entity-audit-log.entity.d.ts +3 -0
  22. package/audit/entities/entity-audit-log.entity.js +3 -0
  23. package/audit/entities/entity-transaction.entity.d.ts +3 -0
  24. package/audit/entities/entity-transaction.entity.js +3 -0
  25. package/audit/entities/manual-operation-log.entity.d.ts +4 -0
  26. package/audit/entities/manual-operation-log.entity.js +4 -0
  27. package/audit/entities/operation-template.entity.d.ts +4 -0
  28. package/audit/entities/operation-template.entity.js +4 -0
  29. package/audit/enums/audit.enums.d.ts +17 -2
  30. package/audit/enums/audit.enums.js +15 -0
  31. package/audit/index.js +10 -0
  32. package/audit/interceptors/audit.interceptor.d.ts +15 -0
  33. package/audit/interceptors/audit.interceptor.js +23 -1
  34. package/audit/interfaces/audit.interfaces.d.ts +42 -0
  35. package/audit/services/audit-context.service.d.ts +15 -0
  36. package/audit/services/audit-context.service.js +15 -0
  37. package/audit/services/audit-strategy.service.d.ts +6 -0
  38. package/audit/services/audit-strategy.service.js +13 -0
  39. package/audit/services/entity-audit.service.d.ts +57 -0
  40. package/audit/services/entity-audit.service.js +91 -0
  41. package/audit/services/manual-audit-log.service.d.ts +124 -0
  42. package/audit/services/manual-audit-log.service.js +138 -0
  43. package/audit/services/multi-database.service.d.ts +12 -0
  44. package/audit/services/multi-database.service.js +12 -0
  45. package/audit/services/operation-description.service.d.ts +59 -0
  46. package/audit/services/operation-description.service.js +76 -2
  47. package/audit/services/transaction-audit.service.d.ts +30 -0
  48. package/audit/services/transaction-audit.service.js +47 -0
  49. package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
  50. package/audit/subscribers/entity-audit.subscriber.js +29 -1
  51. package/cache/cache-metrics.service.d.ts +67 -0
  52. package/cache/cache-metrics.service.js +68 -4
  53. package/cache/cache-serialization.service.d.ts +31 -0
  54. package/cache/cache-serialization.service.js +25 -0
  55. package/cache/cache.constants.d.ts +9 -0
  56. package/cache/cache.constants.js +9 -0
  57. package/cache/cache.health.d.ts +26 -0
  58. package/cache/cache.health.js +30 -0
  59. package/cache/cache.module.d.ts +86 -0
  60. package/cache/cache.module.js +71 -0
  61. package/cache/cache.service.d.ts +140 -0
  62. package/cache/cache.service.js +157 -0
  63. package/cache/cache.warmup.service.d.ts +39 -0
  64. package/cache/cache.warmup.service.js +32 -0
  65. package/cache/decorators/cache-evict.decorator.d.ts +47 -0
  66. package/cache/decorators/cache-evict.decorator.js +56 -0
  67. package/cache/decorators/cache-put.decorator.d.ts +34 -0
  68. package/cache/decorators/cache-put.decorator.js +39 -0
  69. package/cache/decorators/cacheable.decorator.d.ts +40 -0
  70. package/cache/decorators/cacheable.decorator.js +55 -0
  71. package/cache/dependencies/callback.dependency.d.ts +33 -0
  72. package/cache/dependencies/callback.dependency.js +39 -1
  73. package/cache/dependencies/chain.dependency.d.ts +28 -0
  74. package/cache/dependencies/chain.dependency.js +34 -0
  75. package/cache/dependencies/db.dependency.d.ts +45 -0
  76. package/cache/dependencies/db.dependency.js +48 -1
  77. package/cache/dependencies/file.dependency.d.ts +32 -0
  78. package/cache/dependencies/file.dependency.js +34 -0
  79. package/cache/dependencies/tag.dependency.d.ts +36 -0
  80. package/cache/dependencies/tag.dependency.js +36 -0
  81. package/cache/dependencies/time.dependency.d.ts +43 -0
  82. package/cache/dependencies/time.dependency.js +43 -0
  83. package/cache/examples/basic-usage.d.ts +15 -0
  84. package/cache/examples/basic-usage.js +62 -8
  85. package/cache/index.js +9 -0
  86. package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
  87. package/cache/interfaces/cache-options.interface.d.ts +81 -0
  88. package/cache/interfaces/cache-options.interface.js +6 -0
  89. package/cache/interfaces/cache-provider.interface.d.ts +78 -0
  90. package/cache/providers/base-cache.provider.d.ts +14 -0
  91. package/cache/providers/base-cache.provider.js +16 -0
  92. package/cache/providers/cls-cache.provider.d.ts +20 -0
  93. package/cache/providers/cls-cache.provider.js +28 -0
  94. package/cache/providers/memory-cache.provider.d.ts +23 -0
  95. package/cache/providers/memory-cache.provider.js +26 -0
  96. package/cache/providers/redis-cache.provider.d.ts +26 -0
  97. package/cache/providers/redis-cache.provider.js +29 -0
  98. package/cache/utils/dependency-manager.util.d.ts +52 -0
  99. package/cache/utils/dependency-manager.util.js +59 -0
  100. package/cache/utils/key-generator.util.d.ts +42 -0
  101. package/cache/utils/key-generator.util.js +53 -1
  102. package/common/abstract.entity.d.ts +14 -0
  103. package/common/abstract.entity.js +14 -0
  104. package/common/boilerplate.polyfill.d.ts +142 -0
  105. package/common/boilerplate.polyfill.js +17 -0
  106. package/common/dto/dto-container.d.ts +16 -0
  107. package/common/dto/dto-container.js +20 -0
  108. package/common/dto/dto-decorators.d.ts +18 -0
  109. package/common/dto/dto-decorators.js +14 -0
  110. package/common/dto/dto-extensions.d.ts +11 -0
  111. package/common/dto/dto-extensions.js +9 -0
  112. package/common/dto/dto-service-accessor.d.ts +17 -0
  113. package/common/dto/dto-service-accessor.js +18 -0
  114. package/common/dto/dto-transformer.d.ts +12 -0
  115. package/common/dto/dto-transformer.js +9 -0
  116. package/common/dto/index.js +2 -0
  117. package/common/examples/paginate-and-map.example.d.ts +6 -0
  118. package/common/examples/paginate-and-map.example.js +26 -0
  119. package/common/utils.d.ts +15 -0
  120. package/common/utils.js +15 -0
  121. package/constants/language-code.js +1 -0
  122. package/decorators/field.decorators.js +8 -1
  123. package/decorators/property.decorators.js +1 -0
  124. package/decorators/public-route.decorator.js +1 -0
  125. package/decorators/transform.decorators.d.ts +27 -0
  126. package/decorators/transform.decorators.js +29 -0
  127. package/decorators/translate.decorator.js +1 -0
  128. package/decorators/user.decorator.js +1 -0
  129. package/decorators/validator.decorators.d.ts +8 -18
  130. package/decorators/validator.decorators.js +22 -190
  131. package/filters/constraint-errors.js +1 -0
  132. package/helpers/common.helper.d.ts +13 -0
  133. package/helpers/common.helper.js +13 -0
  134. package/http-client/config/http-client.config.d.ts +15 -0
  135. package/http-client/config/http-client.config.js +25 -9
  136. package/http-client/decorators/http-client.decorators.d.ts +63 -0
  137. package/http-client/decorators/http-client.decorators.js +71 -3
  138. package/http-client/entities/http-log.entity.d.ts +229 -0
  139. package/http-client/entities/http-log.entity.js +6 -1
  140. package/http-client/errors/http-client.errors.d.ts +57 -0
  141. package/http-client/errors/http-client.errors.js +58 -0
  142. package/http-client/examples/advanced-usage.example.d.ts +41 -0
  143. package/http-client/examples/advanced-usage.example.js +68 -24
  144. package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
  145. package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
  146. package/http-client/examples/basic-usage.example.d.ts +60 -0
  147. package/http-client/examples/basic-usage.example.js +60 -0
  148. package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
  149. package/http-client/examples/multi-api-configuration.example.js +76 -5
  150. package/http-client/http-client.module.d.ts +13 -0
  151. package/http-client/http-client.module.js +19 -0
  152. package/http-client/index.js +8 -0
  153. package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
  154. package/http-client/interfaces/api-client-config.interface.js +3 -0
  155. package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
  156. package/http-client/services/api-client-registry.service.d.ts +57 -0
  157. package/http-client/services/api-client-registry.service.js +84 -1
  158. package/http-client/services/cache.service.d.ts +52 -0
  159. package/http-client/services/cache.service.js +72 -3
  160. package/http-client/services/circuit-breaker.service.d.ts +46 -0
  161. package/http-client/services/circuit-breaker.service.js +52 -0
  162. package/http-client/services/http-client.service.d.ts +67 -0
  163. package/http-client/services/http-client.service.js +105 -4
  164. package/http-client/services/http-log-query.service.d.ts +83 -0
  165. package/http-client/services/http-log-query.service.js +122 -1
  166. package/http-client/services/http-replay.service.d.ts +101 -0
  167. package/http-client/services/http-replay.service.js +86 -0
  168. package/http-client/services/log-cleanup.service.d.ts +63 -0
  169. package/http-client/services/log-cleanup.service.js +54 -2
  170. package/http-client/services/logging.service.d.ts +40 -0
  171. package/http-client/services/logging.service.js +53 -0
  172. package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
  173. package/http-client/utils/call-stack-extractor.util.js +48 -0
  174. package/http-client/utils/context-extractor.util.d.ts +49 -0
  175. package/http-client/utils/context-extractor.util.js +52 -0
  176. package/http-client/utils/curl-generator.util.d.ts +21 -0
  177. package/http-client/utils/curl-generator.util.js +44 -3
  178. package/http-client/utils/request-id.util.d.ts +18 -0
  179. package/http-client/utils/request-id.util.js +20 -0
  180. package/http-client/utils/retry-recorder.util.d.ts +42 -0
  181. package/http-client/utils/retry-recorder.util.js +44 -0
  182. package/index.js +8 -0
  183. package/interceptors/translation-interceptor.service.js +5 -0
  184. package/package.json +1 -1
  185. package/providers/context.provider.js +2 -0
  186. package/providers/generator.provider.d.ts +4 -0
  187. package/providers/generator.provider.js +4 -0
  188. package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
  189. package/redis-lock/examples/lock-strategy.examples.js +130 -15
  190. package/redis-lock/index.js +3 -0
  191. package/redis-lock/redis-lock.decorator.d.ts +101 -0
  192. package/redis-lock/redis-lock.decorator.js +120 -0
  193. package/redis-lock/redis-lock.module.d.ts +60 -0
  194. package/redis-lock/redis-lock.module.js +46 -0
  195. package/redis-lock/redis-lock.service.d.ts +251 -0
  196. package/redis-lock/redis-lock.service.js +219 -3
  197. package/setup/bootstrap.setup.js +20 -0
  198. package/setup/mode.setup.d.ts +44 -0
  199. package/setup/mode.setup.js +44 -0
  200. package/setup/schedule.decorator.d.ts +226 -0
  201. package/setup/schedule.decorator.js +214 -1
  202. package/setup/worker.decorator.d.ts +86 -0
  203. package/setup/worker.decorator.js +88 -0
  204. package/shared/serviceRegistryModule.js +5 -1
  205. package/shared/services/api-config.service.d.ts +3 -0
  206. package/shared/services/api-config.service.js +20 -9
  207. package/validator-json/decorators.d.ts +17 -0
  208. package/validator-json/decorators.js +17 -2
  209. package/validator-json/default.d.ts +6 -0
  210. package/validator-json/default.js +30 -2
  211. package/validator-json/defaultConverters.js +1 -0
  212. package/validator-json/options.d.ts +23 -0
  213. package/validators/common-validators.d.ts +143 -0
  214. package/validators/common-validators.js +249 -0
  215. package/validators/custom-validate.examples.d.ts +23 -0
  216. package/validators/custom-validate.examples.js +78 -6
  217. package/validators/custom-validate.validator.d.ts +107 -0
  218. package/validators/custom-validate.validator.js +84 -0
  219. package/validators/index.d.ts +1 -0
  220. package/validators/index.js +1 -0
  221. package/validators/is-exists.validator.d.ts +11 -0
  222. package/validators/is-exists.validator.js +22 -0
  223. package/validators/is-unique.validator.d.ts +11 -0
  224. package/validators/is-unique.validator.js +31 -3
  225. package/validators/skip-empty.validator.d.ts +5 -0
  226. package/validators/skip-empty.validator.js +5 -0
  227. package/vault/interfaces/vault-options.interface.d.ts +9 -0
  228. package/vault/vault-config.loader.d.ts +30 -0
  229. package/vault/vault-config.loader.js +48 -1
  230. package/vault/vault-config.service.d.ts +53 -0
  231. package/vault/vault-config.service.js +57 -0
  232. package/vault/vault.module.d.ts +4 -0
  233. package/vault/vault.module.js +4 -0
  234. package/decorators/examples/validation-decorators.example.d.ts +0 -69
  235. package/decorators/examples/validation-decorators.example.js +0 -331
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ /**
3
+ * 基础缓存使用示例
4
+ */
2
5
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
6
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
7
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -22,16 +25,18 @@ exports.CacheMonitoringService = exports.PostService = exports.UserService = voi
22
25
  exports.demonstrateCacheUsage = demonstrateCacheUsage;
23
26
  const common_1 = require("@nestjs/common");
24
27
  const index_1 = require("../index");
28
+ // 模拟的仓库类
25
29
  class UserRepository {
26
30
  findOne(id) {
27
31
  return __awaiter(this, void 0, void 0, function* () {
32
+ // 模拟数据库查询
28
33
  console.log(`[DB] 查询用户 ${id}`);
29
34
  return {
30
35
  id,
31
36
  name: `User ${id}`,
32
37
  email: `user${id}@example.com`,
33
38
  profile: {
34
- bio: `这是用户 ${id} 的个人简介`.repeat(10),
39
+ bio: `这是用户 ${id} 的个人简介`.repeat(10), // 长文本,用于测试压缩
35
40
  avatar: `avatar_${id}.jpg`,
36
41
  },
37
42
  };
@@ -80,37 +85,45 @@ class PostRepository {
80
85
  .map((_, i) => ({
81
86
  id: `post_${authorId}_${i}`,
82
87
  title: `文章 ${i}`,
83
- content: `这是文章 ${i} 的内容`.repeat(15),
88
+ content: `这是文章 ${i} 的内容`.repeat(15), // 长内容,用于测试压缩
84
89
  authorId,
85
90
  createdAt: new Date(),
86
91
  }));
87
92
  });
88
93
  }
89
94
  }
95
+ /**
96
+ * 用户服务示例
97
+ */
90
98
  let UserService = class UserService {
91
99
  constructor(cacheService, userRepository) {
92
100
  this.cacheService = cacheService;
93
101
  this.userRepository = userRepository;
94
102
  }
103
+ // 基础缓存使用
95
104
  getUser(id) {
96
105
  return __awaiter(this, void 0, void 0, function* () {
97
106
  return yield this.cacheService.getOrSet(`user:${id}`, () => this.userRepository.findOne(id), { ttl: 300000 });
98
107
  });
99
108
  }
109
+ // 使用装饰器缓存
100
110
  getUserProfile(id) {
101
111
  return __awaiter(this, void 0, void 0, function* () {
102
112
  return yield this.userRepository.findOne(id);
103
113
  });
104
114
  }
115
+ // 条件缓存 - 不缓存管理员用户
105
116
  getUserData(id) {
106
117
  return __awaiter(this, void 0, void 0, function* () {
107
118
  return yield this.userRepository.findOne(id);
108
119
  });
109
120
  }
121
+ // 批量获取用户
110
122
  getUsersBatch(ids) {
111
123
  return __awaiter(this, void 0, void 0, function* () {
112
124
  const keys = ids.map((id) => `user:${id}`);
113
125
  const cachedUsers = yield this.cacheService.mget(keys);
126
+ // 找出缓存中没有的用户
114
127
  const uncachedIds = [];
115
128
  const result = [];
116
129
  cachedUsers.forEach((user, index) => {
@@ -121,8 +134,10 @@ let UserService = class UserService {
121
134
  uncachedIds.push(ids[index]);
122
135
  }
123
136
  });
137
+ // 批量查询未缓存的用户
124
138
  if (uncachedIds.length > 0) {
125
139
  const newUsers = yield this.userRepository.findMany(uncachedIds);
140
+ // 批量设置缓存
126
141
  const cacheItems = newUsers.map((user) => ({
127
142
  key: `user:${user.id}`,
128
143
  value: user,
@@ -133,22 +148,26 @@ let UserService = class UserService {
133
148
  return result;
134
149
  });
135
150
  }
151
+ // 更新用户并缓存
136
152
  updateUser(id, data) {
137
153
  return __awaiter(this, void 0, void 0, function* () {
138
154
  const updatedUser = yield this.userRepository.save(Object.assign({ id }, data));
139
155
  return updatedUser;
140
156
  });
141
157
  }
158
+ // 删除用户并清除缓存
142
159
  deleteUser(id) {
143
160
  return __awaiter(this, void 0, void 0, function* () {
144
161
  yield this.userRepository.delete(id);
145
162
  });
146
163
  }
164
+ // 使用标签失效
147
165
  invalidateAllProfiles() {
148
166
  return __awaiter(this, void 0, void 0, function* () {
149
167
  console.log('清除所有用户资料缓存');
150
168
  });
151
169
  }
170
+ // 缓存大数据(测试压缩)
152
171
  cacheLargeData(id) {
153
172
  return __awaiter(this, void 0, void 0, function* () {
154
173
  const largeData = {
@@ -173,11 +192,13 @@ let UserService = class UserService {
173
192
  averageRating: (Math.random() * 5).toFixed(2),
174
193
  },
175
194
  };
195
+ // 这个数据会被自动压缩,因为大于 1KB
176
196
  yield this.cacheService.set(`user:${id}:large-data`, largeData, {
177
- ttl: 3600000,
197
+ ttl: 3600000, // 1小时
178
198
  });
179
199
  });
180
200
  }
201
+ // 获取大数据
181
202
  getLargeData(id) {
182
203
  return __awaiter(this, void 0, void 0, function* () {
183
204
  return yield this.cacheService.get(`user:${id}:large-data`);
@@ -188,7 +209,7 @@ exports.UserService = UserService;
188
209
  __decorate([
189
210
  (0, index_1.Cacheable)({
190
211
  key: (id) => `user:${id}:profile`,
191
- ttl: 600000,
212
+ ttl: 600000, // 10分钟
192
213
  dependencies: [new index_1.TagDependency(['user-profile'])],
193
214
  }),
194
215
  __metadata("design:type", Function),
@@ -235,18 +256,24 @@ exports.UserService = UserService = __decorate([
235
256
  __metadata("design:paramtypes", [index_1.CacheService,
236
257
  UserRepository])
237
258
  ], UserService);
259
+ /**
260
+ * 文章服务示例 - 展示依赖使用
261
+ */
238
262
  let PostService = class PostService {
239
263
  constructor(cacheService, postRepository) {
240
264
  this.cacheService = cacheService;
241
265
  this.postRepository = postRepository;
242
266
  }
267
+ // 使用数据库依赖 - 当用户表更新时,相关文章缓存会自动失效
243
268
  getPostsByAuthor(authorId) {
244
269
  return __awaiter(this, void 0, void 0, function* () {
245
270
  return yield this.postRepository.findByAuthor(authorId);
246
271
  });
247
272
  }
273
+ // 使用回调依赖 - 基于配置版本
248
274
  getFeaturedPosts() {
249
275
  return __awaiter(this, void 0, void 0, function* () {
276
+ // 模拟获取推荐文章
250
277
  console.log('[DB] 获取推荐文章');
251
278
  return Array(10)
252
279
  .fill(null)
@@ -261,6 +288,7 @@ let PostService = class PostService {
261
288
  }
262
289
  getConfigVersion() {
263
290
  return __awaiter(this, void 0, void 0, function* () {
291
+ // 模拟获取配置版本
264
292
  return '1.0.0';
265
293
  });
266
294
  }
@@ -269,7 +297,7 @@ exports.PostService = PostService;
269
297
  __decorate([
270
298
  (0, index_1.Cacheable)({
271
299
  key: (authorId) => `posts:by-author:${authorId}`,
272
- ttl: 600000,
300
+ ttl: 600000, // 10分钟
273
301
  dependencies: [
274
302
  new index_1.DbDependency('SELECT updated_at FROM users WHERE id = ?', (authorId) => [authorId]),
275
303
  ],
@@ -281,10 +309,11 @@ __decorate([
281
309
  __decorate([
282
310
  (0, index_1.Cacheable)({
283
311
  key: 'posts:featured',
284
- ttl: 1800000,
312
+ ttl: 1800000, // 30分钟
285
313
  dependencies: [
286
314
  new index_1.CallbackDependency(() => __awaiter(void 0, void 0, void 0, function* () {
287
- return yield 'v1.0.0';
315
+ // 检查配置版本,如果配置改变则失效缓存
316
+ return yield 'v1.0.0'; // 简化为固定值
288
317
  })),
289
318
  ],
290
319
  }),
@@ -297,10 +326,14 @@ exports.PostService = PostService = __decorate([
297
326
  __metadata("design:paramtypes", [index_1.CacheService,
298
327
  PostRepository])
299
328
  ], PostService);
329
+ /**
330
+ * 缓存统计和监控示例
331
+ */
300
332
  let CacheMonitoringService = class CacheMonitoringService {
301
333
  constructor(cacheService) {
302
334
  this.cacheService = cacheService;
303
335
  }
336
+ // 获取缓存统计信息
304
337
  getCacheStats() {
305
338
  const stats = this.cacheService.getStats();
306
339
  console.log('=== 缓存统计信息 ===');
@@ -317,13 +350,16 @@ let CacheMonitoringService = class CacheMonitoringService {
317
350
  }
318
351
  return stats;
319
352
  }
353
+ // 重置统计
320
354
  resetStats() {
321
355
  this.cacheService.resetStats();
322
356
  console.log('缓存统计已重置');
323
357
  }
358
+ // 定期监控
324
359
  startMonitoring(intervalMs = 60000) {
325
360
  setInterval(() => {
326
361
  const stats = this.getCacheStats();
362
+ // 如果命中率过低,发出警告
327
363
  if (stats.hitRate < 0.7) {
328
364
  console.warn(`⚠️ 缓存命中率过低: ${(stats.hitRate * 100).toFixed(2)}%`);
329
365
  }
@@ -336,38 +372,56 @@ exports.CacheMonitoringService = CacheMonitoringService = __decorate([
336
372
  (0, common_1.Injectable)(),
337
373
  __metadata("design:paramtypes", [index_1.CacheService])
338
374
  ], CacheMonitoringService);
375
+ /**
376
+ * 使用示例
377
+ */
339
378
  function demonstrateCacheUsage() {
340
379
  return __awaiter(this, void 0, void 0, function* () {
341
- const userService = new UserService(new index_1.CacheService({}, {}, {}, true, 1024), new UserRepository());
380
+ // 注意:在实际应用中,这些服务会通过依赖注入获得
381
+ const userService = new UserService(new index_1.CacheService(
382
+ // 这些参数在实际应用中会通过模块配置自动注入
383
+ {}, // CLS Provider
384
+ {}, // Memory Provider
385
+ {}, // Redis Provider
386
+ true, // 启用压缩
387
+ 1024), new UserRepository());
342
388
  const postService = new PostService(new index_1.CacheService({}, {}, {}, true, 1024), new PostRepository());
343
389
  const monitoringService = new CacheMonitoringService(new index_1.CacheService({}, {}, {}, true, 1024));
344
390
  console.log('🚀 开始缓存演示...\n');
345
391
  try {
392
+ // 1. 基础缓存演示
346
393
  console.log('1. 基础缓存使用:');
347
394
  const user1 = yield userService.getUser('1');
348
395
  console.log(`获取用户: ${user1.name}`);
396
+ // 第二次获取应该从缓存获取
349
397
  const user1Cached = yield userService.getUser('1');
350
398
  console.log(`从缓存获取用户: ${user1Cached.name}\n`);
399
+ // 2. 装饰器缓存演示
351
400
  console.log('2. 装饰器缓存:');
352
401
  const profile = yield userService.getUserProfile('2');
353
402
  console.log(`获取用户资料: ${profile.name}`);
354
403
  const profileCached = yield userService.getUserProfile('2');
355
404
  console.log(`从缓存获取用户资料: ${profileCached.name}\n`);
405
+ // 3. 批量操作演示
356
406
  console.log('3. 批量操作:');
357
407
  const users = yield userService.getUsersBatch(['1', '2', '3', '4', '5']);
358
408
  console.log(`批量获取 ${users.length} 个用户\n`);
409
+ // 4. 大数据压缩演示
359
410
  console.log('4. 大数据压缩:');
360
411
  yield userService.cacheLargeData('1');
361
412
  console.log('缓存大数据完成(应该自动压缩)');
362
413
  const largeData = yield userService.getLargeData('1');
363
414
  console.log(`获取大数据: 用户 ${largeData.user.name}, 文章数 ${largeData.posts.length}\n`);
415
+ // 5. 依赖系统演示
364
416
  console.log('5. 依赖系统:');
365
417
  const posts = yield postService.getPostsByAuthor('1');
366
418
  console.log(`获取作者文章: ${posts.length} 篇`);
367
419
  const featuredPosts = yield postService.getFeaturedPosts();
368
420
  console.log(`获取推荐文章: ${featuredPosts.length} 篇\n`);
421
+ // 6. 缓存统计
369
422
  console.log('6. 缓存统计:');
370
423
  monitoringService.getCacheStats();
424
+ // 7. 缓存失效演示
371
425
  console.log('\n7. 缓存失效:');
372
426
  yield userService.invalidateAllProfiles();
373
427
  console.log('已清除所有用户资料缓存');
package/cache/index.js CHANGED
@@ -1,14 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KeyGenerator = exports.DependencyManager = exports.CacheLayer = exports.TimeDependency = exports.TagDependency = exports.FileDependency = exports.DbDependency = exports.ChainDependency = exports.CallbackDependency = exports.REDIS_CLIENT = exports.BaseCacheProvider = exports.RedisCacheProvider = exports.MemoryCacheProvider = exports.ClsCacheProvider = exports.setCacheService = exports.getCacheService = exports.CachePut = exports.CacheEvict = exports.Cacheable = exports.CacheSerializationService = exports.CacheMetricsService = exports.CacheWarmupService = exports.CacheHealthChecker = exports.CacheService = exports.CACHE_COMPRESSION_THRESHOLD = exports.CACHE_COMPRESSION_ENABLED = exports.CACHE_SERVICE = exports.CacheModule = void 0;
4
+ // Module
4
5
  var cache_module_1 = require("./cache.module");
5
6
  Object.defineProperty(exports, "CacheModule", { enumerable: true, get: function () { return cache_module_1.CacheModule; } });
6
7
  Object.defineProperty(exports, "CACHE_SERVICE", { enumerable: true, get: function () { return cache_module_1.CACHE_SERVICE; } });
8
+ // Constants
7
9
  var cache_constants_1 = require("./cache.constants");
8
10
  Object.defineProperty(exports, "CACHE_COMPRESSION_ENABLED", { enumerable: true, get: function () { return cache_constants_1.CACHE_COMPRESSION_ENABLED; } });
9
11
  Object.defineProperty(exports, "CACHE_COMPRESSION_THRESHOLD", { enumerable: true, get: function () { return cache_constants_1.CACHE_COMPRESSION_THRESHOLD; } });
12
+ // Service
10
13
  var cache_service_1 = require("./cache.service");
11
14
  Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return cache_service_1.CacheService; } });
15
+ // Additional Services
12
16
  var cache_health_1 = require("./cache.health");
13
17
  Object.defineProperty(exports, "CacheHealthChecker", { enumerable: true, get: function () { return cache_health_1.CacheHealthChecker; } });
14
18
  var cache_warmup_service_1 = require("./cache.warmup.service");
@@ -17,12 +21,14 @@ var cache_metrics_service_1 = require("./cache-metrics.service");
17
21
  Object.defineProperty(exports, "CacheMetricsService", { enumerable: true, get: function () { return cache_metrics_service_1.CacheMetricsService; } });
18
22
  var cache_serialization_service_1 = require("./cache-serialization.service");
19
23
  Object.defineProperty(exports, "CacheSerializationService", { enumerable: true, get: function () { return cache_serialization_service_1.CacheSerializationService; } });
24
+ // Decorators
20
25
  var decorators_1 = require("./decorators");
21
26
  Object.defineProperty(exports, "Cacheable", { enumerable: true, get: function () { return decorators_1.Cacheable; } });
22
27
  Object.defineProperty(exports, "CacheEvict", { enumerable: true, get: function () { return decorators_1.CacheEvict; } });
23
28
  Object.defineProperty(exports, "CachePut", { enumerable: true, get: function () { return decorators_1.CachePut; } });
24
29
  Object.defineProperty(exports, "getCacheService", { enumerable: true, get: function () { return decorators_1.getCacheService; } });
25
30
  Object.defineProperty(exports, "setCacheService", { enumerable: true, get: function () { return decorators_1.setCacheService; } });
31
+ // Providers
26
32
  var providers_1 = require("./providers");
27
33
  Object.defineProperty(exports, "ClsCacheProvider", { enumerable: true, get: function () { return providers_1.ClsCacheProvider; } });
28
34
  Object.defineProperty(exports, "MemoryCacheProvider", { enumerable: true, get: function () { return providers_1.MemoryCacheProvider; } });
@@ -30,6 +36,7 @@ Object.defineProperty(exports, "RedisCacheProvider", { enumerable: true, get: fu
30
36
  Object.defineProperty(exports, "BaseCacheProvider", { enumerable: true, get: function () { return providers_1.BaseCacheProvider; } });
31
37
  var redis_cache_provider_1 = require("./providers/redis-cache.provider");
32
38
  Object.defineProperty(exports, "REDIS_CLIENT", { enumerable: true, get: function () { return redis_cache_provider_1.REDIS_CLIENT; } });
39
+ // Dependencies
33
40
  var dependencies_1 = require("./dependencies");
34
41
  Object.defineProperty(exports, "CallbackDependency", { enumerable: true, get: function () { return dependencies_1.CallbackDependency; } });
35
42
  Object.defineProperty(exports, "ChainDependency", { enumerable: true, get: function () { return dependencies_1.ChainDependency; } });
@@ -37,8 +44,10 @@ Object.defineProperty(exports, "DbDependency", { enumerable: true, get: function
37
44
  Object.defineProperty(exports, "FileDependency", { enumerable: true, get: function () { return dependencies_1.FileDependency; } });
38
45
  Object.defineProperty(exports, "TagDependency", { enumerable: true, get: function () { return dependencies_1.TagDependency; } });
39
46
  Object.defineProperty(exports, "TimeDependency", { enumerable: true, get: function () { return dependencies_1.TimeDependency; } });
47
+ // Interfaces
40
48
  var interfaces_1 = require("./interfaces");
41
49
  Object.defineProperty(exports, "CacheLayer", { enumerable: true, get: function () { return interfaces_1.CacheLayer; } });
50
+ // Utils (advanced usage)
42
51
  var utils_1 = require("./utils");
43
52
  Object.defineProperty(exports, "DependencyManager", { enumerable: true, get: function () { return utils_1.DependencyManager; } });
44
53
  Object.defineProperty(exports, "KeyGenerator", { enumerable: true, get: function () { return utils_1.KeyGenerator; } });
@@ -1,11 +1,64 @@
1
+ /**
2
+ * Cache dependency interface - similar to Yii2 cache dependency system
3
+ *
4
+ * A cache dependency represents a dependency relationship between cached data
5
+ * and some external state. When the external state changes, the cached data
6
+ * becomes invalid.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // Tag-based dependency
11
+ * new TagDependency(['user-list'])
12
+ *
13
+ * // Database-based dependency
14
+ * new DbDependency('SELECT MAX(updated_at) FROM users WHERE id = ?', [userId])
15
+ *
16
+ * // Callback-based dependency
17
+ * new CallbackDependency(() => ConfigService.get('app.version'))
18
+ * ```
19
+ */
1
20
  export interface CacheDependency {
21
+ /**
22
+ * Get a unique key that identifies this dependency
23
+ * This key is used to store the dependency state
24
+ *
25
+ * @returns Unique dependency key
26
+ */
2
27
  getKey(): string;
28
+ /**
29
+ * Get the current state/value of this dependency
30
+ * This value will be compared with stored state to detect changes
31
+ *
32
+ * @returns Current dependency data/state
33
+ */
3
34
  getData(): Promise<any>;
35
+ /**
36
+ * Check if the dependency has changed by comparing old data with current data
37
+ *
38
+ * @param oldData - Previously stored dependency data
39
+ * @returns true if dependency has changed, false otherwise
40
+ */
4
41
  isChanged(oldData: any): Promise<boolean>;
42
+ /**
43
+ * Reset/clear the dependency state
44
+ * Used when manually invalidating dependencies
45
+ */
5
46
  reset?(): Promise<void>;
6
47
  }
48
+ /**
49
+ * Serialized dependency data stored alongside cached values
50
+ */
7
51
  export interface DependencyData {
52
+ /**
53
+ * Dependency key
54
+ */
8
55
  key: string;
56
+ /**
57
+ * Dependency state snapshot at cache time
58
+ */
9
59
  data: any;
60
+ /**
61
+ * Timestamp when dependency was captured
62
+ */
10
63
  timestamp: number;
11
64
  }
@@ -1,32 +1,113 @@
1
1
  import type { CacheDependency } from './cache-dependency.interface';
2
+ /**
3
+ * Cache layer enum - defines the three-tier cache architecture
4
+ */
2
5
  export declare enum CacheLayer {
6
+ /** L1: Request-level cache (nestjs-cls) - fastest, scoped to request */
3
7
  CLS = "cls",
8
+ /** L2: Process-level cache (native Map) - fast, scoped to process */
4
9
  MEMORY = "memory",
10
+ /** L3: Distributed cache (Redis) - persistent, shared across processes */
5
11
  REDIS = "redis"
6
12
  }
13
+ /**
14
+ * Cache configuration options
15
+ */
7
16
  export interface CacheOptions {
17
+ /**
18
+ * Time to live in milliseconds
19
+ * @example 300_000 // 5 minutes
20
+ */
8
21
  ttl?: number;
22
+ /**
23
+ * Cache layers to use
24
+ * @default [CacheLayer.MEMORY, CacheLayer.REDIS]
25
+ */
9
26
  layers?: CacheLayer[];
27
+ /**
28
+ * Key prefix for namespacing
29
+ * @example 'user:' will result in keys like 'user:123'
30
+ */
10
31
  prefix?: string;
32
+ /**
33
+ * Condition function to determine if value should be cached
34
+ * @param args - Method arguments
35
+ * @returns true to cache, false to skip
36
+ */
11
37
  condition?: (...args: any[]) => boolean | Promise<boolean>;
38
+ /**
39
+ * Cache dependencies - cache will be invalidated when dependencies change
40
+ * Similar to Yii2 cache dependency system
41
+ */
12
42
  dependencies?: CacheDependency[];
43
+ /**
44
+ * Whether to backfill upper cache layers when value is found in lower layer
45
+ * @default true
46
+ */
13
47
  backfill?: boolean;
48
+ /**
49
+ * Namespace for grouping related cache keys
50
+ */
14
51
  namespace?: string;
15
52
  }
53
+ /**
54
+ * Options for cache decorator key generation
55
+ */
16
56
  export interface CacheKeyOptions {
57
+ /**
58
+ * Static key or key generator function
59
+ */
17
60
  key?: string | ((...args: any[]) => string);
61
+ /**
62
+ * Key prefix
63
+ */
18
64
  prefix?: string;
65
+ /**
66
+ * Whether to include all method arguments in key generation
67
+ * @default false
68
+ */
19
69
  includeAllArgs?: boolean;
20
70
  }
71
+ /**
72
+ * Options for @Cacheable decorator
73
+ */
21
74
  export interface CacheableOptions extends CacheOptions, CacheKeyOptions {
22
75
  }
76
+ /**
77
+ * Options for @CacheEvict decorator
78
+ */
23
79
  export interface CacheEvictOptions {
80
+ /**
81
+ * Keys to evict (can be static strings or generator functions)
82
+ */
24
83
  keys?: Array<string | ((...args: any[]) => string)>;
84
+ /**
85
+ * Patterns to match for eviction (supports wildcards)
86
+ * @example ['user:*', 'posts:list:*']
87
+ */
25
88
  patterns?: string[];
89
+ /**
90
+ * Tags to invalidate
91
+ */
26
92
  tags?: string[];
93
+ /**
94
+ * Cache layers to evict from
95
+ */
27
96
  layers?: CacheLayer[];
97
+ /**
98
+ * Condition to determine if eviction should occur
99
+ * @param args - Method arguments
100
+ * @param result - Method return value
101
+ */
28
102
  condition?: (...args: any[]) => boolean | Promise<boolean>;
103
+ /**
104
+ * Whether to evict before or after method execution
105
+ * @default 'after'
106
+ */
29
107
  timing?: 'before' | 'after';
30
108
  }
109
+ /**
110
+ * Options for @CachePut decorator
111
+ */
31
112
  export interface CachePutOptions extends CacheOptions, CacheKeyOptions {
32
113
  }
@@ -1,9 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CacheLayer = void 0;
4
+ /**
5
+ * Cache layer enum - defines the three-tier cache architecture
6
+ */
4
7
  var CacheLayer;
5
8
  (function (CacheLayer) {
9
+ /** L1: Request-level cache (nestjs-cls) - fastest, scoped to request */
6
10
  CacheLayer["CLS"] = "cls";
11
+ /** L2: Process-level cache (native Map) - fast, scoped to process */
7
12
  CacheLayer["MEMORY"] = "memory";
13
+ /** L3: Distributed cache (Redis) - persistent, shared across processes */
8
14
  CacheLayer["REDIS"] = "redis";
9
15
  })(CacheLayer || (exports.CacheLayer = CacheLayer = {}));
@@ -1,28 +1,106 @@
1
+ /**
2
+ * Base cache provider interface
3
+ * All cache providers (CLS, Memory, Redis) implement this interface
4
+ */
1
5
  export interface CacheProvider {
6
+ /**
7
+ * Get value from cache
8
+ *
9
+ * @param key - Cache key
10
+ * @returns Cached value or null if not found
11
+ */
2
12
  get<T>(key: string): Promise<T | null>;
13
+ /**
14
+ * Set value in cache
15
+ *
16
+ * @param key - Cache key
17
+ * @param value - Value to cache
18
+ * @param ttl - Time to live in milliseconds
19
+ */
3
20
  set<T>(key: string, value: T, ttl?: number): Promise<void>;
21
+ /**
22
+ * Delete value from cache
23
+ *
24
+ * @param key - Cache key or array of keys
25
+ */
4
26
  delete(key: string | string[]): Promise<void>;
27
+ /**
28
+ * Delete keys matching a pattern (supports wildcards)
29
+ *
30
+ * @param pattern - Pattern to match (e.g., 'user:*')
31
+ * @returns Number of keys deleted
32
+ */
5
33
  deletePattern?(pattern: string): Promise<number>;
34
+ /**
35
+ * Clear all cache entries
36
+ */
6
37
  clear(): Promise<void>;
38
+ /**
39
+ * Check if a key exists in cache
40
+ *
41
+ * @param key - Cache key
42
+ */
7
43
  has(key: string): Promise<boolean>;
44
+ /**
45
+ * Get multiple values at once
46
+ *
47
+ * @param keys - Array of cache keys
48
+ * @returns Array of values (null for missing keys)
49
+ */
8
50
  mget<T>(keys: string[]): Promise<(T | null)[]>;
51
+ /**
52
+ * Set multiple values at once
53
+ *
54
+ * @param items - Array of key-value pairs
55
+ * @param ttl - Time to live in milliseconds
56
+ */
9
57
  mset(items: Array<{
10
58
  key: string;
11
59
  value: any;
12
60
  }>, ttl?: number): Promise<void>;
61
+ /**
62
+ * Get provider name
63
+ */
13
64
  getName(): string;
14
65
  }
66
+ /**
67
+ * Cache statistics
68
+ */
15
69
  export interface CacheStats {
70
+ /**
71
+ * Total number of get operations
72
+ */
16
73
  totalGets: number;
74
+ /**
75
+ * Number of cache hits
76
+ */
17
77
  hits: number;
78
+ /**
79
+ * Number of cache misses
80
+ */
18
81
  misses: number;
82
+ /**
83
+ * Hit rate (hits / totalGets)
84
+ */
19
85
  hitRate: number;
86
+ /**
87
+ * Stats per layer
88
+ */
20
89
  byLayer: Record<string, {
21
90
  hits: number;
22
91
  misses: number;
23
92
  hitRate: number;
24
93
  }>;
94
+ /**
95
+ * Total number of set operations
96
+ */
25
97
  totalSets: number;
98
+ /**
99
+ * Total number of delete operations
100
+ */
26
101
  totalDeletes: number;
102
+ /**
103
+ * Total number of clear operations
104
+ */
27
105
  totalClears: number;
28
106
  }
@@ -1,4 +1,7 @@
1
1
  import type { CacheProvider } from '../interfaces/cache-provider.interface';
2
+ /**
3
+ * Base cache provider with common utility methods
4
+ */
2
5
  export declare abstract class BaseCacheProvider implements CacheProvider {
3
6
  abstract get<T>(key: string): Promise<T | null>;
4
7
  abstract set<T>(key: string, value: T, ttl?: number): Promise<void>;
@@ -7,10 +10,21 @@ export declare abstract class BaseCacheProvider implements CacheProvider {
7
10
  abstract clear(): Promise<void>;
8
11
  abstract has(key: string): Promise<boolean>;
9
12
  abstract getName(): string;
13
+ /**
14
+ * Get multiple values at once
15
+ * Default implementation - can be overridden for better performance
16
+ */
10
17
  mget<T>(keys: string[]): Promise<(T | null)[]>;
18
+ /**
19
+ * Set multiple values at once
20
+ * Default implementation - can be overridden for better performance
21
+ */
11
22
  mset(items: Array<{
12
23
  key: string;
13
24
  value: any;
14
25
  }>, ttl?: number): Promise<void>;
26
+ /**
27
+ * Convert wildcard pattern to RegExp
28
+ */
15
29
  protected patternToRegex(pattern: string): RegExp;
16
30
  }