ioredis-toolkit 0.0.9 → 0.5.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/CHANGELOG.md +67 -0
- package/LICENSE +1 -1
- package/README.md +68 -1058
- package/dist/cache/cache.d.ts +30 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +59 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/config.d.ts +12 -0
- package/dist/cache/config.d.ts.map +1 -0
- package/dist/cache/config.js +13 -0
- package/dist/cache/config.js.map +1 -0
- package/dist/cache/types.d.ts +32 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +5 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/index.d.ts +43 -51
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -44
- package/dist/index.js.map +1 -0
- package/dist/lock/config.d.ts +12 -0
- package/dist/lock/config.d.ts.map +1 -0
- package/dist/lock/config.js +8 -0
- package/dist/lock/config.js.map +1 -0
- package/dist/lock/lock.d.ts +20 -0
- package/dist/lock/lock.d.ts.map +1 -0
- package/dist/lock/lock.js +44 -0
- package/dist/lock/lock.js.map +1 -0
- package/dist/lock/types.d.ts +19 -0
- package/dist/lock/types.d.ts.map +1 -0
- package/dist/lock/types.js +2 -0
- package/dist/lock/types.js.map +1 -0
- package/dist/modules-config.d.ts +3 -0
- package/dist/modules-config.d.ts.map +1 -0
- package/dist/modules-config.js +2 -0
- package/dist/modules-config.js.map +1 -0
- package/dist/pubsub/config.d.ts +11 -0
- package/dist/pubsub/config.d.ts.map +1 -0
- package/dist/pubsub/config.js +6 -0
- package/dist/pubsub/config.js.map +1 -0
- package/dist/pubsub/pubsub.d.ts +20 -0
- package/dist/pubsub/pubsub.d.ts.map +1 -0
- package/dist/pubsub/pubsub.js +54 -0
- package/dist/pubsub/pubsub.js.map +1 -0
- package/dist/pubsub/types.d.ts +24 -0
- package/dist/pubsub/types.d.ts.map +1 -0
- package/dist/pubsub/types.js +2 -0
- package/dist/pubsub/types.js.map +1 -0
- package/dist/rate-limit/config.d.ts +12 -0
- package/dist/rate-limit/config.d.ts.map +1 -0
- package/dist/rate-limit/config.js +6 -0
- package/dist/rate-limit/config.js.map +1 -0
- package/dist/rate-limit/rate-limiter.d.ts +18 -0
- package/dist/rate-limit/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limit/rate-limiter.js +37 -0
- package/dist/rate-limit/rate-limiter.js.map +1 -0
- package/dist/rate-limit/types.d.ts +27 -0
- package/dist/rate-limit/types.d.ts.map +1 -0
- package/dist/rate-limit/types.js +2 -0
- package/dist/rate-limit/types.js.map +1 -0
- package/dist/redis/client-facade.d.ts +77 -0
- package/dist/redis/client-facade.d.ts.map +1 -0
- package/dist/redis/client-facade.js +102 -0
- package/dist/redis/client-facade.js.map +1 -0
- package/dist/redis/client.d.ts +10 -0
- package/dist/redis/client.d.ts.map +1 -0
- package/dist/redis/client.js +29 -0
- package/dist/redis/client.js.map +1 -0
- package/dist/redis/cluster.d.ts +7 -0
- package/dist/redis/cluster.d.ts.map +1 -0
- package/dist/redis/cluster.js +47 -0
- package/dist/redis/cluster.js.map +1 -0
- package/dist/redis/config.d.ts +39 -0
- package/dist/redis/config.d.ts.map +1 -0
- package/dist/redis/config.js +52 -0
- package/dist/redis/config.js.map +1 -0
- package/dist/redis/errors.d.ts +5 -0
- package/dist/redis/errors.d.ts.map +1 -0
- package/dist/redis/errors.js +5 -0
- package/dist/redis/errors.js.map +1 -0
- package/dist/redis/types.d.ts +135 -0
- package/dist/redis/types.d.ts.map +1 -0
- package/dist/redis/types.js +2 -0
- package/dist/redis/types.js.map +1 -0
- package/dist/redis/wrapper.d.ts +88 -0
- package/dist/redis/wrapper.d.ts.map +1 -0
- package/dist/redis/wrapper.js +206 -0
- package/dist/redis/wrapper.js.map +1 -0
- package/dist/session/config.d.ts +47 -0
- package/dist/session/config.d.ts.map +1 -0
- package/dist/session/config.js +101 -0
- package/dist/session/config.js.map +1 -0
- package/dist/session/cookie.d.ts +16 -0
- package/dist/session/cookie.d.ts.map +1 -0
- package/dist/session/cookie.js +28 -0
- package/dist/session/cookie.js.map +1 -0
- package/dist/session/errors.d.ts +56 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +58 -0
- package/dist/session/errors.js.map +1 -0
- package/dist/session/factory.d.ts +21 -0
- package/dist/session/factory.d.ts.map +1 -0
- package/dist/session/factory.js +30 -0
- package/dist/session/factory.js.map +1 -0
- package/dist/session/health.d.ts +12 -0
- package/dist/session/health.d.ts.map +1 -0
- package/dist/session/health.js +23 -0
- package/dist/session/health.js.map +1 -0
- package/dist/session/keys.d.ts +23 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +27 -0
- package/dist/session/keys.js.map +1 -0
- package/dist/session/manager.d.ts +34 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +31 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/metrics.d.ts +11 -0
- package/dist/session/metrics.d.ts.map +1 -0
- package/dist/session/metrics.js +10 -0
- package/dist/session/metrics.js.map +1 -0
- package/dist/session/repository.d.ts +49 -0
- package/dist/session/repository.d.ts.map +1 -0
- package/dist/session/repository.js +203 -0
- package/dist/session/repository.js.map +1 -0
- package/dist/session/revocation.d.ts +22 -0
- package/dist/session/revocation.d.ts.map +1 -0
- package/dist/session/revocation.js +41 -0
- package/dist/session/revocation.js.map +1 -0
- package/dist/session/script-sources.d.ts +11 -0
- package/dist/session/script-sources.d.ts.map +1 -0
- package/dist/session/script-sources.js +140 -0
- package/dist/session/script-sources.js.map +1 -0
- package/dist/session/scripts.d.ts +15 -0
- package/dist/session/scripts.d.ts.map +1 -0
- package/dist/session/scripts.js +41 -0
- package/dist/session/scripts.js.map +1 -0
- package/dist/session/serializer.d.ts +12 -0
- package/dist/session/serializer.d.ts.map +1 -0
- package/dist/session/serializer.js +77 -0
- package/dist/session/serializer.js.map +1 -0
- package/dist/session/service.d.ts +48 -0
- package/dist/session/service.d.ts.map +1 -0
- package/dist/session/service.js +235 -0
- package/dist/session/service.js.map +1 -0
- package/dist/session/token.d.ts +16 -0
- package/dist/session/token.d.ts.map +1 -0
- package/dist/session/token.js +32 -0
- package/dist/session/token.js.map +1 -0
- package/dist/session/types.d.ts +134 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/streams/config.d.ts +12 -0
- package/dist/streams/config.d.ts.map +1 -0
- package/dist/streams/config.js +6 -0
- package/dist/streams/config.js.map +1 -0
- package/dist/streams/streams.d.ts +24 -0
- package/dist/streams/streams.d.ts.map +1 -0
- package/dist/streams/streams.js +55 -0
- package/dist/streams/streams.js.map +1 -0
- package/dist/streams/types.d.ts +32 -0
- package/dist/streams/types.d.ts.map +1 -0
- package/dist/streams/types.js +2 -0
- package/dist/streams/types.js.map +1 -0
- package/docs/ACCEPTANCE-REPORT.md +70 -0
- package/docs/ARCHITECTURE.md +61 -0
- package/docs/CAPACITY.md +33 -0
- package/docs/DEPLOYMENT.md +22 -0
- package/docs/README-API.md +15 -0
- package/docs/STATE-MACHINE.md +38 -0
- package/docs/TESTING.md +37 -0
- package/docs/THREAT-MODEL.md +23 -0
- package/docs/TYPE-SAFETY.md +34 -0
- package/docs/modules/cache/README.md +7 -0
- package/docs/modules/cache/usage.md +156 -0
- package/docs/modules/lock/README.md +7 -0
- package/docs/modules/lock/usage.md +105 -0
- package/docs/modules/pubsub/README.md +7 -0
- package/docs/modules/pubsub/usage.md +106 -0
- package/docs/modules/rate-limit/README.md +7 -0
- package/docs/modules/rate-limit/usage.md +100 -0
- package/docs/modules/sessions/README.md +7 -0
- package/docs/modules/sessions/usage.md +262 -0
- package/docs/modules/streams/README.md +7 -0
- package/docs/modules/streams/usage.md +141 -0
- package/package.json +50 -60
- package/src/scripts/cleanup-index.lua +4 -0
- package/src/scripts/conditional-update.lua +21 -0
- package/src/scripts/consume-session.lua +21 -0
- package/src/scripts/create-session.lua +28 -0
- package/src/scripts/delete.lua +2 -0
- package/src/scripts/destroy-user.lua +13 -0
- package/src/scripts/enforce-limit.lua +17 -0
- package/src/scripts/revoke-session.lua +13 -0
- package/src/scripts/rotate.lua +24 -0
- package/src/scripts/touch-session.lua +28 -0
- package/src/scripts/update-session.lua +18 -0
- package/dist/cache.d.ts +0 -796
- package/dist/cache.js +0 -1120
- package/dist/client.d.ts +0 -284
- package/dist/client.js +0 -1114
- package/dist/cluster-slot.d.ts +0 -4
- package/dist/cluster-slot.js +0 -31
- package/dist/cluster.d.ts +0 -79
- package/dist/cluster.js +0 -156
- package/dist/errors.d.ts +0 -30
- package/dist/errors.js +0 -63
- package/dist/health.d.ts +0 -180
- package/dist/health.js +0 -239
- package/dist/lock.d.ts +0 -248
- package/dist/lock.js +0 -397
- package/dist/logger.d.ts +0 -12
- package/dist/logger.js +0 -40
- package/dist/pubsub.d.ts +0 -423
- package/dist/pubsub.js +0 -537
- package/dist/ratelimiter.d.ts +0 -441
- package/dist/ratelimiter.js +0 -539
- package/dist/session/index.d.ts +0 -23
- package/dist/session/index.js +0 -16
- package/dist/session/revocation-store.d.ts +0 -176
- package/dist/session/revocation-store.js +0 -318
- package/dist/session/scripts/cleanup-index.lua +0 -21
- package/dist/session/scripts/conditional-update-encrypted.lua +0 -60
- package/dist/session/scripts/conditional-update.lua +0 -63
- package/dist/session/scripts/create.lua +0 -83
- package/dist/session/scripts/delete-by-user.lua +0 -29
- package/dist/session/scripts/delete.lua +0 -15
- package/dist/session/scripts/enforce-limit.lua +0 -38
- package/dist/session/scripts/revoke.lua +0 -61
- package/dist/session/scripts/rotate-encrypted.lua +0 -110
- package/dist/session/scripts/rotate.lua +0 -122
- package/dist/session/scripts/touch-encrypted.lua +0 -89
- package/dist/session/scripts/touch.lua +0 -72
- package/dist/session/scripts/validate.lua +0 -90
- package/dist/session/session-circuit-breaker.d.ts +0 -42
- package/dist/session/session-circuit-breaker.js +0 -129
- package/dist/session/session-config.d.ts +0 -335
- package/dist/session/session-config.js +0 -162
- package/dist/session/session-cookie.d.ts +0 -72
- package/dist/session/session-cookie.js +0 -101
- package/dist/session/session-encryption.d.ts +0 -87
- package/dist/session/session-encryption.js +0 -139
- package/dist/session/session-errors.d.ts +0 -85
- package/dist/session/session-errors.js +0 -145
- package/dist/session/session-health.d.ts +0 -38
- package/dist/session/session-health.js +0 -60
- package/dist/session/session-keys.d.ts +0 -51
- package/dist/session/session-keys.js +0 -113
- package/dist/session/session-manager.d.ts +0 -73
- package/dist/session/session-manager.js +0 -94
- package/dist/session/session-metrics.d.ts +0 -33
- package/dist/session/session-metrics.js +0 -112
- package/dist/session/session-repository.d.ts +0 -161
- package/dist/session/session-repository.js +0 -683
- package/dist/session/session-scripts.d.ts +0 -36
- package/dist/session/session-scripts.js +0 -130
- package/dist/session/session-serializer.d.ts +0 -42
- package/dist/session/session-serializer.js +0 -248
- package/dist/session/session-service.d.ts +0 -104
- package/dist/session/session-service.js +0 -611
- package/dist/session/session-token.d.ts +0 -38
- package/dist/session/session-token.js +0 -86
- package/dist/session/session-types.d.ts +0 -253
- package/dist/session/session-types.js +0 -16
- package/dist/types.d.ts +0 -924
- package/dist/types.js +0 -151
- package/dist/utils/deepmerge.d.ts +0 -9
- package/dist/utils/deepmerge.js +0 -61
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RedisClientWrapper } from '../redis/wrapper.js';
|
|
2
|
+
import { type CacheConfig, type CacheResult, type CacheSetOptions } from './types.js';
|
|
3
|
+
/** JSON-based, namespaced Redis cache with TTL and conditional writes. */
|
|
4
|
+
export declare class RedisCache {
|
|
5
|
+
private readonly redis;
|
|
6
|
+
private readonly config;
|
|
7
|
+
/** Creates a cache bound to the shared Redis client. */
|
|
8
|
+
constructor(redis: RedisClientWrapper, config: CacheConfig);
|
|
9
|
+
/** Builds the physical Redis key for a logical cache key. */
|
|
10
|
+
key(key: string): string;
|
|
11
|
+
/** Reads and JSON-decodes a cached value. */
|
|
12
|
+
get<T>(key: string): Promise<CacheResult<T>>;
|
|
13
|
+
/** Reads a cached value and returns null on a miss. */
|
|
14
|
+
getValue<T>(key: string): Promise<T | null>;
|
|
15
|
+
/** Stores a JSON-serializable value with optional TTL and NX/XX semantics. */
|
|
16
|
+
set<T>(key: string, value: T, options?: CacheSetOptions): Promise<boolean>;
|
|
17
|
+
/** Deletes one or more cache entries. */
|
|
18
|
+
delete(...keys: string[]): Promise<number>;
|
|
19
|
+
/** Removes one cache entry. Alias for delete. */
|
|
20
|
+
del(key: string): Promise<number>;
|
|
21
|
+
/** Checks whether a cache entry exists. */
|
|
22
|
+
has(key: string): Promise<boolean>;
|
|
23
|
+
/** Returns the remaining TTL in seconds. */
|
|
24
|
+
ttl(key: string): Promise<number>;
|
|
25
|
+
/** Stores a value only when the key is absent. */
|
|
26
|
+
setIfAbsent<T>(key: string, value: T, ttl?: number): Promise<boolean>;
|
|
27
|
+
/** Invalidates all entries matching a namespaced pattern using cluster-aware scanning. */
|
|
28
|
+
clear(pattern?: string): Promise<number>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElG,0EAA0E;AAC1E,qBAAa,UAAU;IAET,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAsB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAD/E,wDAAwD;gBAC3B,KAAK,EAAE,kBAAkB,EAAmB,MAAM,EAAE,WAAW;IAE5F,6DAA6D;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAExB,6CAA6C;IACvC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAOlD,uDAAuD;IACjD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAEjD,8EAA8E;IACxE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAapF,yCAAyC;IACnC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhD,iDAAiD;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEvC,2CAA2C;IACrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAExC,4CAA4C;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEvC,kDAAkD;IAC5C,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE3E,0FAA0F;IACpF,KAAK,CAAC,OAAO,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAC5C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CacheError } from './types.js';
|
|
2
|
+
/** JSON-based, namespaced Redis cache with TTL and conditional writes. */
|
|
3
|
+
export class RedisCache {
|
|
4
|
+
redis;
|
|
5
|
+
config;
|
|
6
|
+
/** Creates a cache bound to the shared Redis client. */
|
|
7
|
+
constructor(redis, config) {
|
|
8
|
+
this.redis = redis;
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
/** Builds the physical Redis key for a logical cache key. */
|
|
12
|
+
key(key) { return `${this.config.namespace}:${key}`; }
|
|
13
|
+
/** Reads and JSON-decodes a cached value. */
|
|
14
|
+
async get(key) {
|
|
15
|
+
const raw = await this.redis.get(this.key(key));
|
|
16
|
+
if (raw === null)
|
|
17
|
+
return { hit: false, value: null };
|
|
18
|
+
try {
|
|
19
|
+
return { hit: true, value: JSON.parse(raw) };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw new CacheError(`Cached value for "${key}" is not valid JSON`, { cause: error });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Reads a cached value and returns null on a miss. */
|
|
26
|
+
async getValue(key) { return (await this.get(key)).value; }
|
|
27
|
+
/** Stores a JSON-serializable value with optional TTL and NX/XX semantics. */
|
|
28
|
+
async set(key, value, options = {}) {
|
|
29
|
+
if (options.nx && options.xx)
|
|
30
|
+
throw new RangeError('Cache set options nx and xx are mutually exclusive');
|
|
31
|
+
if (options.ttl !== undefined && (!Number.isInteger(options.ttl) || options.ttl <= 0))
|
|
32
|
+
throw new RangeError('Cache TTL must be a positive integer');
|
|
33
|
+
const encoded = JSON.stringify(value);
|
|
34
|
+
if (encoded === undefined)
|
|
35
|
+
throw new TypeError('Cache values must be JSON-serializable');
|
|
36
|
+
if (Buffer.byteLength(encoded, 'utf8') > this.config.maxValueBytes)
|
|
37
|
+
throw new RangeError('Cache value exceeds maxValueBytes');
|
|
38
|
+
const args = ['EX', String(options.ttl ?? this.config.defaultTtl)];
|
|
39
|
+
if (options.nx)
|
|
40
|
+
args.push('NX');
|
|
41
|
+
if (options.xx)
|
|
42
|
+
args.push('XX');
|
|
43
|
+
const result = await this.redis.set(this.key(key), encoded, ...args);
|
|
44
|
+
return result === 'OK';
|
|
45
|
+
}
|
|
46
|
+
/** Deletes one or more cache entries. */
|
|
47
|
+
async delete(...keys) { return this.redis.del(...keys.map(k => this.key(k))); }
|
|
48
|
+
/** Removes one cache entry. Alias for delete. */
|
|
49
|
+
async del(key) { return this.delete(key); }
|
|
50
|
+
/** Checks whether a cache entry exists. */
|
|
51
|
+
async has(key) { return (await this.redis.exists(this.key(key))) === 1; }
|
|
52
|
+
/** Returns the remaining TTL in seconds. */
|
|
53
|
+
async ttl(key) { return this.redis.ttl(this.key(key)); }
|
|
54
|
+
/** Stores a value only when the key is absent. */
|
|
55
|
+
async setIfAbsent(key, value, ttl) { return this.set(key, value, ttl === undefined ? { nx: true } : { ttl, nx: true }); }
|
|
56
|
+
/** Invalidates all entries matching a namespaced pattern using cluster-aware scanning. */
|
|
57
|
+
async clear(pattern = '*') { return this.redis.deletePatternClusterAware(this.key(pattern)); }
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { CacheConfig } from './types.js';
|
|
3
|
+
/** Runtime schema for cache configuration. */
|
|
4
|
+
export declare const CacheConfigSchema: z.ZodObject<{
|
|
5
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
+
namespace: z.ZodDefault<z.ZodString>;
|
|
7
|
+
defaultTtl: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
maxValueBytes: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
/** Validates and normalizes cache configuration. */
|
|
11
|
+
export declare function parseCacheConfig(input: unknown): CacheConfig;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cache/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8CAA8C;AAC9C,eAAO,MAAM,iBAAiB;;;;;iBAK5B,CAAC;AACH,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAE5D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Runtime schema for cache configuration. */
|
|
3
|
+
export const CacheConfigSchema = z.object({
|
|
4
|
+
enabled: z.boolean().default(false),
|
|
5
|
+
namespace: z.string().min(1).max(128).default('cache'),
|
|
6
|
+
defaultTtl: z.number().int().positive().default(300),
|
|
7
|
+
maxValueBytes: z.number().int().positive().max(16 * 1024 * 1024).default(1024 * 1024),
|
|
8
|
+
});
|
|
9
|
+
/** Validates and normalizes cache configuration. */
|
|
10
|
+
export function parseCacheConfig(input) {
|
|
11
|
+
return CacheConfigSchema.parse(input ?? {});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cache/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,8CAA8C;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACtD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACpD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;CACtF,CAAC,CAAC;AACH,oDAAoD;AACpD,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,iBAAiB,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAgB,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Thrown when a cached value cannot be decoded, or when the module is used while disabled. */
|
|
2
|
+
export declare class CacheError extends Error {
|
|
3
|
+
constructor(message: string, options?: ErrorOptions);
|
|
4
|
+
}
|
|
5
|
+
/** Normalized configuration for {@link RedisCache}. */
|
|
6
|
+
export interface CacheConfig {
|
|
7
|
+
/** Whether the application has enabled the module. The class remains directly constructible when false; {@link RedisClient}'s `cache` getter throws when disabled. */
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
/** Prefix used for every physical cache key. */
|
|
10
|
+
namespace: string;
|
|
11
|
+
/** TTL in seconds used when a write does not provide an explicit TTL. */
|
|
12
|
+
defaultTtl: number;
|
|
13
|
+
/** Maximum UTF-8 encoded JSON payload size accepted by a write. */
|
|
14
|
+
maxValueBytes: number;
|
|
15
|
+
}
|
|
16
|
+
/** Options controlling a single cache write. */
|
|
17
|
+
export interface CacheSetOptions {
|
|
18
|
+
/** Explicit TTL in seconds. Must be a positive integer when supplied. */
|
|
19
|
+
ttl?: number;
|
|
20
|
+
/** Write only when the key does not already exist. Mutually exclusive with {@link xx}. */
|
|
21
|
+
nx?: boolean;
|
|
22
|
+
/** Write only when the key already exists. Mutually exclusive with {@link nx}. */
|
|
23
|
+
xx?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Result of a cache lookup. */
|
|
26
|
+
export interface CacheResult<T> {
|
|
27
|
+
/** True when Redis contained the requested key. */
|
|
28
|
+
hit: boolean;
|
|
29
|
+
/** Decoded value on a hit, otherwise `null`. */
|
|
30
|
+
value: T | null;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CACpD;AAED,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,sKAAsK;IACtK,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,kFAAkF;IAClF,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,gCAAgC;AAChC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,mDAAmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb,gDAAgD;IAChD,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe,EAAE,OAAsB,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;CAC5G"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,51 +1,43 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export type {
|
|
9
|
-
export { createSessionManager } from './session/
|
|
10
|
-
export {
|
|
11
|
-
export
|
|
12
|
-
export { SessionService } from './session/
|
|
13
|
-
export
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export {
|
|
18
|
-
export
|
|
19
|
-
export {
|
|
20
|
-
export
|
|
21
|
-
export {
|
|
22
|
-
export
|
|
23
|
-
export
|
|
24
|
-
export {
|
|
25
|
-
export
|
|
26
|
-
export {
|
|
27
|
-
export {
|
|
28
|
-
export {
|
|
29
|
-
export type {
|
|
30
|
-
export
|
|
31
|
-
export {
|
|
32
|
-
export type {
|
|
33
|
-
export {
|
|
34
|
-
export {
|
|
35
|
-
export type {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
createRedisClient: typeof createRedisClient;
|
|
45
|
-
Cache: typeof Cache;
|
|
46
|
-
PubSub: typeof PubSub;
|
|
47
|
-
DistributedLock: typeof DistributedLock;
|
|
48
|
-
HealthChecker: typeof HealthChecker;
|
|
49
|
-
RateLimiter: typeof RateLimiter;
|
|
50
|
-
};
|
|
51
|
-
export default _default;
|
|
1
|
+
export { createRedisConnection } from './redis/client.js';
|
|
2
|
+
export { RedisClientWrapper } from './redis/wrapper.js';
|
|
3
|
+
export { createRedisClient, RedisClient } from './redis/client-facade.js';
|
|
4
|
+
export type { RedisClientConfig, RedisClientDependencies } from './redis/client-facade.js';
|
|
5
|
+
export { redisHashSlot, safeUserTag, assertSameSlot } from './redis/cluster.js';
|
|
6
|
+
export { parseRedisConnectionConfig, RedisConnectionConfigSchema } from './redis/config.js';
|
|
7
|
+
export { RedisConfigurationError } from './redis/errors.js';
|
|
8
|
+
export type { RedisConfig, RedisMode, RedisConnection, RedisCommandClient } from './redis/types.js';
|
|
9
|
+
export { createSessionManager, createSessionManagerFromRedis } from './session/factory.js';
|
|
10
|
+
export type { CreateSessionManagerOptions } from './session/factory.js';
|
|
11
|
+
export { SessionManager } from './session/manager.js';
|
|
12
|
+
export { SessionService } from './session/service.js';
|
|
13
|
+
export { SessionRepository } from './session/repository.js';
|
|
14
|
+
export { SessionTokenManager } from './session/token.js';
|
|
15
|
+
export { SessionSerializer } from './session/serializer.js';
|
|
16
|
+
export { SessionKeyStrategy } from './session/keys.js';
|
|
17
|
+
export { SessionScriptRegistry } from './session/scripts.js';
|
|
18
|
+
export { RedisRevocationStore } from './session/revocation.js';
|
|
19
|
+
export { SessionHealthProvider } from './session/health.js';
|
|
20
|
+
export { NoopMetrics } from './session/metrics.js';
|
|
21
|
+
export { serializeCookie, serializeDeletionCookie } from './session/cookie.js';
|
|
22
|
+
export { parseSessionConfig, SessionConfigSchema } from './session/config.js';
|
|
23
|
+
export type { SessionConfig } from './session/config.js';
|
|
24
|
+
export type { SessionRecord, SessionStatus, CreateSessionInput, CreatedSession, ValidationResult, RotationResult, SessionPatch, SessionMetrics, SessionHealth, KeyManager } from './session/types.js';
|
|
25
|
+
export * from './session/errors.js';
|
|
26
|
+
export { RedisCache } from './cache/cache.js';
|
|
27
|
+
export { parseCacheConfig, CacheConfigSchema } from './cache/config.js';
|
|
28
|
+
export { CacheError } from './cache/types.js';
|
|
29
|
+
export type { CacheConfig, CacheSetOptions, CacheResult } from './cache/types.js';
|
|
30
|
+
export { RedisLock } from './lock/lock.js';
|
|
31
|
+
export { parseLockConfig, LockConfigSchema } from './lock/config.js';
|
|
32
|
+
export type { LockConfig, LockAcquireResult } from './lock/types.js';
|
|
33
|
+
export { RedisRateLimiter } from './rate-limit/rate-limiter.js';
|
|
34
|
+
export { parseRateLimitConfig, RateLimitConfigSchema } from './rate-limit/config.js';
|
|
35
|
+
export type { RateLimitConfig, RateLimitResult } from './rate-limit/types.js';
|
|
36
|
+
export { RedisPubSub } from './pubsub/pubsub.js';
|
|
37
|
+
export { parsePubSubConfig, PubSubConfigSchema } from './pubsub/config.js';
|
|
38
|
+
export type { PubSubConfig, PubSubMessage, Subscription } from './pubsub/types.js';
|
|
39
|
+
export { RedisStreams } from './streams/streams.js';
|
|
40
|
+
export { parseStreamsConfig, StreamsConfigSchema } from './streams/config.js';
|
|
41
|
+
export type { StreamsConfig, StreamEntry, StreamReadOptions } from './streams/types.js';
|
|
42
|
+
export type { ModuleConfigMode } from './modules-config.js';
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,44 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
export { RedisClientWrapper
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export { SessionKeyStrategy
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export {
|
|
18
|
-
export {
|
|
19
|
-
export { parseSessionConfig,
|
|
20
|
-
export
|
|
21
|
-
export {
|
|
22
|
-
export {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export {
|
|
26
|
-
|
|
27
|
-
export {
|
|
28
|
-
export {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
import { DistributedLock } from './lock.js';
|
|
34
|
-
import { HealthChecker } from './health.js';
|
|
35
|
-
import { RateLimiter } from './ratelimiter.js';
|
|
36
|
-
export default {
|
|
37
|
-
RedisClient,
|
|
38
|
-
createRedisClient,
|
|
39
|
-
Cache,
|
|
40
|
-
PubSub,
|
|
41
|
-
DistributedLock,
|
|
42
|
-
HealthChecker,
|
|
43
|
-
RateLimiter,
|
|
44
|
-
};
|
|
1
|
+
export { createRedisConnection } from './redis/client.js';
|
|
2
|
+
export { RedisClientWrapper } from './redis/wrapper.js';
|
|
3
|
+
export { createRedisClient, RedisClient } from './redis/client-facade.js';
|
|
4
|
+
export { redisHashSlot, safeUserTag, assertSameSlot } from './redis/cluster.js';
|
|
5
|
+
export { parseRedisConnectionConfig, RedisConnectionConfigSchema } from './redis/config.js';
|
|
6
|
+
export { RedisConfigurationError } from './redis/errors.js';
|
|
7
|
+
export { createSessionManager, createSessionManagerFromRedis } from './session/factory.js';
|
|
8
|
+
export { SessionManager } from './session/manager.js';
|
|
9
|
+
export { SessionService } from './session/service.js';
|
|
10
|
+
export { SessionRepository } from './session/repository.js';
|
|
11
|
+
export { SessionTokenManager } from './session/token.js';
|
|
12
|
+
export { SessionSerializer } from './session/serializer.js';
|
|
13
|
+
export { SessionKeyStrategy } from './session/keys.js';
|
|
14
|
+
export { SessionScriptRegistry } from './session/scripts.js';
|
|
15
|
+
export { RedisRevocationStore } from './session/revocation.js';
|
|
16
|
+
export { SessionHealthProvider } from './session/health.js';
|
|
17
|
+
export { NoopMetrics } from './session/metrics.js';
|
|
18
|
+
export { serializeCookie, serializeDeletionCookie } from './session/cookie.js';
|
|
19
|
+
export { parseSessionConfig, SessionConfigSchema } from './session/config.js';
|
|
20
|
+
export * from './session/errors.js';
|
|
21
|
+
export { RedisCache } from './cache/cache.js';
|
|
22
|
+
export { parseCacheConfig, CacheConfigSchema } from './cache/config.js';
|
|
23
|
+
export { CacheError } from './cache/types.js';
|
|
24
|
+
export { RedisLock } from './lock/lock.js';
|
|
25
|
+
export { parseLockConfig, LockConfigSchema } from './lock/config.js';
|
|
26
|
+
export { RedisRateLimiter } from './rate-limit/rate-limiter.js';
|
|
27
|
+
export { parseRateLimitConfig, RateLimitConfigSchema } from './rate-limit/config.js';
|
|
28
|
+
export { RedisPubSub } from './pubsub/pubsub.js';
|
|
29
|
+
export { parsePubSubConfig, PubSubConfigSchema } from './pubsub/config.js';
|
|
30
|
+
export { RedisStreams } from './streams/streams.js';
|
|
31
|
+
export { parseStreamsConfig, StreamsConfigSchema } from './streams/config.js';
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,cAAc,qBAAqB,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { LockConfig } from './types.js';
|
|
3
|
+
/** Runtime schema for distributed-lock configuration. */
|
|
4
|
+
export declare const LockConfigSchema: z.ZodObject<{
|
|
5
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
+
namespace: z.ZodDefault<z.ZodString>;
|
|
7
|
+
defaultTtl: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
maxTtl: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
/** Validates and normalizes lock configuration. */
|
|
11
|
+
export declare function parseLockConfig(input: unknown): LockConfig;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lock/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,yDAAyD;AACzD,eAAO,MAAM,gBAAgB;;;;;iBACqI,CAAC;AACnK,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAA8D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Runtime schema for distributed-lock configuration. */
|
|
3
|
+
export const LockConfigSchema = z.object({ enabled: z.boolean().default(false), namespace: z.string().min(1).max(128).default('lock'), defaultTtl: z.number().int().positive().default(30), maxTtl: z.number().int().positive().default(300) })
|
|
4
|
+
.superRefine((c, ctx) => { if (c.defaultTtl > c.maxTtl)
|
|
5
|
+
ctx.addIssue({ code: 'custom', path: ['defaultTtl'], message: 'defaultTtl must not exceed maxTtl' }); });
|
|
6
|
+
/** Validates and normalizes lock configuration. */
|
|
7
|
+
export function parseLockConfig(input) { return LockConfigSchema.parse(input ?? {}); }
|
|
8
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lock/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;KAC5O,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM;IAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnK,mDAAmD;AACnD,MAAM,UAAU,eAAe,CAAC,KAAc,IAAgB,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAe,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RedisClientWrapper } from '../redis/wrapper.js';
|
|
2
|
+
import type { LockAcquireResult, LockConfig } from './types.js';
|
|
3
|
+
/** Redis distributed lock using an ownership token and compare-and-delete semantics. */
|
|
4
|
+
export declare class RedisLock {
|
|
5
|
+
private readonly redis;
|
|
6
|
+
private readonly config;
|
|
7
|
+
/** Creates a lock bound to the shared Redis client. The client must be shared with the other modules. */
|
|
8
|
+
constructor(redis: RedisClientWrapper, config: LockConfig);
|
|
9
|
+
/** Builds the physical key for a logical lock name. */
|
|
10
|
+
key(name: string): string;
|
|
11
|
+
/** Attempts to acquire a lock and returns a cryptographically random ownership token. */
|
|
12
|
+
acquire(name: string, ttl?: number): Promise<LockAcquireResult>;
|
|
13
|
+
/** Releases a lock only when the supplied ownership token still owns it. */
|
|
14
|
+
release(name: string, token: string): Promise<boolean>;
|
|
15
|
+
/** Extends a lock only when the supplied ownership token still owns it. */
|
|
16
|
+
extend(name: string, token: string, ttl?: number): Promise<boolean>;
|
|
17
|
+
/** Executes a function while holding a lock, releasing it in a finally block. */
|
|
18
|
+
using<T>(name: string, fn: (token: string) => Promise<T>, ttl?: number): Promise<T>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/lock/lock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKhE,wFAAwF;AACxF,qBAAa,SAAS;IAER,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAsB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAD/E,yGAAyG;gBAC5E,KAAK,EAAE,kBAAkB,EAAmB,MAAM,EAAE,UAAU;IAE3F,uDAAuD;IACvD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAEzB,yFAAyF;IACnF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOrF,4EAA4E;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE5D,2EAA2E;IACrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAyB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzF,iFAAiF;IAC3E,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,SAAyB,GAAG,OAAO,CAAC,CAAC,CAAC;CAK1G"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
const RELEASE = `if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end`;
|
|
3
|
+
const EXTEND = `if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('pexpire', KEYS[1], ARGV[2]) else return 0 end`;
|
|
4
|
+
/** Redis distributed lock using an ownership token and compare-and-delete semantics. */
|
|
5
|
+
export class RedisLock {
|
|
6
|
+
redis;
|
|
7
|
+
config;
|
|
8
|
+
/** Creates a lock bound to the shared Redis client. The client must be shared with the other modules. */
|
|
9
|
+
constructor(redis, config) {
|
|
10
|
+
this.redis = redis;
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
/** Builds the physical key for a logical lock name. */
|
|
14
|
+
key(name) { return `${this.config.namespace}:${name}`; }
|
|
15
|
+
/** Attempts to acquire a lock and returns a cryptographically random ownership token. */
|
|
16
|
+
async acquire(name, ttl = this.config.defaultTtl) {
|
|
17
|
+
if (ttl <= 0 || ttl > this.config.maxTtl)
|
|
18
|
+
throw new RangeError('Lock TTL is outside the configured bounds');
|
|
19
|
+
const token = randomBytes(32).toString('base64url');
|
|
20
|
+
const result = await this.redis.set(this.key(name), token, 'PX', String(ttl * 1000), 'NX');
|
|
21
|
+
return { acquired: result === 'OK', token };
|
|
22
|
+
}
|
|
23
|
+
/** Releases a lock only when the supplied ownership token still owns it. */
|
|
24
|
+
async release(name, token) { return Number(await this.redis.eval(RELEASE, 1, this.key(name), token)) === 1; }
|
|
25
|
+
/** Extends a lock only when the supplied ownership token still owns it. */
|
|
26
|
+
async extend(name, token, ttl = this.config.defaultTtl) {
|
|
27
|
+
if (ttl <= 0 || ttl > this.config.maxTtl)
|
|
28
|
+
throw new RangeError('Lock TTL is outside the configured bounds');
|
|
29
|
+
return Number(await this.redis.eval(EXTEND, 1, this.key(name), token, String(ttl * 1000))) === 1;
|
|
30
|
+
}
|
|
31
|
+
/** Executes a function while holding a lock, releasing it in a finally block. */
|
|
32
|
+
async using(name, fn, ttl = this.config.defaultTtl) {
|
|
33
|
+
const acquired = await this.acquire(name, ttl);
|
|
34
|
+
if (!acquired.acquired)
|
|
35
|
+
throw new Error(`Lock is already held: ${name}`);
|
|
36
|
+
try {
|
|
37
|
+
return await fn(acquired.token);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await this.release(name, acquired.token);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lock/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,MAAM,OAAO,GAAG,mGAAmG,CAAC;AACpH,MAAM,MAAM,GAAG,gHAAgH,CAAC;AAEhI,wFAAwF;AACxF,MAAM,OAAO,SAAS;IAES;IAA4C;IADzE,yGAAyG;IACzG,YAA6B,KAAyB,EAAmB,MAAkB;QAA9D,UAAK,GAAL,KAAK,CAAoB;QAAmB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE/F,uDAAuD;IACvD,GAAG,CAAC,IAAY,IAAY,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAExE,yFAAyF;IACzF,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;QACtD,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;QAC5G,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3F,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAAa,IAAsB,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE/I,2EAA2E;IAC3E,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,KAAa,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;QACpE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;QAC5G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnG,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,KAAK,CAAI,IAAY,EAAE,EAAiC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;QAC1F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;IAChG,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Normalized configuration for {@link RedisLock}. */
|
|
2
|
+
export interface LockConfig {
|
|
3
|
+
/** Whether the application has enabled the module. The class remains directly constructible when false; {@link RedisClient}'s `lock` getter throws when disabled. */
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
/** Prefix used for physical lock keys. */
|
|
6
|
+
namespace: string;
|
|
7
|
+
/** Default lease duration in seconds. */
|
|
8
|
+
defaultTtl: number;
|
|
9
|
+
/** Maximum permitted lease duration in seconds. */
|
|
10
|
+
maxTtl: number;
|
|
11
|
+
}
|
|
12
|
+
/** Result of a distributed-lock acquisition attempt. */
|
|
13
|
+
export interface LockAcquireResult {
|
|
14
|
+
/** True when this caller acquired ownership. */
|
|
15
|
+
acquired: boolean;
|
|
16
|
+
/** Random ownership secret. Never log or expose it to untrusted callers. */
|
|
17
|
+
token: string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lock/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,WAAW,UAAU;IACzB,qKAAqK;IACrK,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lock/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules-config.d.ts","sourceRoot":"","sources":["../src/modules-config.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules-config.js","sourceRoot":"","sources":["../src/modules-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { PubSubConfig } from './types.js';
|
|
3
|
+
/** Runtime schema for Pub/Sub configuration. */
|
|
4
|
+
export declare const PubSubConfigSchema: z.ZodObject<{
|
|
5
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
+
channelPrefix: z.ZodDefault<z.ZodString>;
|
|
7
|
+
maxMessageBytes: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
/** Validates and normalizes Pub/Sub configuration. */
|
|
10
|
+
export declare function parsePubSubConfig(input: unknown): PubSubConfig;
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/pubsub/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,gDAAgD;AAChD,eAAO,MAAM,kBAAkB;;;;iBAA0M,CAAC;AAC1O,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAkE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Runtime schema for Pub/Sub configuration. */
|
|
3
|
+
export const PubSubConfigSchema = z.object({ enabled: z.boolean().default(false), channelPrefix: z.string().min(1).max(128).default('events'), maxMessageBytes: z.number().int().positive().max(16 * 1024 * 1024).default(1024 * 1024) });
|
|
4
|
+
/** Validates and normalizes Pub/Sub configuration. */
|
|
5
|
+
export function parsePubSubConfig(input) { return PubSubConfigSchema.parse(input ?? {}); }
|
|
6
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/pubsub/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gDAAgD;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1O,sDAAsD;AACtD,MAAM,UAAU,iBAAiB,CAAC,KAAc,IAAkB,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAiB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RedisClientWrapper } from '../redis/wrapper.js';
|
|
2
|
+
import type { PubSubConfig, PubSubMessage, Subscription } from './types.js';
|
|
3
|
+
/** JSON Pub/Sub abstraction using a dedicated subscriber connection. */
|
|
4
|
+
export declare class RedisPubSub {
|
|
5
|
+
private readonly redis;
|
|
6
|
+
private readonly config;
|
|
7
|
+
private readonly subscriber;
|
|
8
|
+
private readonly handlers;
|
|
9
|
+
/** Creates a Pub/Sub module using the same connection configuration as the shared client. */
|
|
10
|
+
constructor(redis: RedisClientWrapper, config: PubSubConfig);
|
|
11
|
+
/** Publishes a JSON value to a namespaced channel and returns subscriber count. */
|
|
12
|
+
publish<T>(channel: string, value: T): Promise<number>;
|
|
13
|
+
/** Subscribes to a namespaced channel and parses each JSON message. */
|
|
14
|
+
subscribe<T>(channel: string, handler: (message: PubSubMessage<T>) => void): Promise<Subscription>;
|
|
15
|
+
/** Closes the dedicated subscriber connection. */
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
/** Returns the physical namespaced channel. */
|
|
18
|
+
fullChannel(channel: string): string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=pubsub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../src/pubsub/pubsub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5E,wEAAwE;AACxE,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAsB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH/E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqD;IAC9E,6FAA6F;gBAChE,KAAK,EAAE,kBAAkB,EAAmB,MAAM,EAAE,YAAY;IAK7F,mFAAmF;IAC7E,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5D,uEAAuE;IACjE,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAYxG,kDAAkD;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC5B,+CAA+C;IAC/C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CACrC"}
|