@nestjs-redisx/cache 1.0.1 → 1.0.3

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.
@@ -24,6 +24,7 @@ interface IDecoratorCacheService {
24
24
  enabled?: boolean;
25
25
  staleTime?: number;
26
26
  };
27
+ unless?: (result: unknown) => boolean;
27
28
  }): Promise<T>;
28
29
  invalidateTags(tags: string[]): Promise<number>;
29
30
  deleteMany(keys: string[]): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"cached.decorator.d.ts","sourceRoot":"","sources":["../../../../src/cache/api/decorators/cached.decorator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cached.decorator.d.ts","sourceRoot":"","sources":["../../../../src/cache/api/decorators/cached.decorator.ts"],"names":[],"mappings":"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"}
@@ -33,9 +33,10 @@ export interface IL1CacheStore {
33
33
  */
34
34
  has(key: string): Promise<boolean>;
35
35
  /**
36
- * Gets current size of L1 cache.
36
+ * Gets approximate size of L1 cache.
37
+ * May include expired entries not yet evicted by get/has/set.
37
38
  *
38
- * @returns Number of items in cache
39
+ * @returns Approximate number of items in cache
39
40
  */
40
41
  size(): Promise<number>;
41
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"l1-cache-store.port.d.ts","sourceRoot":"","sources":["../../../../src/cache/application/ports/l1-cache-store.port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEnD;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnC;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D"}
1
+ {"version":3,"file":"l1-cache-store.port.d.ts","sourceRoot":"","sources":["../../../../src/cache/application/ports/l1-cache-store.port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEnD;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../../../src/cache/application/services/cache.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../../../src/cache/application/services/cache.service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"l1-memory-store.adapter.d.ts","sourceRoot":"","sources":["../../../../src/cache/infrastructure/adapters/l1-memory-store.adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAWvE,qBACa,oBAAqB,YAAW,aAAa;IAYtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAIA,OAAO,EAAE,mBAAmB;IAQzC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IA2BlD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CtE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAY7B,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,QAAQ;IAsBhB,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAO3D"}
1
+ {"version":3,"file":"l1-memory-store.adapter.d.ts","sourceRoot":"","sources":["../../../../src/cache/infrastructure/adapters/l1-memory-store.adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAWvE,qBACa,oBAAqB,YAAW,aAAa;IAYtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAIA,OAAO,EAAE,mBAAmB;IAQzC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IA2BlD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CtE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAM7B,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,QAAQ;IAsBhB,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAO3D"}
@@ -2,15 +2,34 @@
2
2
  * Cache plugin for NestJS RedisX.
3
3
  * Provides L1+L2 caching with anti-stampede, SWR, and tag invalidation.
4
4
  */
5
- import { Provider } from '@nestjs/common';
6
- import { IRedisXPlugin } from '@nestjs-redisx/core';
5
+ import { DynamicModule, ForwardReference, Provider, Type } from '@nestjs/common';
6
+ import { IRedisXPlugin, IPluginAsyncOptions } from '@nestjs-redisx/core';
7
7
  import { ICachePluginOptions } from './shared/types';
8
8
  export declare class CachePlugin implements IRedisXPlugin {
9
9
  private readonly options;
10
10
  readonly name = "cache";
11
- readonly version = "0.1.0";
11
+ readonly version: string;
12
12
  readonly description = "Advanced caching with L1+L2, anti-stampede, SWR, and tag invalidation";
13
+ private asyncOptions?;
13
14
  constructor(options?: ICachePluginOptions);
15
+ /**
16
+ * Create a CachePlugin with async configuration from DI.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * CachePlugin.registerAsync({
21
+ * imports: [ConfigModule],
22
+ * inject: [ConfigService],
23
+ * useFactory: (config: ConfigService) => ({
24
+ * l1: { maxSize: config.get('CACHE_L1_MAX_SIZE', 1000) },
25
+ * swr: { enabled: config.get('CACHE_SWR_ENABLED', false) },
26
+ * }),
27
+ * })
28
+ * ```
29
+ */
30
+ static registerAsync(asyncOptions: IPluginAsyncOptions<ICachePluginOptions>): CachePlugin;
31
+ private static mergeDefaults;
32
+ getImports(): Array<Type<unknown> | DynamicModule | ForwardReference>;
14
33
  getProviders(): Provider[];
15
34
  getExports(): Array<string | symbol | Provider>;
16
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache.plugin.d.ts","sourceRoot":"","sources":["../src/cache.plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAcpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAMrD,qBAAa,WAAY,YAAW,aAAa;IAKnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,WAAW,2EAA2E;gBAElE,OAAO,GAAE,mBAAwB;IAE9D,YAAY,IAAI,QAAQ,EAAE;IAsG1B,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;CAGhD"}
1
+ {"version":3,"file":"cache.plugin.d.ts","sourceRoot":"","sources":["../src/cache.plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAezE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAMrD,qBAAa,WAAY,YAAW,aAAa;IAOnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAW;IACnC,QAAQ,CAAC,WAAW,2EAA2E;IAE/F,OAAO,CAAC,YAAY,CAAC,CAA2C;gBAEnC,OAAO,GAAE,mBAAwB;IAE9D;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,GAAG,WAAW;IAMzF,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG,gBAAgB,CAAC;IAIrE,YAAY,IAAI,QAAQ,EAAE;IAkG1B,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;CAGhD"}
package/dist/index.js CHANGED
@@ -25,6 +25,9 @@ var __decorateClass = (decorators, target, key, kind) => {
25
25
  };
26
26
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
27
27
 
28
+ // package.json
29
+ var version = "1.0.3";
30
+
28
31
  // src/shared/constants/index.ts
29
32
  var CACHE_PLUGIN_OPTIONS = /* @__PURE__ */ Symbol.for("CACHE_PLUGIN_OPTIONS");
30
33
  var CACHE_SERVICE = /* @__PURE__ */ Symbol.for("CACHE_SERVICE");
@@ -116,20 +119,19 @@ function Cached(options = {}) {
116
119
  return originalMethod.apply(this, args);
117
120
  }
118
121
  const key = buildCacheKey(this, propertyKey.toString(), args, options);
122
+ const tags = typeof options.tags === "function" ? options.tags(...args) : options.tags;
119
123
  try {
120
- const cached = await cacheService.get(key);
121
- if (cached !== null) {
122
- return cached;
123
- }
124
+ return await cacheService.getOrSet(key, () => originalMethod.apply(this, args), {
125
+ ttl: options.ttl,
126
+ tags,
127
+ strategy: options.strategy,
128
+ swr: options.swr,
129
+ unless: options.unless ? (result) => options.unless(result, ...args) : void 0
130
+ });
124
131
  } catch (error) {
125
- logger.error(`@Cached: Cache get error for key ${key}:`, error);
126
- }
127
- const result = await originalMethod.apply(this, args);
128
- if (options.unless?.(result, ...args)) {
129
- return result;
132
+ logger.error(`@Cached: getOrSet error for key ${key}:`, error);
133
+ return originalMethod.apply(this, args);
130
134
  }
131
- await cacheResult(cacheService, key, result, options, args);
132
- return result;
133
135
  };
134
136
  Object.defineProperty(descriptor.value, "name", {
135
137
  value: originalMethod.name,
@@ -161,6 +163,10 @@ function enrichWithContext(key, options) {
161
163
  for (const ctxKey of contextKeys) {
162
164
  const value = pluginOpts.contextProvider.get(ctxKey);
163
165
  if (value !== void 0 && value !== null) {
166
+ if (typeof value === "object") {
167
+ logger.warn(`Context key "${ctxKey}" has object value, skipping (use primitives for context keys)`);
168
+ continue;
169
+ }
164
170
  contextMap.set(ctxKey, String(value));
165
171
  }
166
172
  }
@@ -169,6 +175,10 @@ function enrichWithContext(key, options) {
169
175
  if (!contextMap.has(name)) {
170
176
  const value = pluginOpts.contextProvider.get(name);
171
177
  if (value !== void 0 && value !== null) {
178
+ if (typeof value === "object") {
179
+ logger.warn(`varyBy key "${name}" has object value, skipping (use primitives for varyBy keys)`);
180
+ continue;
181
+ }
172
182
  contextMap.set(name, String(value));
173
183
  }
174
184
  }
@@ -183,7 +193,7 @@ function sanitizeForKey(value) {
183
193
  return String(value).replace(/[^a-zA-Z0-9\-_]/g, "_");
184
194
  }
185
195
  function interpolateKey(template, args) {
186
- return template.replace(/\{(\d+)\}/g, (match, index) => {
196
+ return template.replace(/\{(\d+)}/g, (match, index) => {
187
197
  const argIndex = parseInt(index, 10);
188
198
  if (argIndex < args.length) {
189
199
  return serializeArg(args[argIndex]);
@@ -200,38 +210,43 @@ function serializeArg(arg) {
200
210
  }
201
211
  if (typeof arg === "object") {
202
212
  try {
203
- return JSON.stringify(arg);
213
+ return stableStringify(arg);
204
214
  } catch {
205
215
  return "object";
206
216
  }
207
217
  }
208
218
  return "unknown";
209
219
  }
210
- async function cacheResult(cacheService, key, value, options, args) {
211
- try {
212
- const tags = typeof options.tags === "function" ? options.tags(...args) : options.tags;
213
- if (options.swr?.enabled) {
214
- await cacheService.getOrSet(
215
- key,
216
- // eslint-disable-next-line @typescript-eslint/require-await
217
- async () => value,
218
- {
219
- ttl: options.ttl,
220
- tags,
221
- strategy: options.strategy,
222
- swr: options.swr
223
- }
224
- );
225
- } else {
226
- await cacheService.set(key, value, {
227
- ttl: options.ttl,
228
- tags,
229
- strategy: options.strategy
230
- });
220
+ function stableStringify(value) {
221
+ if (value === null || value === void 0) {
222
+ return "null";
223
+ }
224
+ if (typeof value === "function" || typeof value === "symbol") {
225
+ return "null";
226
+ }
227
+ if (typeof value !== "object") {
228
+ if (typeof value === "bigint") {
229
+ return String(value);
230
+ }
231
+ return JSON.stringify(value);
232
+ }
233
+ if (Array.isArray(value)) {
234
+ return "[" + value.map((item) => item === void 0 || typeof item === "function" || typeof item === "symbol" ? "null" : stableStringify(item)).join(",") + "]";
235
+ }
236
+ if (value instanceof Date) {
237
+ return JSON.stringify(value);
238
+ }
239
+ const obj = value;
240
+ const keys = Object.keys(obj).sort();
241
+ const parts = [];
242
+ for (const key of keys) {
243
+ const v = obj[key];
244
+ if (v === void 0 || typeof v === "function" || typeof v === "symbol") {
245
+ continue;
231
246
  }
232
- } catch (error) {
233
- logger.error(`@Cached: Failed to cache result for key ${key}:`, error);
247
+ parts.push(JSON.stringify(key) + ":" + stableStringify(v));
234
248
  }
249
+ return "{" + parts.join(",") + "}";
235
250
  }
236
251
 
237
252
  // src/invalidation/infrastructure/decorators/invalidate-on.decorator.ts
@@ -873,7 +888,7 @@ var CacheService = class {
873
888
  async getOrSet(key, loader, options = {}) {
874
889
  const normalizedKey = this.validateAndNormalizeKey(key);
875
890
  const enrichedKey = this.enrichKeyWithContext(normalizedKey, options.varyBy);
876
- const swrEnabled = this.swrEnabled && (options.swr?.enabled ?? true);
891
+ const swrEnabled = options.swr?.enabled ?? this.swrEnabled;
877
892
  if (swrEnabled) {
878
893
  const swrEntry = await this.l2Store.getSwr(enrichedKey);
879
894
  if (swrEntry) {
@@ -885,11 +900,14 @@ var CacheService = class {
885
900
  enrichedKey,
886
901
  loader,
887
902
  async (freshValue) => {
888
- await this.set(enrichedKey, freshValue, {
889
- ttl: options.ttl,
890
- tags: options.tags,
891
- strategy: options.strategy
892
- });
903
+ const staleTime = options.swr?.staleTime ?? this.options.swr?.defaultStaleTime ?? 60;
904
+ const ttl = options.ttl ?? this.options.l2?.defaultTtl ?? 3600;
905
+ const swrEntryNew = this.swrManager.createSwrEntry(freshValue, ttl, staleTime);
906
+ await this.l2Store.setSwr(enrichedKey, swrEntryNew);
907
+ if (this.l1Enabled) {
908
+ const entry = CacheEntry.create(freshValue, ttl);
909
+ await this.l1Store.set(enrichedKey, entry, this.options.l1?.ttl);
910
+ }
893
911
  },
894
912
  (error) => {
895
913
  this.logger.error(`SWR revalidation failed for key ${enrichedKey}:`, error);
@@ -900,10 +918,12 @@ var CacheService = class {
900
918
  }
901
919
  }
902
920
  const value = await this.loadWithStampede(enrichedKey, loader, options);
903
- const staleTime = options.swr?.staleTime ?? this.options.swr?.defaultStaleTime ?? 60;
904
- const ttl = options.ttl ?? this.options.l2?.defaultTtl ?? 3600;
905
- const swrEntryNew = this.swrManager.createSwrEntry(value, ttl, staleTime);
906
- await this.l2Store.setSwr(enrichedKey, swrEntryNew);
921
+ if (!options.unless?.(value)) {
922
+ const staleTime = options.swr?.staleTime ?? this.options.swr?.defaultStaleTime ?? 60;
923
+ const ttl = options.ttl ?? this.options.l2?.defaultTtl ?? 3600;
924
+ const swrEntryNew = this.swrManager.createSwrEntry(value, ttl, staleTime);
925
+ await this.l2Store.setSwr(enrichedKey, swrEntryNew);
926
+ }
907
927
  return value;
908
928
  }
909
929
  const cached = await this.get(enrichedKey);
@@ -928,19 +948,23 @@ var CacheService = class {
928
948
  this.metrics?.incrementCounter("redisx_cache_stampede_prevented_total");
929
949
  return result.value;
930
950
  }
931
- await this.set(key, result.value, {
951
+ if (!options.unless?.(result.value)) {
952
+ await this.set(key, result.value, {
953
+ ttl: options.ttl,
954
+ tags: options.tags,
955
+ strategy: options.strategy
956
+ });
957
+ }
958
+ return result.value;
959
+ }
960
+ const value = await loader();
961
+ if (!options.unless?.(value)) {
962
+ await this.set(key, value, {
932
963
  ttl: options.ttl,
933
964
  tags: options.tags,
934
965
  strategy: options.strategy
935
966
  });
936
- return result.value;
937
967
  }
938
- const value = await loader();
939
- await this.set(key, value, {
940
- ttl: options.ttl,
941
- tags: options.tags,
942
- strategy: options.strategy
943
- });
944
968
  return value;
945
969
  }
946
970
  async delete(key) {
@@ -983,11 +1007,12 @@ var CacheService = class {
983
1007
  if (normalizedKeys.length === 0) {
984
1008
  return 0;
985
1009
  }
986
- let deletedCount = 0;
1010
+ const deleted = new Array(normalizedKeys.length).fill(false);
987
1011
  if (this.l1Enabled) {
988
- for (const key of normalizedKeys) {
989
- const deleted = await this.l1Store.delete(key);
990
- if (deleted) deletedCount++;
1012
+ for (let i = 0; i < normalizedKeys.length; i++) {
1013
+ if (await this.l1Store.delete(normalizedKeys[i])) {
1014
+ deleted[i] = true;
1015
+ }
991
1016
  }
992
1017
  }
993
1018
  if (this.l2Enabled && normalizedKeys.length > 0) {
@@ -997,17 +1022,16 @@ var CacheService = class {
997
1022
  pipeline.del(fullKey);
998
1023
  }
999
1024
  const results = await pipeline.exec();
1000
- let l2Count = 0;
1001
1025
  if (results) {
1002
- for (const [error, result] of results) {
1026
+ for (let i = 0; i < results.length; i++) {
1027
+ const [error, result] = results[i];
1003
1028
  if (!error && typeof result === "number" && result > 0) {
1004
- l2Count++;
1029
+ deleted[i] = true;
1005
1030
  }
1006
1031
  }
1007
1032
  }
1008
- deletedCount = Math.max(deletedCount, l2Count);
1009
1033
  }
1010
- return deletedCount;
1034
+ return deleted.filter(Boolean).length;
1011
1035
  } catch (error) {
1012
1036
  throw new CacheError(`Failed to delete multiple keys: ${error.message}`, core.ErrorCode.CACHE_DELETE_FAILED, error);
1013
1037
  }
@@ -1144,10 +1168,10 @@ var CacheService = class {
1144
1168
  const maxTtl = this.options.l2?.maxTtl ?? 86400;
1145
1169
  const defaultTtl = this.options.l2?.defaultTtl ?? 3600;
1146
1170
  const cacheEntries = entries.map(({ key, value, ttl }) => {
1147
- const entryTtl = ttl ?? defaultTtl;
1171
+ const entryTtl = Math.min(ttl ?? defaultTtl, maxTtl);
1148
1172
  return {
1149
1173
  key: this.enrichKeyWithContext(this.validateAndNormalizeKey(key)),
1150
- entry: CacheEntry.create(value, Math.min(entryTtl, maxTtl)),
1174
+ entry: CacheEntry.create(value, entryTtl),
1151
1175
  ttl: entryTtl
1152
1176
  };
1153
1177
  });
@@ -1272,6 +1296,10 @@ var CacheService = class {
1272
1296
  for (const ctxKey of contextKeys) {
1273
1297
  const value = contextProvider.get(ctxKey);
1274
1298
  if (value !== void 0 && value !== null) {
1299
+ if (typeof value === "object") {
1300
+ this.logger.warn(`Context key "${ctxKey}" has object value, skipping (use primitives for context keys)`);
1301
+ continue;
1302
+ }
1275
1303
  contextMap.set(ctxKey, String(value));
1276
1304
  }
1277
1305
  }
@@ -1509,12 +1537,6 @@ var L1MemoryStoreAdapter = class {
1509
1537
  }
1510
1538
  // eslint-disable-next-line @typescript-eslint/require-await
1511
1539
  async size() {
1512
- const now = Date.now();
1513
- for (const [key, node] of this.cache.entries()) {
1514
- if (now > node.expiresAt) {
1515
- void this.delete(key);
1516
- }
1517
- }
1518
1540
  return this.cache.size;
1519
1541
  }
1520
1542
  moveToFront(node) {
@@ -2712,9 +2734,6 @@ var SwrManagerService = class {
2712
2734
  async delete(_key) {
2713
2735
  }
2714
2736
  isStale(entry) {
2715
- if (!this.enabled) {
2716
- return false;
2717
- }
2718
2737
  const now = Date.now();
2719
2738
  return now > entry.staleAt;
2720
2739
  }
@@ -3047,33 +3066,63 @@ LuaScriptLoader = __decorateClass([
3047
3066
  ], LuaScriptLoader);
3048
3067
 
3049
3068
  // src/cache.plugin.ts
3050
- var CachePlugin = class {
3069
+ var CachePlugin = class _CachePlugin {
3051
3070
  constructor(options = {}) {
3052
3071
  this.options = options;
3053
3072
  }
3054
3073
  name = "cache";
3055
- version = "0.1.0";
3074
+ version = version;
3056
3075
  description = "Advanced caching with L1+L2, anti-stampede, SWR, and tag invalidation";
3076
+ asyncOptions;
3077
+ /**
3078
+ * Create a CachePlugin with async configuration from DI.
3079
+ *
3080
+ * @example
3081
+ * ```typescript
3082
+ * CachePlugin.registerAsync({
3083
+ * imports: [ConfigModule],
3084
+ * inject: [ConfigService],
3085
+ * useFactory: (config: ConfigService) => ({
3086
+ * l1: { maxSize: config.get('CACHE_L1_MAX_SIZE', 1000) },
3087
+ * swr: { enabled: config.get('CACHE_SWR_ENABLED', false) },
3088
+ * }),
3089
+ * })
3090
+ * ```
3091
+ */
3092
+ static registerAsync(asyncOptions) {
3093
+ const plugin = new _CachePlugin();
3094
+ plugin.asyncOptions = asyncOptions;
3095
+ return plugin;
3096
+ }
3097
+ static mergeDefaults(options) {
3098
+ return {
3099
+ l1: { ...DEFAULT_CACHE_CONFIG.l1, ...options.l1 },
3100
+ l2: { ...DEFAULT_CACHE_CONFIG.l2, ...options.l2 },
3101
+ stampede: { ...DEFAULT_CACHE_CONFIG.stampede, ...options.stampede },
3102
+ swr: { ...DEFAULT_CACHE_CONFIG.swr, ...options.swr },
3103
+ tags: { ...DEFAULT_CACHE_CONFIG.tags, ...options.tags },
3104
+ warmup: { ...DEFAULT_CACHE_CONFIG.warmup, ...options.warmup },
3105
+ keys: { ...DEFAULT_CACHE_CONFIG.keys, ...options.keys },
3106
+ invalidation: { ...DEFAULT_CACHE_CONFIG.invalidation, ...options.invalidation }
3107
+ };
3108
+ }
3109
+ getImports() {
3110
+ return this.asyncOptions?.imports ?? [];
3111
+ }
3057
3112
  getProviders() {
3058
- const config = {
3059
- l1: { ...DEFAULT_CACHE_CONFIG.l1, ...this.options.l1 },
3060
- l2: { ...DEFAULT_CACHE_CONFIG.l2, ...this.options.l2 },
3061
- stampede: { ...DEFAULT_CACHE_CONFIG.stampede, ...this.options.stampede },
3062
- swr: { ...DEFAULT_CACHE_CONFIG.swr, ...this.options.swr },
3063
- tags: { ...DEFAULT_CACHE_CONFIG.tags, ...this.options.tags },
3064
- warmup: { ...DEFAULT_CACHE_CONFIG.warmup, ...this.options.warmup },
3065
- keys: { ...DEFAULT_CACHE_CONFIG.keys, ...this.options.keys },
3066
- invalidation: {
3067
- ...DEFAULT_CACHE_CONFIG.invalidation,
3068
- ...this.options.invalidation
3069
- }
3113
+ const optionsProvider = this.asyncOptions ? {
3114
+ provide: CACHE_PLUGIN_OPTIONS,
3115
+ useFactory: async (...args) => {
3116
+ const userOptions = await this.asyncOptions.useFactory(...args);
3117
+ return _CachePlugin.mergeDefaults(userOptions);
3118
+ },
3119
+ inject: this.asyncOptions.inject || []
3120
+ } : {
3121
+ provide: CACHE_PLUGIN_OPTIONS,
3122
+ useValue: _CachePlugin.mergeDefaults(this.options)
3070
3123
  };
3071
3124
  return [
3072
- // Configuration
3073
- {
3074
- provide: CACHE_PLUGIN_OPTIONS,
3075
- useValue: config
3076
- },
3125
+ optionsProvider,
3077
3126
  // Domain services
3078
3127
  {
3079
3128
  provide: SERIALIZER,
@@ -3131,9 +3180,9 @@ var CachePlugin = class {
3131
3180
  // Factory for registering static invalidation rules
3132
3181
  {
3133
3182
  provide: INVALIDATION_RULES_INIT,
3134
- useFactory: (registry, config2) => {
3135
- if (config2.invalidation?.rules && config2.invalidation.rules.length > 0) {
3136
- const rules = config2.invalidation.rules.map((ruleProps) => InvalidationRule.create(ruleProps));
3183
+ useFactory: (registry, config) => {
3184
+ if (config.invalidation?.rules && config.invalidation.rules.length > 0) {
3185
+ const rules = config.invalidation.rules.map((ruleProps) => InvalidationRule.create(ruleProps));
3137
3186
  registry.registerMany(rules);
3138
3187
  }
3139
3188
  return true;
@@ -3999,8 +4048,8 @@ var KeyBuilder = class _KeyBuilder {
3999
4048
  * @param version - Version value (e.g., 'v1', 'v2')
4000
4049
  * @returns This builder for chaining
4001
4050
  */
4002
- version(version) {
4003
- return this.segment(version);
4051
+ version(version2) {
4052
+ return this.segment(version2);
4004
4053
  }
4005
4054
  /**
4006
4055
  * Adds a segment to the key.