@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,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event invalidation service port.
|
|
3
|
+
*/
|
|
4
|
+
export interface IInvalidationResult {
|
|
5
|
+
event: string;
|
|
6
|
+
tagsInvalidated: string[];
|
|
7
|
+
keysInvalidated: string[];
|
|
8
|
+
totalKeysDeleted: number;
|
|
9
|
+
duration: number;
|
|
10
|
+
skipped: boolean;
|
|
11
|
+
skipReason?: string;
|
|
12
|
+
}
|
|
13
|
+
export type InvalidationHandler = (event: string, payload: unknown, result: IInvalidationResult) => void | Promise<void>;
|
|
14
|
+
export interface IEventInvalidationService {
|
|
15
|
+
/**
|
|
16
|
+
* Process invalidation event.
|
|
17
|
+
*/
|
|
18
|
+
processEvent(event: string, payload: unknown): Promise<IInvalidationResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Emit invalidation event (for internal source).
|
|
21
|
+
*/
|
|
22
|
+
emit(event: string, payload: unknown): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Subscribe to invalidation events.
|
|
25
|
+
*/
|
|
26
|
+
subscribe(handler: InvalidationHandler): () => void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-invalidation.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-invalidation.port.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/application/ports/event-invalidation.port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE5E;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAAC;CACrD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invalidation registry port.
|
|
3
|
+
*/
|
|
4
|
+
import { InvalidationRule } from '../../domain/entities/invalidation-rule.entity';
|
|
5
|
+
export interface IResolvedInvalidation {
|
|
6
|
+
tags: string[];
|
|
7
|
+
keys: string[];
|
|
8
|
+
matchedRules: InvalidationRule[];
|
|
9
|
+
}
|
|
10
|
+
export interface IInvalidationRegistry {
|
|
11
|
+
/**
|
|
12
|
+
* Register invalidation rule.
|
|
13
|
+
*/
|
|
14
|
+
register(rule: InvalidationRule): void;
|
|
15
|
+
/**
|
|
16
|
+
* Register multiple rules.
|
|
17
|
+
*/
|
|
18
|
+
registerMany(rules: InvalidationRule[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* Unregister rule by event pattern.
|
|
21
|
+
*/
|
|
22
|
+
unregister(event: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Find matching rules for event.
|
|
25
|
+
*/
|
|
26
|
+
findRules(event: string): InvalidationRule[];
|
|
27
|
+
/**
|
|
28
|
+
* Resolve tags/keys for event with payload.
|
|
29
|
+
*/
|
|
30
|
+
resolve(event: string, payload: unknown): IResolvedInvalidation;
|
|
31
|
+
/**
|
|
32
|
+
* Get all registered rules.
|
|
33
|
+
*/
|
|
34
|
+
getRules(): InvalidationRule[];
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=invalidation-registry.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation-registry.port.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/application/ports/invalidation-registry.port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAElF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAEvC;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAE9C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAE7C;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,qBAAqB,CAAC;IAEhE;;OAEG;IACH,QAAQ,IAAI,gBAAgB,EAAE,CAAC;CAChC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event invalidation service.
|
|
3
|
+
* Processes invalidation events and coordinates cache invalidation.
|
|
4
|
+
*/
|
|
5
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
6
|
+
import { IRedisDriver } from '@nestjs-redisx/core';
|
|
7
|
+
import { ICacheService } from '../../../cache/application/ports/cache-service.port';
|
|
8
|
+
import { ICachePluginOptions } from '../../../shared/types';
|
|
9
|
+
import { IEventInvalidationService, InvalidationHandler, IInvalidationResult } from '../ports/event-invalidation.port';
|
|
10
|
+
import { IInvalidationRegistry } from '../ports/invalidation-registry.port';
|
|
11
|
+
export declare class EventInvalidationService implements IEventInvalidationService, OnModuleInit {
|
|
12
|
+
private readonly registry;
|
|
13
|
+
private readonly cacheService;
|
|
14
|
+
private readonly driver;
|
|
15
|
+
private readonly config;
|
|
16
|
+
private readonly logger;
|
|
17
|
+
private readonly handlers;
|
|
18
|
+
private readonly eventEmitter;
|
|
19
|
+
constructor(registry: IInvalidationRegistry, cacheService: ICacheService, driver: IRedisDriver, config: ICachePluginOptions);
|
|
20
|
+
onModuleInit(): Promise<void>;
|
|
21
|
+
processEvent(event: string, payload: unknown): Promise<IInvalidationResult>;
|
|
22
|
+
emit(event: string, payload: unknown): Promise<void>;
|
|
23
|
+
subscribe(handler: InvalidationHandler): () => void;
|
|
24
|
+
private setupInternalSource;
|
|
25
|
+
private checkDuplicate;
|
|
26
|
+
private markProcessed;
|
|
27
|
+
private generateEventId;
|
|
28
|
+
private notifyHandlers;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=event-invalidation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-invalidation.service.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/application/services/event-invalidation.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAA8B,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAgB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,qBACa,wBAAyB,YAAW,yBAAyB,EAAE,YAAY;IAOpF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACF,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM;IATvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAIhC,QAAQ,EAAE,qBAAqB,EACR,YAAY,EAAE,aAAa,EAC5B,MAAM,EAAE,YAAY,EACZ,MAAM,EAAE,mBAAmB;IAItE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7B,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2E3E,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAKnD,OAAO,CAAC,mBAAmB;YAWb,cAAc;YAWd,aAAa;IAW3B,OAAO,CAAC,eAAe;YAST,cAAc;CAU7B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invalidation registry service.
|
|
3
|
+
* Manages invalidation rules and resolves what to invalidate for events.
|
|
4
|
+
*/
|
|
5
|
+
import { InvalidationRule } from '../../domain/entities/invalidation-rule.entity';
|
|
6
|
+
import { IInvalidationRegistry, IResolvedInvalidation } from '../ports/invalidation-registry.port';
|
|
7
|
+
export declare class InvalidationRegistryService implements IInvalidationRegistry {
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private rules;
|
|
10
|
+
register(rule: InvalidationRule): void;
|
|
11
|
+
registerMany(rules: InvalidationRule[]): void;
|
|
12
|
+
unregister(event: string): void;
|
|
13
|
+
findRules(event: string): InvalidationRule[];
|
|
14
|
+
resolve(event: string, payload: unknown): IResolvedInvalidation;
|
|
15
|
+
getRules(): InvalidationRule[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=invalidation-registry.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation-registry.service.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/application/services/invalidation-registry.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEnG,qBACa,2BAA4B,YAAW,qBAAqB;IACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgD;IACvE,OAAO,CAAC,KAAK,CAA0B;IAEvC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAQtC,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAM7C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU/B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAI5C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,qBAAqB;IAiD/D,QAAQ,IAAI,gBAAgB,EAAE;CAG/B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invalidation rule entity.
|
|
3
|
+
* Defines what to invalidate when an event occurs.
|
|
4
|
+
*/
|
|
5
|
+
export interface IInvalidationRuleProps {
|
|
6
|
+
event: string;
|
|
7
|
+
tags?: string[];
|
|
8
|
+
keys?: string[];
|
|
9
|
+
condition?: (payload: unknown) => boolean;
|
|
10
|
+
priority?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class InvalidationRule {
|
|
13
|
+
private readonly eventPattern;
|
|
14
|
+
private readonly tagTemplates;
|
|
15
|
+
private readonly keyTemplates;
|
|
16
|
+
private readonly condition?;
|
|
17
|
+
private readonly priority;
|
|
18
|
+
private constructor();
|
|
19
|
+
/**
|
|
20
|
+
* Creates InvalidationRule from props.
|
|
21
|
+
*/
|
|
22
|
+
static create(props: IInvalidationRuleProps): InvalidationRule;
|
|
23
|
+
/**
|
|
24
|
+
* Tests if this rule matches the given event.
|
|
25
|
+
*/
|
|
26
|
+
matches(event: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Tests if condition passes for the given payload.
|
|
29
|
+
*/
|
|
30
|
+
testCondition(payload: unknown): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Resolves tags for the given payload.
|
|
33
|
+
*/
|
|
34
|
+
resolveTags(payload: unknown): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Resolves keys for the given payload.
|
|
37
|
+
*/
|
|
38
|
+
resolveKeys(payload: unknown): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Gets rule priority (higher = processed first).
|
|
41
|
+
*/
|
|
42
|
+
getPriority(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Gets the event pattern string.
|
|
45
|
+
*/
|
|
46
|
+
getEventPattern(): string;
|
|
47
|
+
/**
|
|
48
|
+
* Checks if rule has any tags.
|
|
49
|
+
*/
|
|
50
|
+
hasTags(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Checks if rule has any keys.
|
|
53
|
+
*/
|
|
54
|
+
hasKeys(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Checks if rule has a condition.
|
|
57
|
+
*/
|
|
58
|
+
hasCondition(): boolean;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=invalidation-rule.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation-rule.entity.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/domain/entities/invalidation-rule.entity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB;IAY9D;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAaxC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE;IAIvC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE;IAIvC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,YAAY,IAAI,OAAO;CAGxB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event pattern value object.
|
|
3
|
+
* Supports AMQP-style wildcards: '*' for one word, '#' for zero or more words.
|
|
4
|
+
*/
|
|
5
|
+
export declare class EventPattern {
|
|
6
|
+
private readonly pattern;
|
|
7
|
+
private readonly regex;
|
|
8
|
+
private constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Creates EventPattern from string pattern.
|
|
11
|
+
* @param pattern - AMQP-style pattern (e.g., 'user.*', 'order.#', 'product.updated')
|
|
12
|
+
*/
|
|
13
|
+
static create(pattern: string): EventPattern;
|
|
14
|
+
/**
|
|
15
|
+
* Tests if this pattern matches the given event.
|
|
16
|
+
*/
|
|
17
|
+
matches(event: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the raw pattern string.
|
|
20
|
+
*/
|
|
21
|
+
toString(): string;
|
|
22
|
+
/**
|
|
23
|
+
* Checks equality with another pattern.
|
|
24
|
+
*/
|
|
25
|
+
equals(other: EventPattern): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=event-pattern.vo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-pattern.vo.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/domain/value-objects/event-pattern.vo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO;IAKP;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IA4B5C;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;CAGrC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tag template value object.
|
|
3
|
+
* Supports placeholders like 'user:{userId}' or 'tenant:{payload.tenantId}'.
|
|
4
|
+
*/
|
|
5
|
+
export declare class TagTemplate {
|
|
6
|
+
private readonly template;
|
|
7
|
+
private readonly placeholders;
|
|
8
|
+
private constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Creates TagTemplate from template string.
|
|
11
|
+
* @param template - Template string with placeholders (e.g., 'user:{userId}')
|
|
12
|
+
*/
|
|
13
|
+
static create(template: string): TagTemplate;
|
|
14
|
+
/**
|
|
15
|
+
* Resolves template with given payload.
|
|
16
|
+
* @param payload - Data object to resolve placeholders from
|
|
17
|
+
* @returns Resolved tag string
|
|
18
|
+
*/
|
|
19
|
+
resolve(payload: unknown): string;
|
|
20
|
+
/**
|
|
21
|
+
* Returns the raw template string.
|
|
22
|
+
*/
|
|
23
|
+
toString(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Returns all placeholders in the template.
|
|
26
|
+
*/
|
|
27
|
+
getPlaceholders(): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Checks if template has any placeholders.
|
|
30
|
+
*/
|
|
31
|
+
hasPlaceholders(): boolean;
|
|
32
|
+
private getNestedValue;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=tag-template.vo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-template.vo.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/domain/value-objects/tag-template.vo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IAExC,OAAO;IAKP;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAmB5C;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAWjC;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B,OAAO,CAAC,cAAc;CAsBvB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AMQP event source adapter.
|
|
3
|
+
* Integrates with RabbitMQ using @golevelup/nestjs-rabbitmq.
|
|
4
|
+
* This is an optional adapter that requires @golevelup/nestjs-rabbitmq to be installed.
|
|
5
|
+
*/
|
|
6
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
7
|
+
import { ICachePluginOptions } from '../../../shared/types';
|
|
8
|
+
import { IEventInvalidationService } from '../../application/ports/event-invalidation.port';
|
|
9
|
+
interface IInvalidationMessage {
|
|
10
|
+
payload: unknown;
|
|
11
|
+
timestamp?: number;
|
|
12
|
+
source?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* AMQP connection interface (from @golevelup/nestjs-rabbitmq).
|
|
16
|
+
* Using minimal interface to avoid tight coupling with the external library.
|
|
17
|
+
*/
|
|
18
|
+
interface IAMQPConnection {
|
|
19
|
+
createSubscriber(handler: (msg: IInvalidationMessage, rawMsg: IRawMessage) => Promise<void>, options: {
|
|
20
|
+
exchange: string;
|
|
21
|
+
queue: string;
|
|
22
|
+
routingKey: string[];
|
|
23
|
+
queueOptions: {
|
|
24
|
+
durable: boolean;
|
|
25
|
+
};
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Raw AMQP message interface.
|
|
30
|
+
*/
|
|
31
|
+
interface IRawMessage {
|
|
32
|
+
fields: {
|
|
33
|
+
routingKey: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* AMQP Event Source Adapter.
|
|
38
|
+
* Note: This adapter requires @golevelup/nestjs-rabbitmq to be installed.
|
|
39
|
+
* If not available, the adapter will log a warning and do nothing.
|
|
40
|
+
*/
|
|
41
|
+
export declare class AMQPEventSourceAdapter implements OnModuleInit {
|
|
42
|
+
private readonly invalidationService;
|
|
43
|
+
private readonly config;
|
|
44
|
+
private readonly logger;
|
|
45
|
+
private amqpConnection;
|
|
46
|
+
constructor(invalidationService: IEventInvalidationService, config: ICachePluginOptions, amqpConnection?: IAMQPConnection);
|
|
47
|
+
onModuleInit(): Promise<void>;
|
|
48
|
+
private getServiceName;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=amqp-event-source.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amqp-event-source.adapter.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/infrastructure/adapters/amqp-event-source.adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAsB,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAE5F,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,UAAU,eAAe;IACvB,gBAAgB,CACd,OAAO,EAAE,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1E,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC;KACpC,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;;;GAIG;AACH,qBACa,sBAAuB,YAAW,YAAY;IAMvD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;IANvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,cAAc,CAA8B;gBAIjC,mBAAmB,EAAE,yBAAyB,EAChB,MAAM,EAAE,mBAAmB,EACrC,cAAc,CAAC,EAAE,eAAe;IAKjE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CnC,OAAO,CAAC,cAAc;CAGvB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @InvalidateOn decorator.
|
|
3
|
+
* Automatically invalidates cache after method execution based on events.
|
|
4
|
+
*
|
|
5
|
+
* Uses immediate proxy-based wrapping (not deferred to interceptor).
|
|
6
|
+
* Works on ANY Injectable class methods (services, repositories, etc).
|
|
7
|
+
*/
|
|
8
|
+
import 'reflect-metadata';
|
|
9
|
+
export declare const INVALIDATE_ON_OPTIONS: unique symbol;
|
|
10
|
+
/**
|
|
11
|
+
* Event invalidation service interface for decorator use.
|
|
12
|
+
*/
|
|
13
|
+
interface IDecoratorEventInvalidationService {
|
|
14
|
+
emit(event: string, payload: unknown): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register event invalidation service getter for lazy injection.
|
|
18
|
+
* Called by CacheDecoratorInitializerService during initialization.
|
|
19
|
+
*/
|
|
20
|
+
export declare function registerEventInvalidationServiceGetter(getter: () => IDecoratorEventInvalidationService): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get the registered event invalidation service.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getEventInvalidationService(): IDecoratorEventInvalidationService | null;
|
|
25
|
+
export interface IInvalidateOnOptions {
|
|
26
|
+
/** Events that trigger invalidation */
|
|
27
|
+
events: string[];
|
|
28
|
+
/** Tags to invalidate */
|
|
29
|
+
tags?: string[] | ((result: unknown, args: unknown[]) => string[]);
|
|
30
|
+
/** Keys to invalidate */
|
|
31
|
+
keys?: string[] | ((result: unknown, args: unknown[]) => string[]);
|
|
32
|
+
/** Condition - only invalidate if returns true */
|
|
33
|
+
condition?: (result: unknown, args: unknown[]) => boolean;
|
|
34
|
+
/** Publish event after method execution (for distributed invalidation) */
|
|
35
|
+
publish?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decorator that invalidates cache after method execution.
|
|
39
|
+
*
|
|
40
|
+
* Works on any Injectable class method, not just controllers.
|
|
41
|
+
*
|
|
42
|
+
* @param options - Invalidation options
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* @Injectable()
|
|
47
|
+
* class UserService {
|
|
48
|
+
* @InvalidateOn({
|
|
49
|
+
* events: ['user.updated'],
|
|
50
|
+
* tags: (result, [userId]) => [`user:${userId}`, 'users'],
|
|
51
|
+
* })
|
|
52
|
+
* async updateUser(userId: string, data: UpdateUserDto): Promise<User> {
|
|
53
|
+
* return this.userRepo.update(userId, data);
|
|
54
|
+
* }
|
|
55
|
+
*
|
|
56
|
+
* @InvalidateOn({
|
|
57
|
+
* events: ['user.deleted'],
|
|
58
|
+
* keys: (result, [userId]) => [`user:${userId}`],
|
|
59
|
+
* tags: ['users'],
|
|
60
|
+
* })
|
|
61
|
+
* async deleteUser(userId: string): Promise<void> {
|
|
62
|
+
* await this.userRepo.delete(userId);
|
|
63
|
+
* }
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function InvalidateOn(options: IInvalidateOnOptions): MethodDecorator;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=invalidate-on.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidate-on.decorator.d.ts","sourceRoot":"","sources":["../../../../src/invalidation/infrastructure/decorators/invalidate-on.decorator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,kBAAkB,CAAC;AAG1B,eAAO,MAAM,qBAAqB,eAAsC,CAAC;AAEzE;;GAEG;AACH,UAAU,kCAAkC;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAKD;;;GAGG;AACH,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,MAAM,kCAAkC,GAAG,IAAI,CAE7G;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,kCAAkC,GAAG,IAAI,CAEvF;AAED,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAEnE,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAEnE,kDAAkD;IAClD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAE1D,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CAuE3E"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent key builder for cache keys.
|
|
3
|
+
*
|
|
4
|
+
* Provides a convenient API for building cache keys with proper formatting,
|
|
5
|
+
* validation, and separation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Simple key
|
|
10
|
+
* const key = KeyBuilder.create()
|
|
11
|
+
* .prefix('app')
|
|
12
|
+
* .segment('user')
|
|
13
|
+
* .segment('123')
|
|
14
|
+
* .build();
|
|
15
|
+
* // 'app:user:123'
|
|
16
|
+
*
|
|
17
|
+
* // With namespace
|
|
18
|
+
* const key = KeyBuilder.create()
|
|
19
|
+
* .namespace('tenant-5')
|
|
20
|
+
* .prefix('cache')
|
|
21
|
+
* .segment('product')
|
|
22
|
+
* .segment('456')
|
|
23
|
+
* .build();
|
|
24
|
+
* // 'tenant-5:cache:product:456'
|
|
25
|
+
*
|
|
26
|
+
* // From template
|
|
27
|
+
* const key = KeyBuilder.fromTemplate('user:{userId}:post:{postId}', {
|
|
28
|
+
* userId: '123',
|
|
29
|
+
* postId: '456',
|
|
30
|
+
* });
|
|
31
|
+
* // 'user:123:post:456'
|
|
32
|
+
*
|
|
33
|
+
* // With versioning
|
|
34
|
+
* const key = KeyBuilder.create()
|
|
35
|
+
* .prefix('cache')
|
|
36
|
+
* .version('v2')
|
|
37
|
+
* .segment('user')
|
|
38
|
+
* .segment('123')
|
|
39
|
+
* .build();
|
|
40
|
+
* // 'cache:v2:user:123'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export interface IKeyBuilderOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Separator between segments (default: ':')
|
|
46
|
+
*/
|
|
47
|
+
separator?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Maximum key length (default: 512)
|
|
50
|
+
*/
|
|
51
|
+
maxLength?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Whether to validate segments for invalid characters (default: true)
|
|
54
|
+
*/
|
|
55
|
+
validate?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Whether to convert segments to lowercase (default: false)
|
|
58
|
+
*/
|
|
59
|
+
lowercase?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export declare class KeyBuilder {
|
|
62
|
+
private keySegments;
|
|
63
|
+
private options;
|
|
64
|
+
private constructor();
|
|
65
|
+
/**
|
|
66
|
+
* Creates a new KeyBuilder instance.
|
|
67
|
+
*
|
|
68
|
+
* @param options - Builder options
|
|
69
|
+
* @returns New KeyBuilder
|
|
70
|
+
*/
|
|
71
|
+
static create(options?: IKeyBuilderOptions): KeyBuilder;
|
|
72
|
+
/**
|
|
73
|
+
* Creates a key from a template string with placeholders.
|
|
74
|
+
*
|
|
75
|
+
* @param template - Template string (e.g., 'user:{id}:post:{postId}')
|
|
76
|
+
* @param params - Parameter values
|
|
77
|
+
* @param options - Builder options
|
|
78
|
+
* @returns Generated key
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* KeyBuilder.fromTemplate('user:{id}', { id: '123' })
|
|
83
|
+
* // 'user:123'
|
|
84
|
+
*
|
|
85
|
+
* KeyBuilder.fromTemplate('user:{userId}:post:{postId}', {
|
|
86
|
+
* userId: '123',
|
|
87
|
+
* postId: '456',
|
|
88
|
+
* })
|
|
89
|
+
* // 'user:123:post:456'
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
static fromTemplate(template: string, params: Record<string, string | number>, options?: IKeyBuilderOptions): string;
|
|
93
|
+
/**
|
|
94
|
+
* Creates a key from an array of segments.
|
|
95
|
+
*
|
|
96
|
+
* @param segments - Array of key segments
|
|
97
|
+
* @param options - Builder options
|
|
98
|
+
* @returns Generated key
|
|
99
|
+
*/
|
|
100
|
+
static fromSegments(segments: string[], options?: IKeyBuilderOptions): string;
|
|
101
|
+
/**
|
|
102
|
+
* Adds a namespace segment (first segment).
|
|
103
|
+
*
|
|
104
|
+
* @param ns - Namespace value
|
|
105
|
+
* @returns This builder for chaining
|
|
106
|
+
*/
|
|
107
|
+
namespace(ns: string): this;
|
|
108
|
+
/**
|
|
109
|
+
* Adds a prefix segment.
|
|
110
|
+
*
|
|
111
|
+
* @param prefix - Prefix value
|
|
112
|
+
* @returns This builder for chaining
|
|
113
|
+
*/
|
|
114
|
+
prefix(prefix: string): this;
|
|
115
|
+
/**
|
|
116
|
+
* Adds a version segment.
|
|
117
|
+
*
|
|
118
|
+
* @param version - Version value (e.g., 'v1', 'v2')
|
|
119
|
+
* @returns This builder for chaining
|
|
120
|
+
*/
|
|
121
|
+
version(version: string): this;
|
|
122
|
+
/**
|
|
123
|
+
* Adds a segment to the key.
|
|
124
|
+
*
|
|
125
|
+
* @param value - Segment value
|
|
126
|
+
* @returns This builder for chaining
|
|
127
|
+
*/
|
|
128
|
+
segment(value: string | number): this;
|
|
129
|
+
/**
|
|
130
|
+
* Adds multiple segments at once.
|
|
131
|
+
*
|
|
132
|
+
* @param values - Array of segment values
|
|
133
|
+
* @returns This builder for chaining
|
|
134
|
+
*/
|
|
135
|
+
segments(...values: Array<string | number>): this;
|
|
136
|
+
/**
|
|
137
|
+
* Adds a tag segment (useful for grouping).
|
|
138
|
+
*
|
|
139
|
+
* @param tag - Tag value
|
|
140
|
+
* @returns This builder for chaining
|
|
141
|
+
*/
|
|
142
|
+
tag(tag: string): this;
|
|
143
|
+
/**
|
|
144
|
+
* Adds timestamp segment.
|
|
145
|
+
*
|
|
146
|
+
* @param timestamp - Unix timestamp (default: now)
|
|
147
|
+
* @returns This builder for chaining
|
|
148
|
+
*/
|
|
149
|
+
timestamp(timestamp?: number): this;
|
|
150
|
+
/**
|
|
151
|
+
* Adds a hash segment from an object.
|
|
152
|
+
* Useful for cache keys based on complex objects.
|
|
153
|
+
*
|
|
154
|
+
* @param obj - Object to hash
|
|
155
|
+
* @returns This builder for chaining
|
|
156
|
+
*/
|
|
157
|
+
hash(obj: unknown): this;
|
|
158
|
+
/**
|
|
159
|
+
* Builds and returns the final key.
|
|
160
|
+
*
|
|
161
|
+
* @returns Generated cache key
|
|
162
|
+
* @throws CacheKeyError if key is invalid
|
|
163
|
+
*/
|
|
164
|
+
build(): string;
|
|
165
|
+
/**
|
|
166
|
+
* Resets the builder to initial state.
|
|
167
|
+
*
|
|
168
|
+
* @returns This builder for chaining
|
|
169
|
+
*/
|
|
170
|
+
reset(): this;
|
|
171
|
+
/**
|
|
172
|
+
* Gets current segments.
|
|
173
|
+
*
|
|
174
|
+
* @returns Array of segments
|
|
175
|
+
*/
|
|
176
|
+
getSegments(): string[];
|
|
177
|
+
/**
|
|
178
|
+
* Normalizes a segment value.
|
|
179
|
+
*
|
|
180
|
+
* @param value - Segment value
|
|
181
|
+
* @returns Normalized value
|
|
182
|
+
*/
|
|
183
|
+
private normalizeSegment;
|
|
184
|
+
/**
|
|
185
|
+
* Validates a complete key.
|
|
186
|
+
*
|
|
187
|
+
* @param key - Key to validate
|
|
188
|
+
* @throws CacheKeyError if key is invalid
|
|
189
|
+
*/
|
|
190
|
+
private validateKey;
|
|
191
|
+
/**
|
|
192
|
+
* Simple hash function for objects.
|
|
193
|
+
*
|
|
194
|
+
* @param str - String to hash
|
|
195
|
+
* @returns Hash string
|
|
196
|
+
*/
|
|
197
|
+
private simpleHash;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=key-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-builder.d.ts","sourceRoot":"","sources":["../src/key-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAIH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,OAAO,CAA+B;IAE9C,OAAO;IASP;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,UAAU;IAIvD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAiCpH;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAM7E;;;;;OAKG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK3B;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKrC;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI;IAKjD;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMtB;;;;;OAKG;IACH,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAInC;;;;;;OAMG;IACH,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKxB;;;;;OAKG;IACH,KAAK,IAAI,MAAM;IAWf;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAKb;;;;OAIG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAyBnB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;CASnB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache serializers for different data formats.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { JsonSerializer, MsgpackSerializer } from '@nestjs-redisx/cache';
|
|
7
|
+
*
|
|
8
|
+
* const jsonSerializer = new JsonSerializer();
|
|
9
|
+
* const serialized = jsonSerializer.serialize({ id: 1, name: 'John' });
|
|
10
|
+
*
|
|
11
|
+
* // For better performance and smaller size, use MessagePack
|
|
12
|
+
* const msgpackSerializer = new MsgpackSerializer();
|
|
13
|
+
* const binary = msgpackSerializer.serialize(largeData);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export type { ISerializer } from './serializer.interface';
|
|
17
|
+
export { JsonSerializer } from './json.serializer';
|
|
18
|
+
export { MsgpackSerializer } from './msgpack.serializer';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serializers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
|