@tc-libs/app-cache 5.5.1 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,7 @@ AppCacheModule.register(
14
14
  true,
15
15
  {
16
16
  enabled: true,
17
- ttl: 60,
17
+ ttl: 60_000, // millisecondi, come in cache-manager 7
18
18
  server: {
19
19
  host: '127.0.0.1',
20
20
  port: 6379,
@@ -34,7 +34,7 @@ AppCacheModule.registerAsync(
34
34
  inject: [ConfigService],
35
35
  useFactory: async (config: ConfigService) => ({
36
36
  enabled: true,
37
- ttl: 60,
37
+ ttl: 60_000,
38
38
  server: {
39
39
  host: config.getOrThrow<string>('REDIS_HOST'),
40
40
  port: config.getOrThrow<number>('REDIS_PORT'),
@@ -72,6 +72,11 @@ this.cache.saveToCache(key, result, options);
72
72
  - La chiave cache viene derivata da `functionName`, filtro e opzioni tramite hash SHA1 Base64.
73
73
  - La cache viene usata solo se il modulo e abilitato e l'operazione passa `options.caching.enabled`.
74
74
  - Se vuoi una chiave custom puoi passare `options.caching.key`.
75
+ - Con `enabled` a `true` Redis è un'istanza Keyv con l'adapter `@keyv/redis`, passata in `stores`: `@nestjs/cache-manager` 12 ignora l'opzione `store`. Più processi con lo stesso Redis condividono la cache.
76
+ - `ttl` (del modulo e di `options.caching.ttl`) è in millisecondi, come in cache-manager 7.
77
+ - `prefix` (facoltativo) è il prefisso delle chiavi in Redis, `prefix::chiave`: separa applicazioni e ambienti che usano lo stesso Redis. Per esempio il nome dell'app con l'ambiente.
78
+ - Se Redis non risponde, le letture sono un miss e le scritture si perdono, senza errori per il chiamante: l'errore resta nel log come warning e il client ritenta la connessione, con un intervallo che cresce fino a 10 secondi.
79
+ - `registerAsync` passa `inject` anche alla factory della cache Redis.
75
80
 
76
81
  ## Export pubblici
77
82
 
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@tc-libs/app-cache",
3
- "version": "5.5.1",
3
+ "version": "5.6.0",
4
4
  "dependencies": {
5
- "@tc-libs/helper": "5.5.1",
5
+ "@keyv/redis": "^5.1.6",
6
+ "@tc-libs/helper": "5.6.0",
6
7
  "cache-manager": "^6.4.1",
7
- "cache-manager-redis-store": "^3.0.1",
8
+ "keyv": "^5.6.0",
8
9
  "tslib": "^2.8.1"
9
10
  },
10
11
  "type": "commonjs",
@@ -1,19 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AppCacheModule = void 0;
4
- const tslib_1 = require("tslib");
4
+ const redis_1 = require("@keyv/redis");
5
5
  const cache_manager_1 = require("@nestjs/cache-manager");
6
- const cache_manager_redis_store_1 = tslib_1.__importDefault(require("cache-manager-redis-store"));
6
+ const common_1 = require("@nestjs/common");
7
7
  const app_cache_service_1 = require("./app-cache.service");
8
8
  const app_cache_module_options_1 = require("./app-cache.module.options");
9
+ const logger = new common_1.Logger('AppCacheModule');
10
+ // @nestjs/cache-manager 12 (cache-manager 7) legge gli store da `stores` e ignorava `store: redisStore`: con la cache
11
+ // attiva i dati restavano in memoria, una copia per processo (TLC-712). Redis entra come istanza Keyv con l'adapter
12
+ // @keyv/redis. Un Redis che non risponde non ferma l'app: l'adapter emette l'errore, che resta nel log, e risponde come
13
+ // una cache vuota. I tentativi di riconnessione rallentano fino a uno ogni 10 secondi: con il default del client erano
14
+ // due al secondo, ognuno con il suo warning.
15
+ function redisStores({ server, prefix }) {
16
+ const store = (0, redis_1.createKeyv)({
17
+ url: `redis://${server.host}:${server.port}`,
18
+ socket: {
19
+ reconnectStrategy: (retries) => Math.min(retries * 500, 10_000),
20
+ },
21
+ }, { throwOnConnectError: false, namespace: prefix });
22
+ store.on('error', (error) => logger.warn(`Redis ${server.host}:${server.port}: ${error instanceof Error ? error.message : String(error)}`));
23
+ return [store];
24
+ }
9
25
  class AppCacheModule {
10
26
  static register(enabled, options, isGlobal) {
11
27
  const imports = [];
12
28
  if (enabled) {
13
29
  imports.push(cache_manager_1.CacheModule.register({
14
- store: cache_manager_redis_store_1.default,
15
- host: options.server.host,
16
- port: options.server.port,
30
+ stores: redisStores(options),
17
31
  ttl: options.ttl,
18
32
  isGlobal: true,
19
33
  }));
@@ -40,12 +54,12 @@ class AppCacheModule {
40
54
  if (enabled) {
41
55
  imports.push(cache_manager_1.CacheModule.registerAsync({
42
56
  imports: options.imports,
57
+ // Senza inject la factory riceveva zero argomenti (per esempio niente ConfigService) e l'avvio falliva
58
+ inject: options.inject,
43
59
  useFactory: async (...args) => {
44
60
  const appCacheOptions = await options.useFactory(...args);
45
61
  return {
46
- store: cache_manager_redis_store_1.default,
47
- host: appCacheOptions.server.host,
48
- port: appCacheOptions.server.port,
62
+ stores: redisStores(appCacheOptions),
49
63
  ttl: appCacheOptions.ttl,
50
64
  isGlobal: true,
51
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app-cache.module.js","sourceRoot":"","sources":["../../../../packages/app-cache/src/app-cache.module.ts"],"names":[],"mappings":";;;;AAAA,yDAAoD;AAEpD,kGAAmD;AACnD,2DAAsD;AACtD,yEAGoC;AAEpC,MAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CACb,OAAgB,EAChB,OAA8B,EAC9B,QAAkB;QAElB,MAAM,OAAO,GAKP,EAAE,CAAC;QAET,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CACV,2BAAW,CAAC,QAAQ,CAAC;gBACnB,KAAK,EAAE,mCAAU;gBACjB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBACzB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBACzB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,2BAAW,CAAC,QAAQ,CAAC;gBACnB,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,mDAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBACxD,mCAAe;aAChB;YACD,OAAO,EAAE,CAAC,mCAAe,CAAC;YAC1B,WAAW,EAAE,EAAE;YACf,OAAO;YACP,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,aAAa,CAClB,OAAgB,EAChB,OAAmC,EACnC,QAAkB;QAElB,MAAM,OAAO,GAKP,EAAE,CAAC;QAET,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CACV,2BAAW,CAAC,aAAa,CAAC;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;oBAC5B,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC1D,OAAO;wBACL,KAAK,EAAE,mCAAU;wBACjB,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;wBACjC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;wBACjC,GAAG,EAAE,eAAe,CAAC,GAAG;wBACxB,QAAQ,EAAE,IAAI;qBACf,CAAC;gBACJ,CAAC;aACF,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,2BAAW,CAAC,QAAQ,CAAC;gBACnB,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;YACjD,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,mDAAwB;oBACjC,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB;gBACD,mCAAe;aAChB;YACD,OAAO,EAAE,CAAC,mCAAe,CAAC;YAC1B,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;CACF;AA9FD,wCA8FC"}
1
+ {"version":3,"file":"app-cache.module.js","sourceRoot":"","sources":["../../../../packages/app-cache/src/app-cache.module.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export interface AppCacheModuleOptions {
8
8
  port: number;
9
9
  };
10
10
  enabled: boolean;
11
+ prefix?: string;
11
12
  }
12
13
  type AppCacheModuleAsyncOptions = Pick<ModuleMetadata, 'imports'> & Pick<FactoryProvider<AppCacheModuleOptions>, 'useFactory' | 'inject'>;
13
14
  export default AppCacheModuleAsyncOptions;