@nestjs-redisx/cache 1.0.1 → 1.0.2

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":"AAAA;;;;;GAKG;AAGH,OAAO,kBAAkB,CAAC;AAK1B;;;GAGG;AACH,UAAU,sBAAsB;IAC9B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,EACH,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;KAC5C,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,QAAQ,CAAC,CAAC,EACR,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;QAC3C,GAAG,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACjD,GACA,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,UAAU,yBAAyB;IACjC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC9C;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAMD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,sBAAsB,GAAG,IAAI,CAErF;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAEjF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,sBAAsB,GAAG,IAAI,CAE/D;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAErD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAE3C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAE5C;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAE1D;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;;OAGG;IACH,GAAG,CAAC,EAAE;QACJ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,cAAmB,GAAG,eAAe,CA+DpE"}
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":"AAAA;;;GAGG;AAGH,OAAO,EAAgB,YAAY,EAAa,MAAM,qBAAqB,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,mBAAmB,EAAE,MAAM,8DAA8D,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AAM3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAK7D,UAAU,eAAe;IACvB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC9E;AAKD,UAAU,KAAK;IACb,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACnE,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;IACxC,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpC,GAAG,IAAI,IAAI,CAAC;CACb;AAED,UAAU,eAAe;IACvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,KAAK,CAAC;CACnG;AAED,qBACa,YAAa,YAAW,aAAa;IAWxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAlBhE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGM,MAAM,EAAE,YAAY,EAClB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,aAAa,EACjB,QAAQ,EAAE,mBAAmB,EACvC,QAAQ,EAAE,SAAS,EACjB,UAAU,EAAE,WAAW,EACd,OAAO,EAAE,mBAAmB,EACrB,OAAO,CAAC,EAAE,eAAe,YAAA,EACzB,OAAO,CAAC,EAAE,eAAe,YAAA;IAU3E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IA+DtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD3E,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,CAAC,CAAC;IAsExG;;;;;;;;OAQG;YACW,gBAAgB;IAmCxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BrC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgE3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBlC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB3C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB/C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB5C,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAyDpD,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CnG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBjC,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAY/B,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmC3D;;;;;;;;OAQG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IA0C5B;;;OAGG;IACH,OAAO,CAAC,cAAc;CAGvB"}
@@ -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
11
  readonly version = "0.1.0";
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;AAczE,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,WAAW;IAC3B,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
@@ -116,20 +116,19 @@ function Cached(options = {}) {
116
116
  return originalMethod.apply(this, args);
117
117
  }
118
118
  const key = buildCacheKey(this, propertyKey.toString(), args, options);
119
+ const tags = typeof options.tags === "function" ? options.tags(...args) : options.tags;
119
120
  try {
120
- const cached = await cacheService.get(key);
121
- if (cached !== null) {
122
- return cached;
123
- }
121
+ return await cacheService.getOrSet(key, () => originalMethod.apply(this, args), {
122
+ ttl: options.ttl,
123
+ tags,
124
+ strategy: options.strategy,
125
+ swr: options.swr,
126
+ unless: options.unless ? (result) => options.unless(result, ...args) : void 0
127
+ });
124
128
  } 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;
129
+ logger.error(`@Cached: getOrSet error for key ${key}:`, error);
130
+ return originalMethod.apply(this, args);
130
131
  }
131
- await cacheResult(cacheService, key, result, options, args);
132
- return result;
133
132
  };
134
133
  Object.defineProperty(descriptor.value, "name", {
135
134
  value: originalMethod.name,
@@ -161,6 +160,10 @@ function enrichWithContext(key, options) {
161
160
  for (const ctxKey of contextKeys) {
162
161
  const value = pluginOpts.contextProvider.get(ctxKey);
163
162
  if (value !== void 0 && value !== null) {
163
+ if (typeof value === "object") {
164
+ logger.warn(`Context key "${ctxKey}" has object value, skipping (use primitives for context keys)`);
165
+ continue;
166
+ }
164
167
  contextMap.set(ctxKey, String(value));
165
168
  }
166
169
  }
@@ -169,6 +172,10 @@ function enrichWithContext(key, options) {
169
172
  if (!contextMap.has(name)) {
170
173
  const value = pluginOpts.contextProvider.get(name);
171
174
  if (value !== void 0 && value !== null) {
175
+ if (typeof value === "object") {
176
+ logger.warn(`varyBy key "${name}" has object value, skipping (use primitives for varyBy keys)`);
177
+ continue;
178
+ }
172
179
  contextMap.set(name, String(value));
173
180
  }
174
181
  }
@@ -183,7 +190,7 @@ function sanitizeForKey(value) {
183
190
  return String(value).replace(/[^a-zA-Z0-9\-_]/g, "_");
184
191
  }
185
192
  function interpolateKey(template, args) {
186
- return template.replace(/\{(\d+)\}/g, (match, index) => {
193
+ return template.replace(/\{(\d+)}/g, (match, index) => {
187
194
  const argIndex = parseInt(index, 10);
188
195
  if (argIndex < args.length) {
189
196
  return serializeArg(args[argIndex]);
@@ -200,38 +207,43 @@ function serializeArg(arg) {
200
207
  }
201
208
  if (typeof arg === "object") {
202
209
  try {
203
- return JSON.stringify(arg);
210
+ return stableStringify(arg);
204
211
  } catch {
205
212
  return "object";
206
213
  }
207
214
  }
208
215
  return "unknown";
209
216
  }
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
- });
217
+ function stableStringify(value) {
218
+ if (value === null || value === void 0) {
219
+ return "null";
220
+ }
221
+ if (typeof value === "function" || typeof value === "symbol") {
222
+ return "null";
223
+ }
224
+ if (typeof value !== "object") {
225
+ if (typeof value === "bigint") {
226
+ return String(value);
231
227
  }
232
- } catch (error) {
233
- logger.error(`@Cached: Failed to cache result for key ${key}:`, error);
228
+ return JSON.stringify(value);
229
+ }
230
+ if (Array.isArray(value)) {
231
+ return "[" + value.map((item) => item === void 0 || typeof item === "function" || typeof item === "symbol" ? "null" : stableStringify(item)).join(",") + "]";
234
232
  }
233
+ if (value instanceof Date) {
234
+ return JSON.stringify(value);
235
+ }
236
+ const obj = value;
237
+ const keys = Object.keys(obj).sort();
238
+ const parts = [];
239
+ for (const key of keys) {
240
+ const v = obj[key];
241
+ if (v === void 0 || typeof v === "function" || typeof v === "symbol") {
242
+ continue;
243
+ }
244
+ parts.push(JSON.stringify(key) + ":" + stableStringify(v));
245
+ }
246
+ return "{" + parts.join(",") + "}";
235
247
  }
236
248
 
237
249
  // src/invalidation/infrastructure/decorators/invalidate-on.decorator.ts
@@ -873,7 +885,7 @@ var CacheService = class {
873
885
  async getOrSet(key, loader, options = {}) {
874
886
  const normalizedKey = this.validateAndNormalizeKey(key);
875
887
  const enrichedKey = this.enrichKeyWithContext(normalizedKey, options.varyBy);
876
- const swrEnabled = this.swrEnabled && (options.swr?.enabled ?? true);
888
+ const swrEnabled = options.swr?.enabled ?? this.swrEnabled;
877
889
  if (swrEnabled) {
878
890
  const swrEntry = await this.l2Store.getSwr(enrichedKey);
879
891
  if (swrEntry) {
@@ -885,11 +897,14 @@ var CacheService = class {
885
897
  enrichedKey,
886
898
  loader,
887
899
  async (freshValue) => {
888
- await this.set(enrichedKey, freshValue, {
889
- ttl: options.ttl,
890
- tags: options.tags,
891
- strategy: options.strategy
892
- });
900
+ const staleTime = options.swr?.staleTime ?? this.options.swr?.defaultStaleTime ?? 60;
901
+ const ttl = options.ttl ?? this.options.l2?.defaultTtl ?? 3600;
902
+ const swrEntryNew = this.swrManager.createSwrEntry(freshValue, ttl, staleTime);
903
+ await this.l2Store.setSwr(enrichedKey, swrEntryNew);
904
+ if (this.l1Enabled) {
905
+ const entry = CacheEntry.create(freshValue, ttl);
906
+ await this.l1Store.set(enrichedKey, entry, this.options.l1?.ttl);
907
+ }
893
908
  },
894
909
  (error) => {
895
910
  this.logger.error(`SWR revalidation failed for key ${enrichedKey}:`, error);
@@ -900,10 +915,12 @@ var CacheService = class {
900
915
  }
901
916
  }
902
917
  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);
918
+ if (!options.unless?.(value)) {
919
+ const staleTime = options.swr?.staleTime ?? this.options.swr?.defaultStaleTime ?? 60;
920
+ const ttl = options.ttl ?? this.options.l2?.defaultTtl ?? 3600;
921
+ const swrEntryNew = this.swrManager.createSwrEntry(value, ttl, staleTime);
922
+ await this.l2Store.setSwr(enrichedKey, swrEntryNew);
923
+ }
907
924
  return value;
908
925
  }
909
926
  const cached = await this.get(enrichedKey);
@@ -928,19 +945,23 @@ var CacheService = class {
928
945
  this.metrics?.incrementCounter("redisx_cache_stampede_prevented_total");
929
946
  return result.value;
930
947
  }
931
- await this.set(key, result.value, {
948
+ if (!options.unless?.(result.value)) {
949
+ await this.set(key, result.value, {
950
+ ttl: options.ttl,
951
+ tags: options.tags,
952
+ strategy: options.strategy
953
+ });
954
+ }
955
+ return result.value;
956
+ }
957
+ const value = await loader();
958
+ if (!options.unless?.(value)) {
959
+ await this.set(key, value, {
932
960
  ttl: options.ttl,
933
961
  tags: options.tags,
934
962
  strategy: options.strategy
935
963
  });
936
- return result.value;
937
964
  }
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
965
  return value;
945
966
  }
946
967
  async delete(key) {
@@ -983,11 +1004,12 @@ var CacheService = class {
983
1004
  if (normalizedKeys.length === 0) {
984
1005
  return 0;
985
1006
  }
986
- let deletedCount = 0;
1007
+ const deleted = new Array(normalizedKeys.length).fill(false);
987
1008
  if (this.l1Enabled) {
988
- for (const key of normalizedKeys) {
989
- const deleted = await this.l1Store.delete(key);
990
- if (deleted) deletedCount++;
1009
+ for (let i = 0; i < normalizedKeys.length; i++) {
1010
+ if (await this.l1Store.delete(normalizedKeys[i])) {
1011
+ deleted[i] = true;
1012
+ }
991
1013
  }
992
1014
  }
993
1015
  if (this.l2Enabled && normalizedKeys.length > 0) {
@@ -997,17 +1019,16 @@ var CacheService = class {
997
1019
  pipeline.del(fullKey);
998
1020
  }
999
1021
  const results = await pipeline.exec();
1000
- let l2Count = 0;
1001
1022
  if (results) {
1002
- for (const [error, result] of results) {
1023
+ for (let i = 0; i < results.length; i++) {
1024
+ const [error, result] = results[i];
1003
1025
  if (!error && typeof result === "number" && result > 0) {
1004
- l2Count++;
1026
+ deleted[i] = true;
1005
1027
  }
1006
1028
  }
1007
1029
  }
1008
- deletedCount = Math.max(deletedCount, l2Count);
1009
1030
  }
1010
- return deletedCount;
1031
+ return deleted.filter(Boolean).length;
1011
1032
  } catch (error) {
1012
1033
  throw new CacheError(`Failed to delete multiple keys: ${error.message}`, core.ErrorCode.CACHE_DELETE_FAILED, error);
1013
1034
  }
@@ -1144,10 +1165,10 @@ var CacheService = class {
1144
1165
  const maxTtl = this.options.l2?.maxTtl ?? 86400;
1145
1166
  const defaultTtl = this.options.l2?.defaultTtl ?? 3600;
1146
1167
  const cacheEntries = entries.map(({ key, value, ttl }) => {
1147
- const entryTtl = ttl ?? defaultTtl;
1168
+ const entryTtl = Math.min(ttl ?? defaultTtl, maxTtl);
1148
1169
  return {
1149
1170
  key: this.enrichKeyWithContext(this.validateAndNormalizeKey(key)),
1150
- entry: CacheEntry.create(value, Math.min(entryTtl, maxTtl)),
1171
+ entry: CacheEntry.create(value, entryTtl),
1151
1172
  ttl: entryTtl
1152
1173
  };
1153
1174
  });
@@ -1272,6 +1293,10 @@ var CacheService = class {
1272
1293
  for (const ctxKey of contextKeys) {
1273
1294
  const value = contextProvider.get(ctxKey);
1274
1295
  if (value !== void 0 && value !== null) {
1296
+ if (typeof value === "object") {
1297
+ this.logger.warn(`Context key "${ctxKey}" has object value, skipping (use primitives for context keys)`);
1298
+ continue;
1299
+ }
1275
1300
  contextMap.set(ctxKey, String(value));
1276
1301
  }
1277
1302
  }
@@ -1509,12 +1534,6 @@ var L1MemoryStoreAdapter = class {
1509
1534
  }
1510
1535
  // eslint-disable-next-line @typescript-eslint/require-await
1511
1536
  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
1537
  return this.cache.size;
1519
1538
  }
1520
1539
  moveToFront(node) {
@@ -2712,9 +2731,6 @@ var SwrManagerService = class {
2712
2731
  async delete(_key) {
2713
2732
  }
2714
2733
  isStale(entry) {
2715
- if (!this.enabled) {
2716
- return false;
2717
- }
2718
2734
  const now = Date.now();
2719
2735
  return now > entry.staleAt;
2720
2736
  }
@@ -3047,33 +3063,63 @@ LuaScriptLoader = __decorateClass([
3047
3063
  ], LuaScriptLoader);
3048
3064
 
3049
3065
  // src/cache.plugin.ts
3050
- var CachePlugin = class {
3066
+ var CachePlugin = class _CachePlugin {
3051
3067
  constructor(options = {}) {
3052
3068
  this.options = options;
3053
3069
  }
3054
3070
  name = "cache";
3055
3071
  version = "0.1.0";
3056
3072
  description = "Advanced caching with L1+L2, anti-stampede, SWR, and tag invalidation";
3073
+ asyncOptions;
3074
+ /**
3075
+ * Create a CachePlugin with async configuration from DI.
3076
+ *
3077
+ * @example
3078
+ * ```typescript
3079
+ * CachePlugin.registerAsync({
3080
+ * imports: [ConfigModule],
3081
+ * inject: [ConfigService],
3082
+ * useFactory: (config: ConfigService) => ({
3083
+ * l1: { maxSize: config.get('CACHE_L1_MAX_SIZE', 1000) },
3084
+ * swr: { enabled: config.get('CACHE_SWR_ENABLED', false) },
3085
+ * }),
3086
+ * })
3087
+ * ```
3088
+ */
3089
+ static registerAsync(asyncOptions) {
3090
+ const plugin = new _CachePlugin();
3091
+ plugin.asyncOptions = asyncOptions;
3092
+ return plugin;
3093
+ }
3094
+ static mergeDefaults(options) {
3095
+ return {
3096
+ l1: { ...DEFAULT_CACHE_CONFIG.l1, ...options.l1 },
3097
+ l2: { ...DEFAULT_CACHE_CONFIG.l2, ...options.l2 },
3098
+ stampede: { ...DEFAULT_CACHE_CONFIG.stampede, ...options.stampede },
3099
+ swr: { ...DEFAULT_CACHE_CONFIG.swr, ...options.swr },
3100
+ tags: { ...DEFAULT_CACHE_CONFIG.tags, ...options.tags },
3101
+ warmup: { ...DEFAULT_CACHE_CONFIG.warmup, ...options.warmup },
3102
+ keys: { ...DEFAULT_CACHE_CONFIG.keys, ...options.keys },
3103
+ invalidation: { ...DEFAULT_CACHE_CONFIG.invalidation, ...options.invalidation }
3104
+ };
3105
+ }
3106
+ getImports() {
3107
+ return this.asyncOptions?.imports ?? [];
3108
+ }
3057
3109
  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
- }
3110
+ const optionsProvider = this.asyncOptions ? {
3111
+ provide: CACHE_PLUGIN_OPTIONS,
3112
+ useFactory: async (...args) => {
3113
+ const userOptions = await this.asyncOptions.useFactory(...args);
3114
+ return _CachePlugin.mergeDefaults(userOptions);
3115
+ },
3116
+ inject: this.asyncOptions.inject || []
3117
+ } : {
3118
+ provide: CACHE_PLUGIN_OPTIONS,
3119
+ useValue: _CachePlugin.mergeDefaults(this.options)
3070
3120
  };
3071
3121
  return [
3072
- // Configuration
3073
- {
3074
- provide: CACHE_PLUGIN_OPTIONS,
3075
- useValue: config
3076
- },
3122
+ optionsProvider,
3077
3123
  // Domain services
3078
3124
  {
3079
3125
  provide: SERIALIZER,
@@ -3131,9 +3177,9 @@ var CachePlugin = class {
3131
3177
  // Factory for registering static invalidation rules
3132
3178
  {
3133
3179
  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));
3180
+ useFactory: (registry, config) => {
3181
+ if (config.invalidation?.rules && config.invalidation.rules.length > 0) {
3182
+ const rules = config.invalidation.rules.map((ruleProps) => InvalidationRule.create(ruleProps));
3137
3183
  registry.registerMany(rules);
3138
3184
  }
3139
3185
  return true;