@nestjs-redisx/cache 1.0.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/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/cache/api/decorators/cached.decorator.d.ts +152 -0
- package/dist/cache/api/decorators/cached.decorator.d.ts.map +1 -0
- package/dist/cache/api/decorators/invalidate-tags.decorator.d.ts +44 -0
- package/dist/cache/api/decorators/invalidate-tags.decorator.d.ts.map +1 -0
- package/dist/cache/application/ports/cache-service.port.d.ts +120 -0
- package/dist/cache/application/ports/cache-service.port.d.ts.map +1 -0
- package/dist/cache/application/ports/l1-cache-store.port.d.ts +56 -0
- package/dist/cache/application/ports/l1-cache-store.port.d.ts.map +1 -0
- package/dist/cache/application/ports/l2-cache-store.port.d.ts +98 -0
- package/dist/cache/application/ports/l2-cache-store.port.d.ts.map +1 -0
- package/dist/cache/application/services/cache-decorator-initializer.service.d.ts +25 -0
- package/dist/cache/application/services/cache-decorator-initializer.service.d.ts.map +1 -0
- package/dist/cache/application/services/cache.service.d.ts +106 -0
- package/dist/cache/application/services/cache.service.d.ts.map +1 -0
- package/dist/cache/application/services/warmup.service.d.ts +25 -0
- package/dist/cache/application/services/warmup.service.d.ts.map +1 -0
- package/dist/cache/domain/services/serializer.service.d.ts +29 -0
- package/dist/cache/domain/services/serializer.service.d.ts.map +1 -0
- package/dist/cache/domain/value-objects/cache-entry.vo.d.ts +69 -0
- package/dist/cache/domain/value-objects/cache-entry.vo.d.ts.map +1 -0
- package/dist/cache/domain/value-objects/cache-key.vo.d.ts +45 -0
- package/dist/cache/domain/value-objects/cache-key.vo.d.ts.map +1 -0
- package/dist/cache/domain/value-objects/tag.vo.d.ts +36 -0
- package/dist/cache/domain/value-objects/tag.vo.d.ts.map +1 -0
- package/dist/cache/domain/value-objects/tags.vo.d.ts +57 -0
- package/dist/cache/domain/value-objects/tags.vo.d.ts.map +1 -0
- package/dist/cache/domain/value-objects/ttl.vo.d.ts +58 -0
- package/dist/cache/domain/value-objects/ttl.vo.d.ts.map +1 -0
- package/dist/cache/infrastructure/adapters/l1-memory-store.adapter.d.ts +36 -0
- package/dist/cache/infrastructure/adapters/l1-memory-store.adapter.d.ts.map +1 -0
- package/dist/cache/infrastructure/adapters/l2-redis-store.adapter.d.ts +41 -0
- package/dist/cache/infrastructure/adapters/l2-redis-store.adapter.d.ts.map +1 -0
- package/dist/cache.plugin.d.ts +17 -0
- package/dist/cache.plugin.d.ts.map +1 -0
- package/dist/cache.service.d.ts +234 -0
- package/dist/cache.service.d.ts.map +1 -0
- package/dist/decorators/cache-evict.decorator.d.ts +97 -0
- package/dist/decorators/cache-evict.decorator.d.ts.map +1 -0
- package/dist/decorators/cache-put.decorator.d.ts +95 -0
- package/dist/decorators/cache-put.decorator.d.ts.map +1 -0
- package/dist/decorators/cache.interceptor.d.ts +63 -0
- package/dist/decorators/cache.interceptor.d.ts.map +1 -0
- package/dist/decorators/cacheable.decorator.d.ts +88 -0
- package/dist/decorators/cacheable.decorator.d.ts.map +1 -0
- package/dist/decorators/key-generator.util.d.ts +69 -0
- package/dist/decorators/key-generator.util.d.ts.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4199 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4152 -0
- package/dist/index.mjs.map +1 -0
- package/dist/invalidation/application/ports/event-invalidation.port.d.ts +28 -0
- package/dist/invalidation/application/ports/event-invalidation.port.d.ts.map +1 -0
- package/dist/invalidation/application/ports/invalidation-registry.port.d.ts +36 -0
- package/dist/invalidation/application/ports/invalidation-registry.port.d.ts.map +1 -0
- package/dist/invalidation/application/services/event-invalidation.service.d.ts +30 -0
- package/dist/invalidation/application/services/event-invalidation.service.d.ts.map +1 -0
- package/dist/invalidation/application/services/invalidation-registry.service.d.ts +17 -0
- package/dist/invalidation/application/services/invalidation-registry.service.d.ts.map +1 -0
- package/dist/invalidation/domain/entities/invalidation-rule.entity.d.ts +60 -0
- package/dist/invalidation/domain/entities/invalidation-rule.entity.d.ts.map +1 -0
- package/dist/invalidation/domain/value-objects/event-pattern.vo.d.ts +27 -0
- package/dist/invalidation/domain/value-objects/event-pattern.vo.d.ts.map +1 -0
- package/dist/invalidation/domain/value-objects/tag-template.vo.d.ts +34 -0
- package/dist/invalidation/domain/value-objects/tag-template.vo.d.ts.map +1 -0
- package/dist/invalidation/infrastructure/adapters/amqp-event-source.adapter.d.ts +51 -0
- package/dist/invalidation/infrastructure/adapters/amqp-event-source.adapter.d.ts.map +1 -0
- package/dist/invalidation/infrastructure/decorators/invalidate-on.decorator.d.ts +69 -0
- package/dist/invalidation/infrastructure/decorators/invalidate-on.decorator.d.ts.map +1 -0
- package/dist/key-builder.d.ts +199 -0
- package/dist/key-builder.d.ts.map +1 -0
- package/dist/serializers/index.d.ts +19 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/json.serializer.d.ts +51 -0
- package/dist/serializers/json.serializer.d.ts.map +1 -0
- package/dist/serializers/msgpack.serializer.d.ts +67 -0
- package/dist/serializers/msgpack.serializer.d.ts.map +1 -0
- package/dist/serializers/serializer.interface.d.ts +36 -0
- package/dist/serializers/serializer.interface.d.ts.map +1 -0
- package/dist/shared/constants/index.d.ts +73 -0
- package/dist/shared/constants/index.d.ts.map +1 -0
- package/dist/shared/errors/index.d.ts +46 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/types/context-provider.interface.d.ts +58 -0
- package/dist/shared/types/context-provider.interface.d.ts.map +1 -0
- package/dist/shared/types/index.d.ts +259 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/stampede/application/ports/stampede-protection.port.d.ts +33 -0
- package/dist/stampede/application/ports/stampede-protection.port.d.ts.map +1 -0
- package/dist/stampede/infrastructure/stampede-protection.service.d.ts +30 -0
- package/dist/stampede/infrastructure/stampede-protection.service.d.ts.map +1 -0
- package/dist/strategies/eviction-strategy.interface.d.ts +39 -0
- package/dist/strategies/eviction-strategy.interface.d.ts.map +1 -0
- package/dist/strategies/fifo.strategy.d.ts +86 -0
- package/dist/strategies/fifo.strategy.d.ts.map +1 -0
- package/dist/strategies/index.d.ts +19 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/lfu.strategy.d.ts +87 -0
- package/dist/strategies/lfu.strategy.d.ts.map +1 -0
- package/dist/strategies/lru.strategy.d.ts +78 -0
- package/dist/strategies/lru.strategy.d.ts.map +1 -0
- package/dist/swr/application/ports/swr-manager.port.d.ts +83 -0
- package/dist/swr/application/ports/swr-manager.port.d.ts.map +1 -0
- package/dist/swr/infrastructure/swr-manager.service.d.ts +30 -0
- package/dist/swr/infrastructure/swr-manager.service.d.ts.map +1 -0
- package/dist/tags/application/ports/tag-index.port.d.ts +55 -0
- package/dist/tags/application/ports/tag-index.port.d.ts.map +1 -0
- package/dist/tags/infrastructure/repositories/tag-index.repository.d.ts +37 -0
- package/dist/tags/infrastructure/repositories/tag-index.repository.d.ts.map +1 -0
- package/dist/tags/infrastructure/scripts/lua-scripts.d.ts +25 -0
- package/dist/tags/infrastructure/scripts/lua-scripts.d.ts.map +1 -0
- package/dist/tags/infrastructure/services/lua-script-loader.service.d.ts +44 -0
- package/dist/tags/infrastructure/services/lua-script-loader.service.d.ts.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON serializer for cache values.
|
|
3
|
+
*
|
|
4
|
+
* Uses native JSON.stringify/parse for serialization.
|
|
5
|
+
* Best for human-readable data and compatibility.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const serializer = new JsonSerializer();
|
|
10
|
+
*
|
|
11
|
+
* const data = { id: 1, name: 'John' };
|
|
12
|
+
* const serialized = serializer.serialize(data);
|
|
13
|
+
* // '{"id":1,"name":"John"}'
|
|
14
|
+
*
|
|
15
|
+
* const deserialized = serializer.deserialize<User>(serialized);
|
|
16
|
+
* // { id: 1, name: 'John' }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { ISerializer } from './serializer.interface';
|
|
20
|
+
export declare class JsonSerializer implements ISerializer {
|
|
21
|
+
/**
|
|
22
|
+
* Serializes value to JSON string.
|
|
23
|
+
*
|
|
24
|
+
* @param value - Value to serialize
|
|
25
|
+
* @returns JSON string
|
|
26
|
+
* @throws SerializationError if serialization fails
|
|
27
|
+
*/
|
|
28
|
+
serialize<T>(value: T): string;
|
|
29
|
+
/**
|
|
30
|
+
* Deserializes JSON string back to value.
|
|
31
|
+
*
|
|
32
|
+
* @param data - JSON string or buffer
|
|
33
|
+
* @returns Deserialized value
|
|
34
|
+
* @throws SerializationError if deserialization fails
|
|
35
|
+
*/
|
|
36
|
+
deserialize<T>(data: string | Buffer): T;
|
|
37
|
+
/**
|
|
38
|
+
* Safely tries to deserialize, returns null on error.
|
|
39
|
+
*
|
|
40
|
+
* @param data - JSON string or buffer
|
|
41
|
+
* @returns Deserialized value or null
|
|
42
|
+
*/
|
|
43
|
+
tryDeserialize<T>(data: string | Buffer): T | null;
|
|
44
|
+
/**
|
|
45
|
+
* Gets content type for JSON.
|
|
46
|
+
*
|
|
47
|
+
* @returns Content type string
|
|
48
|
+
*/
|
|
49
|
+
getContentType(): string;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=json.serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.serializer.d.ts","sourceRoot":"","sources":["../../src/serializers/json.serializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,qBAAa,cAAe,YAAW,WAAW;IAChD;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAQ9B;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC;IASxC;;;;;OAKG;IACH,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI;IAQlD;;;;OAIG;IACH,cAAc,IAAI,MAAM;CAGzB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessagePack serializer for cache values.
|
|
3
|
+
*
|
|
4
|
+
* Uses msgpackr for binary serialization.
|
|
5
|
+
* More compact and faster than JSON, but requires msgpackr package.
|
|
6
|
+
*
|
|
7
|
+
* Install: npm install msgpackr
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const serializer = new MsgpackSerializer();
|
|
12
|
+
*
|
|
13
|
+
* const data = { id: 1, name: 'John', tags: ['user', 'active'] };
|
|
14
|
+
* const serialized = serializer.serialize(data);
|
|
15
|
+
* // Buffer<...> (binary data, ~40% smaller than JSON)
|
|
16
|
+
*
|
|
17
|
+
* const deserialized = serializer.deserialize<User>(serialized);
|
|
18
|
+
* // { id: 1, name: 'John', tags: ['user', 'active'] }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { ISerializer } from './serializer.interface';
|
|
22
|
+
export declare class MsgpackSerializer implements ISerializer {
|
|
23
|
+
private encoder;
|
|
24
|
+
private decoder;
|
|
25
|
+
constructor();
|
|
26
|
+
/**
|
|
27
|
+
* Serializes value to MessagePack buffer.
|
|
28
|
+
*
|
|
29
|
+
* @param value - Value to serialize
|
|
30
|
+
* @returns MessagePack buffer
|
|
31
|
+
* @throws SerializationError if serialization fails
|
|
32
|
+
*/
|
|
33
|
+
serialize<T>(value: T): Buffer;
|
|
34
|
+
/**
|
|
35
|
+
* Deserializes MessagePack buffer back to value.
|
|
36
|
+
*
|
|
37
|
+
* @param data - MessagePack buffer or string
|
|
38
|
+
* @returns Deserialized value
|
|
39
|
+
* @throws SerializationError if deserialization fails
|
|
40
|
+
*/
|
|
41
|
+
deserialize<T>(data: string | Buffer): T;
|
|
42
|
+
/**
|
|
43
|
+
* Safely tries to deserialize, returns null on error.
|
|
44
|
+
*
|
|
45
|
+
* @param data - MessagePack buffer or string
|
|
46
|
+
* @returns Deserialized value or null
|
|
47
|
+
*/
|
|
48
|
+
tryDeserialize<T>(data: string | Buffer): T | null;
|
|
49
|
+
/**
|
|
50
|
+
* Gets content type for MessagePack.
|
|
51
|
+
*
|
|
52
|
+
* @returns Content type string
|
|
53
|
+
*/
|
|
54
|
+
getContentType(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Compares serialized size with JSON.
|
|
57
|
+
*
|
|
58
|
+
* @param value - Value to compare
|
|
59
|
+
* @returns Object with sizes and compression ratio
|
|
60
|
+
*/
|
|
61
|
+
compareWithJson<T>(value: T): {
|
|
62
|
+
jsonSize: number;
|
|
63
|
+
msgpackSize: number;
|
|
64
|
+
compressionRatio: number;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=msgpack.serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msgpack.serializer.d.ts","sourceRoot":"","sources":["../../src/serializers/msgpack.serializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAiBrD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAkB;;IAmBjC;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAQ9B;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC;IASxC;;;;;OAKG;IACH,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI;IAQlD;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;;OAKG;IACH,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B;CAUF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializer interface for cache value serialization.
|
|
3
|
+
* Defines how values are converted to/from storage format.
|
|
4
|
+
*/
|
|
5
|
+
export interface ISerializer {
|
|
6
|
+
/**
|
|
7
|
+
* Serializes a value to string or Buffer.
|
|
8
|
+
*
|
|
9
|
+
* @param value - Value to serialize
|
|
10
|
+
* @returns Serialized data
|
|
11
|
+
* @throws Error if serialization fails
|
|
12
|
+
*/
|
|
13
|
+
serialize<T>(value: T): string | Buffer;
|
|
14
|
+
/**
|
|
15
|
+
* Deserializes data back to original value.
|
|
16
|
+
*
|
|
17
|
+
* @param data - Serialized data
|
|
18
|
+
* @returns Deserialized value
|
|
19
|
+
* @throws Error if deserialization fails
|
|
20
|
+
*/
|
|
21
|
+
deserialize<T>(data: string | Buffer): T;
|
|
22
|
+
/**
|
|
23
|
+
* Safely tries to deserialize, returns null on error.
|
|
24
|
+
*
|
|
25
|
+
* @param data - Serialized data
|
|
26
|
+
* @returns Deserialized value or null
|
|
27
|
+
*/
|
|
28
|
+
tryDeserialize<T>(data: string | Buffer): T | null;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the content type identifier for this serializer.
|
|
31
|
+
*
|
|
32
|
+
* @returns Content type string (e.g., 'application/json', 'application/msgpack')
|
|
33
|
+
*/
|
|
34
|
+
getContentType(): string;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=serializer.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.interface.d.ts","sourceRoot":"","sources":["../../src/serializers/serializer.interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;IAExC;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;IAEzC;;;;;OAKG;IACH,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IAEnD;;;;OAIG;IACH,cAAc,IAAI,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared constants for Cache plugin.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Injection tokens.
|
|
6
|
+
*/
|
|
7
|
+
export declare const CACHE_PLUGIN_OPTIONS: unique symbol;
|
|
8
|
+
export declare const CACHE_SERVICE: unique symbol;
|
|
9
|
+
export declare const L1_CACHE_STORE: unique symbol;
|
|
10
|
+
export declare const L2_CACHE_STORE: unique symbol;
|
|
11
|
+
export declare const STAMPEDE_PROTECTION: unique symbol;
|
|
12
|
+
export declare const TAG_INDEX: unique symbol;
|
|
13
|
+
export declare const SWR_MANAGER: unique symbol;
|
|
14
|
+
export declare const TAG_CONFIG: unique symbol;
|
|
15
|
+
export declare const SERIALIZER: unique symbol;
|
|
16
|
+
export declare const INVALIDATION_REGISTRY: unique symbol;
|
|
17
|
+
export declare const EVENT_INVALIDATION_SERVICE: unique symbol;
|
|
18
|
+
export declare const LUA_SCRIPT_LOADER: unique symbol;
|
|
19
|
+
export declare const INVALIDATION_RULES_INIT: unique symbol;
|
|
20
|
+
export declare const AMQP_CONNECTION: unique symbol;
|
|
21
|
+
/**
|
|
22
|
+
* Metadata keys for decorators.
|
|
23
|
+
*/
|
|
24
|
+
export declare const CACHE_OPTIONS_KEY = "cache:options";
|
|
25
|
+
export declare const INVALIDATE_TAGS_KEY = "cache:invalidate:tags";
|
|
26
|
+
/**
|
|
27
|
+
* Default configuration values.
|
|
28
|
+
*/
|
|
29
|
+
export declare const DEFAULT_CACHE_CONFIG: {
|
|
30
|
+
readonly l1: {
|
|
31
|
+
readonly enabled: true;
|
|
32
|
+
readonly maxSize: 1000;
|
|
33
|
+
readonly ttl: 60;
|
|
34
|
+
readonly evictionPolicy: "lru";
|
|
35
|
+
};
|
|
36
|
+
readonly l2: {
|
|
37
|
+
readonly enabled: true;
|
|
38
|
+
readonly defaultTtl: 3600;
|
|
39
|
+
readonly maxTtl: 86400;
|
|
40
|
+
readonly keyPrefix: "cache:";
|
|
41
|
+
readonly clientName: "default";
|
|
42
|
+
};
|
|
43
|
+
readonly stampede: {
|
|
44
|
+
readonly enabled: true;
|
|
45
|
+
readonly lockTimeout: 5000;
|
|
46
|
+
readonly waitTimeout: 10000;
|
|
47
|
+
readonly fallback: "load";
|
|
48
|
+
};
|
|
49
|
+
readonly swr: {
|
|
50
|
+
readonly enabled: false;
|
|
51
|
+
readonly defaultStaleTime: 60;
|
|
52
|
+
};
|
|
53
|
+
readonly tags: {
|
|
54
|
+
readonly enabled: true;
|
|
55
|
+
readonly indexPrefix: "_tag:";
|
|
56
|
+
readonly maxTagsPerKey: 10;
|
|
57
|
+
};
|
|
58
|
+
readonly warmup: {
|
|
59
|
+
readonly enabled: false;
|
|
60
|
+
readonly concurrency: 10;
|
|
61
|
+
};
|
|
62
|
+
readonly keys: {
|
|
63
|
+
readonly maxLength: 1024;
|
|
64
|
+
readonly version: "v1";
|
|
65
|
+
readonly separator: ":";
|
|
66
|
+
};
|
|
67
|
+
readonly invalidation: {
|
|
68
|
+
readonly enabled: true;
|
|
69
|
+
readonly source: "internal";
|
|
70
|
+
readonly deduplicationTtl: 60;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAqC,CAAC;AACvE,eAAO,MAAM,aAAa,eAA8B,CAAC;AACzD,eAAO,MAAM,cAAc,eAA+B,CAAC;AAC3D,eAAO,MAAM,cAAc,eAA+B,CAAC;AAC3D,eAAO,MAAM,mBAAmB,eAAoC,CAAC;AACrE,eAAO,MAAM,SAAS,eAA0B,CAAC;AACjD,eAAO,MAAM,WAAW,eAA4B,CAAC;AACrD,eAAO,MAAM,UAAU,eAA2B,CAAC;AACnD,eAAO,MAAM,UAAU,eAA2B,CAAC;AACnD,eAAO,MAAM,qBAAqB,eAAsC,CAAC;AACzE,eAAO,MAAM,0BAA0B,eAA2C,CAAC;AACnF,eAAO,MAAM,iBAAiB,eAAkC,CAAC;AACjE,eAAO,MAAM,uBAAuB,eAAwC,CAAC;AAC7E,eAAO,MAAM,eAAe,eAAgC,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CvB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache plugin error classes.
|
|
3
|
+
*/
|
|
4
|
+
import { RedisXError, ErrorCode } from '@nestjs-redisx/core';
|
|
5
|
+
/**
|
|
6
|
+
* Base error for cache operations.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CacheError extends RedisXError {
|
|
9
|
+
constructor(message: string, code?: ErrorCode, cause?: Error);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Error for invalid cache keys.
|
|
13
|
+
*/
|
|
14
|
+
export declare class CacheKeyError extends CacheError {
|
|
15
|
+
readonly key: string;
|
|
16
|
+
constructor(key: string, message: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Error for serialization failures.
|
|
20
|
+
*/
|
|
21
|
+
export declare class SerializationError extends CacheError {
|
|
22
|
+
constructor(message: string, cause?: Error);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Error for loader function failures.
|
|
26
|
+
*/
|
|
27
|
+
export declare class LoaderError extends CacheError {
|
|
28
|
+
readonly key: string;
|
|
29
|
+
constructor(key: string, cause: Error);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Error for stampede protection timeout.
|
|
33
|
+
*/
|
|
34
|
+
export declare class StampedeError extends CacheError {
|
|
35
|
+
readonly key: string;
|
|
36
|
+
readonly timeout: number;
|
|
37
|
+
constructor(key: string, timeout: number);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Error for tag invalidation failures.
|
|
41
|
+
*/
|
|
42
|
+
export declare class TagInvalidationError extends CacheError {
|
|
43
|
+
readonly tag: string;
|
|
44
|
+
constructor(tag: string, message: string, cause?: Error);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/errors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;GAEG;AACH,qBAAa,UAAW,SAAQ,WAAW;gBAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAsC,EAAE,KAAK,CAAC,EAAE,KAAK;CAIzF;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;aAEzB,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAI3C;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,UAAU;aAEvB,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM,EAC3B,KAAK,EAAE,KAAK;CAKf;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;aAEzB,GAAG,EAAE,MAAM;aACX,OAAO,EAAE,MAAM;gBADf,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM;CAKlC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,UAAU;aAEhC,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,KAAK;CAKhB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for context providers (CLS, AsyncLocalStorage, custom).
|
|
3
|
+
* Users implement this to integrate their own context management.
|
|
4
|
+
*
|
|
5
|
+
* This is an adapter interface - no external dependencies required.
|
|
6
|
+
* Users can integrate any context management solution by implementing this interface.
|
|
7
|
+
*
|
|
8
|
+
* @example nestjs-cls integration
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { ClsService } from 'nestjs-cls';
|
|
11
|
+
*
|
|
12
|
+
* const provider: IContextProvider = {
|
|
13
|
+
* get: (key) => clsService.get(key),
|
|
14
|
+
* };
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @example AsyncLocalStorage integration
|
|
18
|
+
* ```typescript
|
|
19
|
+
* import { AsyncLocalStorage } from 'async_hooks';
|
|
20
|
+
*
|
|
21
|
+
* const als = new AsyncLocalStorage<Map<string, any>>();
|
|
22
|
+
* const provider: IContextProvider = {
|
|
23
|
+
* get: (key) => als.getStore()?.get(key),
|
|
24
|
+
* };
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @example Custom context integration
|
|
28
|
+
* ```typescript
|
|
29
|
+
* class MyContextManager {
|
|
30
|
+
* private context = new Map<string, any>();
|
|
31
|
+
*
|
|
32
|
+
* get(key: string) {
|
|
33
|
+
* return this.context.get(key);
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* const manager = new MyContextManager();
|
|
38
|
+
* const provider: IContextProvider = {
|
|
39
|
+
* get: (key) => manager.get(key),
|
|
40
|
+
* };
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export interface IContextProvider {
|
|
44
|
+
/**
|
|
45
|
+
* Get value from context by key.
|
|
46
|
+
*
|
|
47
|
+
* @param key - Context key to retrieve
|
|
48
|
+
* @returns Value from context or undefined if not found
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const tenantId = provider.get<string>('tenantId');
|
|
53
|
+
* const userId = provider.get<number>('userId');
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
get<T = unknown>(key: string): T | undefined;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=context-provider.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-provider.interface.d.ts","sourceRoot":"","sources":["../../../src/shared/types/context-provider.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC9C"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for Cache plugin.
|
|
3
|
+
*/
|
|
4
|
+
export type { IContextProvider } from './context-provider.interface';
|
|
5
|
+
/**
|
|
6
|
+
* Cache plugin configuration.
|
|
7
|
+
*/
|
|
8
|
+
export interface ICachePluginOptions {
|
|
9
|
+
/** Make module global */
|
|
10
|
+
isGlobal?: boolean;
|
|
11
|
+
/** L1 in-memory cache config */
|
|
12
|
+
l1?: {
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
maxSize?: number;
|
|
15
|
+
ttl?: number;
|
|
16
|
+
evictionPolicy?: 'lru' | 'lfu';
|
|
17
|
+
};
|
|
18
|
+
/** L2 Redis cache config */
|
|
19
|
+
l2?: {
|
|
20
|
+
enabled?: boolean;
|
|
21
|
+
defaultTtl?: number;
|
|
22
|
+
maxTtl?: number;
|
|
23
|
+
keyPrefix?: string;
|
|
24
|
+
clientName?: string;
|
|
25
|
+
};
|
|
26
|
+
/** Stampede protection config */
|
|
27
|
+
stampede?: {
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
lockTimeout?: number;
|
|
30
|
+
waitTimeout?: number;
|
|
31
|
+
fallback?: 'load' | 'error' | 'null';
|
|
32
|
+
};
|
|
33
|
+
/** Stale-while-revalidate config */
|
|
34
|
+
swr?: {
|
|
35
|
+
enabled?: boolean;
|
|
36
|
+
defaultStaleTime?: number;
|
|
37
|
+
};
|
|
38
|
+
/** Tag invalidation config */
|
|
39
|
+
tags?: {
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
indexPrefix?: string;
|
|
42
|
+
maxTagsPerKey?: number;
|
|
43
|
+
ttl?: number;
|
|
44
|
+
};
|
|
45
|
+
/** Cache warming config */
|
|
46
|
+
warmup?: {
|
|
47
|
+
enabled?: boolean;
|
|
48
|
+
keys?: IWarmupKey[];
|
|
49
|
+
concurrency?: number;
|
|
50
|
+
};
|
|
51
|
+
/** Key config */
|
|
52
|
+
keys?: {
|
|
53
|
+
maxLength?: number;
|
|
54
|
+
version?: string;
|
|
55
|
+
separator?: string;
|
|
56
|
+
};
|
|
57
|
+
/** Event-driven invalidation config */
|
|
58
|
+
invalidation?: IInvalidationOptions;
|
|
59
|
+
/**
|
|
60
|
+
* Context provider for automatic key enrichment.
|
|
61
|
+
* Allows integrating CLS, AsyncLocalStorage, or custom context management.
|
|
62
|
+
*
|
|
63
|
+
* @example nestjs-cls
|
|
64
|
+
* ```typescript
|
|
65
|
+
* import { ClsService } from 'nestjs-cls';
|
|
66
|
+
*
|
|
67
|
+
* contextProvider: {
|
|
68
|
+
* get: (key) => clsService.get(key),
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @example AsyncLocalStorage
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const als = new AsyncLocalStorage<Map<string, any>>();
|
|
75
|
+
* contextProvider: {
|
|
76
|
+
* get: (key) => als.getStore()?.get(key),
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
contextProvider?: import('./context-provider.interface').IContextProvider;
|
|
81
|
+
/**
|
|
82
|
+
* Keys to extract from context provider and append to cache keys.
|
|
83
|
+
* These keys will be automatically added to all cache keys unless skipContext is set.
|
|
84
|
+
*
|
|
85
|
+
* @example ['tenantId', 'userId', 'locale']
|
|
86
|
+
* @default []
|
|
87
|
+
*/
|
|
88
|
+
contextKeys?: string[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Warmup key configuration.
|
|
92
|
+
*/
|
|
93
|
+
export interface IWarmupKey {
|
|
94
|
+
key: string;
|
|
95
|
+
loader: () => Promise<unknown>;
|
|
96
|
+
ttl?: number;
|
|
97
|
+
tags?: string[];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Cache set options.
|
|
101
|
+
*/
|
|
102
|
+
export interface ICacheSetOptions {
|
|
103
|
+
ttl?: number;
|
|
104
|
+
tags?: string[];
|
|
105
|
+
strategy?: 'l1-only' | 'l2-only' | 'l1-l2';
|
|
106
|
+
varyBy?: Record<string, string>;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Cache getOrSet options.
|
|
110
|
+
*/
|
|
111
|
+
export interface ICacheGetOrSetOptions extends ICacheSetOptions {
|
|
112
|
+
swr?: {
|
|
113
|
+
enabled?: boolean;
|
|
114
|
+
staleTime?: number;
|
|
115
|
+
};
|
|
116
|
+
skipStampede?: boolean;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Cache statistics.
|
|
120
|
+
*/
|
|
121
|
+
export interface ICacheStats {
|
|
122
|
+
l1: {
|
|
123
|
+
hits: number;
|
|
124
|
+
misses: number;
|
|
125
|
+
size: number;
|
|
126
|
+
};
|
|
127
|
+
l2: {
|
|
128
|
+
hits: number;
|
|
129
|
+
misses: number;
|
|
130
|
+
};
|
|
131
|
+
stampedePrevented: number;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* SWR entry result with metadata.
|
|
135
|
+
*/
|
|
136
|
+
export interface ISwrEntry<T> {
|
|
137
|
+
/** The cached value */
|
|
138
|
+
value: T;
|
|
139
|
+
/** Timestamp when value was cached (ms) */
|
|
140
|
+
cachedAt: number;
|
|
141
|
+
/** Timestamp when value becomes stale (ms) */
|
|
142
|
+
staleAt: number;
|
|
143
|
+
/** Timestamp when value expires completely (ms) */
|
|
144
|
+
expiresAt: number;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Stampede execution result.
|
|
148
|
+
*/
|
|
149
|
+
export interface IStampedeResult<T> {
|
|
150
|
+
value: T;
|
|
151
|
+
cached: boolean;
|
|
152
|
+
waited: boolean;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Stampede statistics.
|
|
156
|
+
*/
|
|
157
|
+
export interface IStampedeStats {
|
|
158
|
+
activeFlights: number;
|
|
159
|
+
totalWaiters: number;
|
|
160
|
+
oldestFlight: number;
|
|
161
|
+
prevented: number;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Stampede options.
|
|
165
|
+
*/
|
|
166
|
+
export interface IStampedeOptions {
|
|
167
|
+
lockTimeout: number;
|
|
168
|
+
waitTimeout: number;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Scan result.
|
|
172
|
+
*/
|
|
173
|
+
export interface IScanResult {
|
|
174
|
+
cursor: string;
|
|
175
|
+
keys: string[];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Event-driven invalidation options.
|
|
179
|
+
*/
|
|
180
|
+
export interface IInvalidationOptions {
|
|
181
|
+
/**
|
|
182
|
+
* Enable event-driven invalidation.
|
|
183
|
+
* @default true
|
|
184
|
+
*/
|
|
185
|
+
enabled?: boolean;
|
|
186
|
+
/**
|
|
187
|
+
* Event source type.
|
|
188
|
+
* @default 'internal'
|
|
189
|
+
*/
|
|
190
|
+
source?: 'internal' | 'amqp' | 'custom';
|
|
191
|
+
/**
|
|
192
|
+
* AMQP configuration (if source = 'amqp').
|
|
193
|
+
*/
|
|
194
|
+
amqp?: {
|
|
195
|
+
/**
|
|
196
|
+
* Exchange to listen for invalidation events.
|
|
197
|
+
* @default 'cache.invalidation'
|
|
198
|
+
*/
|
|
199
|
+
exchange?: string;
|
|
200
|
+
/**
|
|
201
|
+
* Queue name for this service.
|
|
202
|
+
* @default '{serviceName}.cache.invalidation'
|
|
203
|
+
*/
|
|
204
|
+
queue?: string;
|
|
205
|
+
/**
|
|
206
|
+
* Routing key patterns to subscribe.
|
|
207
|
+
* @default ['#'] (all events)
|
|
208
|
+
*/
|
|
209
|
+
routingKeys?: string[];
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Static invalidation rules.
|
|
213
|
+
* Can also be registered dynamically via InvalidationRegistry.
|
|
214
|
+
*/
|
|
215
|
+
rules?: IInvalidationRuleProps[];
|
|
216
|
+
/**
|
|
217
|
+
* Default TTL for tracking processed events (dedup).
|
|
218
|
+
* @default 60 (seconds)
|
|
219
|
+
*/
|
|
220
|
+
deduplicationTtl?: number;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Invalidation rule properties.
|
|
224
|
+
*/
|
|
225
|
+
export interface IInvalidationRuleProps {
|
|
226
|
+
/**
|
|
227
|
+
* Event pattern to match.
|
|
228
|
+
* Supports wildcards: 'user.*', '*.updated', '#'
|
|
229
|
+
*/
|
|
230
|
+
event: string;
|
|
231
|
+
/**
|
|
232
|
+
* Tags to invalidate.
|
|
233
|
+
* Supports templates: 'user:{userId}', 'tenant:{payload.tenantId}'
|
|
234
|
+
*/
|
|
235
|
+
tags?: string[];
|
|
236
|
+
/**
|
|
237
|
+
* Keys to invalidate directly.
|
|
238
|
+
* Supports templates: 'user:{userId}:profile'
|
|
239
|
+
*/
|
|
240
|
+
keys?: string[];
|
|
241
|
+
/**
|
|
242
|
+
* Condition for invalidation.
|
|
243
|
+
*/
|
|
244
|
+
condition?: (payload: unknown) => boolean;
|
|
245
|
+
/**
|
|
246
|
+
* Priority (higher = processed first).
|
|
247
|
+
* @default 0
|
|
248
|
+
*/
|
|
249
|
+
priority?: number;
|
|
250
|
+
}
|
|
251
|
+
export type CacheSetOptions = ICacheSetOptions;
|
|
252
|
+
export type CacheGetOrSetOptions = ICacheGetOrSetOptions;
|
|
253
|
+
export type CacheStats = ICacheStats;
|
|
254
|
+
export type SwrEntry<T = unknown> = ISwrEntry<T>;
|
|
255
|
+
export type StampedeResult<T = unknown> = IStampedeResult<T>;
|
|
256
|
+
export type StampedeStats = IStampedeStats;
|
|
257
|
+
export type StampedeOptions = IStampedeOptions;
|
|
258
|
+
export type ScanResult = IScanResult;
|
|
259
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stampede protection service interface.
|
|
3
|
+
*/
|
|
4
|
+
import { IStampedeResult, IStampedeStats } from '../../../shared/types';
|
|
5
|
+
export interface IStampedeProtection {
|
|
6
|
+
/**
|
|
7
|
+
* Executes loader with stampede protection.
|
|
8
|
+
* Only one concurrent execution per key is allowed within the same process.
|
|
9
|
+
* Uses distributed Redis lock for cross-process protection.
|
|
10
|
+
*
|
|
11
|
+
* @param key - Unique key for the operation
|
|
12
|
+
* @param loader - Function to execute
|
|
13
|
+
* @returns Result with cached/waited flags
|
|
14
|
+
*/
|
|
15
|
+
protect<T>(key: string, loader: () => Promise<T>): Promise<IStampedeResult<T>>;
|
|
16
|
+
/**
|
|
17
|
+
* Cancels an in-flight request for a key.
|
|
18
|
+
*
|
|
19
|
+
* @param key - Key to cancel
|
|
20
|
+
*/
|
|
21
|
+
clearKey(key: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Cancels all in-flight requests.
|
|
24
|
+
*/
|
|
25
|
+
clearAll(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Gets stampede protection statistics.
|
|
28
|
+
*
|
|
29
|
+
* @returns Stats with active flights, waiters, and prevented count
|
|
30
|
+
*/
|
|
31
|
+
getStats(): IStampedeStats;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=stampede-protection.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stampede-protection.port.d.ts","sourceRoot":"","sources":["../../../../src/stampede/application/ports/stampede-protection.port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;OAQG;IACH,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,IAAI,cAAc,CAAC;CAC5B"}
|