@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:
|
|
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:
|
|
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.
|
|
3
|
+
"version": "5.6.0",
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@
|
|
5
|
+
"@keyv/redis": "^5.1.6",
|
|
6
|
+
"@tc-libs/helper": "5.6.0",
|
|
6
7
|
"cache-manager": "^6.4.1",
|
|
7
|
-
"
|
|
8
|
+
"keyv": "^5.6.0",
|
|
8
9
|
"tslib": "^2.8.1"
|
|
9
10
|
},
|
|
10
11
|
"type": "commonjs",
|
package/src/app-cache.module.js
CHANGED
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AppCacheModule = void 0;
|
|
4
|
-
const
|
|
4
|
+
const redis_1 = require("@keyv/redis");
|
|
5
5
|
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
6
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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":"
|
|
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;
|