ioredis-toolkit 0.0.10 → 0.0.12

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.
Files changed (256) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/LICENSE +1 -1
  3. package/README.md +68 -1613
  4. package/dist/cache/cache.d.ts +30 -0
  5. package/dist/cache/cache.d.ts.map +1 -0
  6. package/dist/cache/cache.js +59 -0
  7. package/dist/cache/cache.js.map +1 -0
  8. package/dist/cache/config.d.ts +12 -0
  9. package/dist/cache/config.d.ts.map +1 -0
  10. package/dist/cache/config.js +13 -0
  11. package/dist/cache/config.js.map +1 -0
  12. package/dist/cache/types.d.ts +32 -0
  13. package/dist/cache/types.d.ts.map +1 -0
  14. package/dist/cache/types.js +5 -0
  15. package/dist/cache/types.js.map +1 -0
  16. package/dist/index.d.ts +43 -51
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +32 -44
  19. package/dist/index.js.map +1 -0
  20. package/dist/lock/config.d.ts +12 -0
  21. package/dist/lock/config.d.ts.map +1 -0
  22. package/dist/lock/config.js +8 -0
  23. package/dist/lock/config.js.map +1 -0
  24. package/dist/lock/lock.d.ts +20 -0
  25. package/dist/lock/lock.d.ts.map +1 -0
  26. package/dist/lock/lock.js +44 -0
  27. package/dist/lock/lock.js.map +1 -0
  28. package/dist/lock/types.d.ts +19 -0
  29. package/dist/lock/types.d.ts.map +1 -0
  30. package/dist/lock/types.js +2 -0
  31. package/dist/lock/types.js.map +1 -0
  32. package/dist/modules-config.d.ts +3 -0
  33. package/dist/modules-config.d.ts.map +1 -0
  34. package/dist/modules-config.js +2 -0
  35. package/dist/modules-config.js.map +1 -0
  36. package/dist/pubsub/config.d.ts +11 -0
  37. package/dist/pubsub/config.d.ts.map +1 -0
  38. package/dist/pubsub/config.js +6 -0
  39. package/dist/pubsub/config.js.map +1 -0
  40. package/dist/pubsub/pubsub.d.ts +20 -0
  41. package/dist/pubsub/pubsub.d.ts.map +1 -0
  42. package/dist/pubsub/pubsub.js +54 -0
  43. package/dist/pubsub/pubsub.js.map +1 -0
  44. package/dist/pubsub/types.d.ts +24 -0
  45. package/dist/pubsub/types.d.ts.map +1 -0
  46. package/dist/pubsub/types.js +2 -0
  47. package/dist/pubsub/types.js.map +1 -0
  48. package/dist/rate-limit/config.d.ts +12 -0
  49. package/dist/rate-limit/config.d.ts.map +1 -0
  50. package/dist/rate-limit/config.js +6 -0
  51. package/dist/rate-limit/config.js.map +1 -0
  52. package/dist/rate-limit/rate-limiter.d.ts +18 -0
  53. package/dist/rate-limit/rate-limiter.d.ts.map +1 -0
  54. package/dist/rate-limit/rate-limiter.js +37 -0
  55. package/dist/rate-limit/rate-limiter.js.map +1 -0
  56. package/dist/rate-limit/types.d.ts +27 -0
  57. package/dist/rate-limit/types.d.ts.map +1 -0
  58. package/dist/rate-limit/types.js +2 -0
  59. package/dist/rate-limit/types.js.map +1 -0
  60. package/dist/redis/client-facade.d.ts +77 -0
  61. package/dist/redis/client-facade.d.ts.map +1 -0
  62. package/dist/redis/client-facade.js +102 -0
  63. package/dist/redis/client-facade.js.map +1 -0
  64. package/dist/redis/client.d.ts +10 -0
  65. package/dist/redis/client.d.ts.map +1 -0
  66. package/dist/redis/client.js +29 -0
  67. package/dist/redis/client.js.map +1 -0
  68. package/dist/redis/cluster.d.ts +7 -0
  69. package/dist/redis/cluster.d.ts.map +1 -0
  70. package/dist/redis/cluster.js +47 -0
  71. package/dist/redis/cluster.js.map +1 -0
  72. package/dist/redis/config.d.ts +39 -0
  73. package/dist/redis/config.d.ts.map +1 -0
  74. package/dist/redis/config.js +52 -0
  75. package/dist/redis/config.js.map +1 -0
  76. package/dist/redis/errors.d.ts +5 -0
  77. package/dist/redis/errors.d.ts.map +1 -0
  78. package/dist/redis/errors.js +5 -0
  79. package/dist/redis/errors.js.map +1 -0
  80. package/dist/redis/types.d.ts +135 -0
  81. package/dist/redis/types.d.ts.map +1 -0
  82. package/dist/redis/types.js +2 -0
  83. package/dist/redis/types.js.map +1 -0
  84. package/dist/redis/wrapper.d.ts +88 -0
  85. package/dist/redis/wrapper.d.ts.map +1 -0
  86. package/dist/redis/wrapper.js +206 -0
  87. package/dist/redis/wrapper.js.map +1 -0
  88. package/dist/session/config.d.ts +47 -0
  89. package/dist/session/config.d.ts.map +1 -0
  90. package/dist/session/config.js +101 -0
  91. package/dist/session/config.js.map +1 -0
  92. package/dist/session/cookie.d.ts +16 -0
  93. package/dist/session/cookie.d.ts.map +1 -0
  94. package/dist/session/cookie.js +28 -0
  95. package/dist/session/cookie.js.map +1 -0
  96. package/dist/session/errors.d.ts +56 -0
  97. package/dist/session/errors.d.ts.map +1 -0
  98. package/dist/session/errors.js +58 -0
  99. package/dist/session/errors.js.map +1 -0
  100. package/dist/session/factory.d.ts +21 -0
  101. package/dist/session/factory.d.ts.map +1 -0
  102. package/dist/session/factory.js +30 -0
  103. package/dist/session/factory.js.map +1 -0
  104. package/dist/session/health.d.ts +12 -0
  105. package/dist/session/health.d.ts.map +1 -0
  106. package/dist/session/health.js +23 -0
  107. package/dist/session/health.js.map +1 -0
  108. package/dist/session/keys.d.ts +23 -0
  109. package/dist/session/keys.d.ts.map +1 -0
  110. package/dist/session/keys.js +27 -0
  111. package/dist/session/keys.js.map +1 -0
  112. package/dist/session/manager.d.ts +34 -0
  113. package/dist/session/manager.d.ts.map +1 -0
  114. package/dist/session/manager.js +31 -0
  115. package/dist/session/manager.js.map +1 -0
  116. package/dist/session/metrics.d.ts +11 -0
  117. package/dist/session/metrics.d.ts.map +1 -0
  118. package/dist/session/metrics.js +10 -0
  119. package/dist/session/metrics.js.map +1 -0
  120. package/dist/session/repository.d.ts +49 -0
  121. package/dist/session/repository.d.ts.map +1 -0
  122. package/dist/session/repository.js +203 -0
  123. package/dist/session/repository.js.map +1 -0
  124. package/dist/session/revocation.d.ts +22 -0
  125. package/dist/session/revocation.d.ts.map +1 -0
  126. package/dist/session/revocation.js +41 -0
  127. package/dist/session/revocation.js.map +1 -0
  128. package/dist/session/script-sources.d.ts +11 -0
  129. package/dist/session/script-sources.d.ts.map +1 -0
  130. package/dist/session/script-sources.js +140 -0
  131. package/dist/session/script-sources.js.map +1 -0
  132. package/dist/session/scripts.d.ts +15 -0
  133. package/dist/session/scripts.d.ts.map +1 -0
  134. package/dist/session/scripts.js +41 -0
  135. package/dist/session/scripts.js.map +1 -0
  136. package/dist/session/serializer.d.ts +12 -0
  137. package/dist/session/serializer.d.ts.map +1 -0
  138. package/dist/session/serializer.js +77 -0
  139. package/dist/session/serializer.js.map +1 -0
  140. package/dist/session/service.d.ts +48 -0
  141. package/dist/session/service.d.ts.map +1 -0
  142. package/dist/session/service.js +235 -0
  143. package/dist/session/service.js.map +1 -0
  144. package/dist/session/token.d.ts +16 -0
  145. package/dist/session/token.d.ts.map +1 -0
  146. package/dist/session/token.js +32 -0
  147. package/dist/session/token.js.map +1 -0
  148. package/dist/session/types.d.ts +134 -0
  149. package/dist/session/types.d.ts.map +1 -0
  150. package/dist/session/types.js +2 -0
  151. package/dist/session/types.js.map +1 -0
  152. package/dist/streams/config.d.ts +12 -0
  153. package/dist/streams/config.d.ts.map +1 -0
  154. package/dist/streams/config.js +6 -0
  155. package/dist/streams/config.js.map +1 -0
  156. package/dist/streams/streams.d.ts +24 -0
  157. package/dist/streams/streams.d.ts.map +1 -0
  158. package/dist/streams/streams.js +55 -0
  159. package/dist/streams/streams.js.map +1 -0
  160. package/dist/streams/types.d.ts +32 -0
  161. package/dist/streams/types.d.ts.map +1 -0
  162. package/dist/streams/types.js +2 -0
  163. package/dist/streams/types.js.map +1 -0
  164. package/docs/ACCEPTANCE-REPORT.md +70 -0
  165. package/docs/ARCHITECTURE.md +61 -0
  166. package/docs/CAPACITY.md +33 -0
  167. package/docs/DEPLOYMENT.md +22 -0
  168. package/docs/README-API.md +15 -0
  169. package/docs/STATE-MACHINE.md +38 -0
  170. package/docs/TESTING.md +37 -0
  171. package/docs/THREAT-MODEL.md +23 -0
  172. package/docs/TYPE-SAFETY.md +34 -0
  173. package/docs/modules/cache/README.md +7 -0
  174. package/docs/modules/cache/usage.md +156 -0
  175. package/docs/modules/lock/README.md +7 -0
  176. package/docs/modules/lock/usage.md +105 -0
  177. package/docs/modules/pubsub/README.md +7 -0
  178. package/docs/modules/pubsub/usage.md +106 -0
  179. package/docs/modules/rate-limit/README.md +7 -0
  180. package/docs/modules/rate-limit/usage.md +100 -0
  181. package/docs/modules/sessions/README.md +7 -0
  182. package/docs/modules/sessions/usage.md +262 -0
  183. package/docs/modules/streams/README.md +7 -0
  184. package/docs/modules/streams/usage.md +141 -0
  185. package/package.json +50 -60
  186. package/dist/cache.d.ts +0 -797
  187. package/dist/cache.js +0 -1115
  188. package/dist/client.d.ts +0 -287
  189. package/dist/client.js +0 -1113
  190. package/dist/cluster-slot.d.ts +0 -4
  191. package/dist/cluster-slot.js +0 -31
  192. package/dist/cluster.d.ts +0 -79
  193. package/dist/cluster.js +0 -156
  194. package/dist/errors.d.ts +0 -30
  195. package/dist/errors.js +0 -63
  196. package/dist/health.d.ts +0 -180
  197. package/dist/health.js +0 -239
  198. package/dist/lock.d.ts +0 -233
  199. package/dist/lock.js +0 -440
  200. package/dist/logger.d.ts +0 -12
  201. package/dist/logger.js +0 -40
  202. package/dist/pubsub.d.ts +0 -423
  203. package/dist/pubsub.js +0 -537
  204. package/dist/ratelimiter.d.ts +0 -441
  205. package/dist/ratelimiter.js +0 -539
  206. package/dist/session/index.d.ts +0 -23
  207. package/dist/session/index.js +0 -16
  208. package/dist/session/revocation-store.d.ts +0 -176
  209. package/dist/session/revocation-store.js +0 -318
  210. package/dist/session/scripts/cleanup-index.lua +0 -21
  211. package/dist/session/scripts/conditional-update-encrypted.lua +0 -60
  212. package/dist/session/scripts/conditional-update.lua +0 -63
  213. package/dist/session/scripts/create.lua +0 -83
  214. package/dist/session/scripts/delete-by-user.lua +0 -29
  215. package/dist/session/scripts/delete.lua +0 -15
  216. package/dist/session/scripts/enforce-limit.lua +0 -38
  217. package/dist/session/scripts/revoke.lua +0 -61
  218. package/dist/session/scripts/rotate-encrypted.lua +0 -149
  219. package/dist/session/scripts/rotate.lua +0 -167
  220. package/dist/session/scripts/touch-encrypted.lua +0 -89
  221. package/dist/session/scripts/touch.lua +0 -72
  222. package/dist/session/scripts/validate.lua +0 -90
  223. package/dist/session/session-circuit-breaker.d.ts +0 -42
  224. package/dist/session/session-circuit-breaker.js +0 -129
  225. package/dist/session/session-config.d.ts +0 -355
  226. package/dist/session/session-config.js +0 -171
  227. package/dist/session/session-cookie.d.ts +0 -72
  228. package/dist/session/session-cookie.js +0 -101
  229. package/dist/session/session-encryption.d.ts +0 -87
  230. package/dist/session/session-encryption.js +0 -139
  231. package/dist/session/session-errors.d.ts +0 -85
  232. package/dist/session/session-errors.js +0 -145
  233. package/dist/session/session-health.d.ts +0 -38
  234. package/dist/session/session-health.js +0 -60
  235. package/dist/session/session-keys.d.ts +0 -64
  236. package/dist/session/session-keys.js +0 -128
  237. package/dist/session/session-manager.d.ts +0 -73
  238. package/dist/session/session-manager.js +0 -94
  239. package/dist/session/session-metrics.d.ts +0 -41
  240. package/dist/session/session-metrics.js +0 -135
  241. package/dist/session/session-repository.d.ts +0 -184
  242. package/dist/session/session-repository.js +0 -763
  243. package/dist/session/session-scripts.d.ts +0 -36
  244. package/dist/session/session-scripts.js +0 -130
  245. package/dist/session/session-serializer.d.ts +0 -42
  246. package/dist/session/session-serializer.js +0 -267
  247. package/dist/session/session-service.d.ts +0 -123
  248. package/dist/session/session-service.js +0 -670
  249. package/dist/session/session-token.d.ts +0 -38
  250. package/dist/session/session-token.js +0 -86
  251. package/dist/session/session-types.d.ts +0 -281
  252. package/dist/session/session-types.js +0 -16
  253. package/dist/types.d.ts +0 -924
  254. package/dist/types.js +0 -151
  255. package/dist/utils/deepmerge.d.ts +0 -9
  256. 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,5 @@
1
+ /** Thrown when a cached value cannot be decoded, or when the module is used while disabled. */
2
+ export class CacheError extends Error {
3
+ constructor(message, options) { super(message, options); this.name = 'CacheError'; }
4
+ }
5
+ //# sourceMappingURL=types.js.map
@@ -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 { RedisClientWrapper as RedisClient, createRedisClient } from './client.js';
2
- export type { RedisClientForMode, ClusterCapabilities } from './client.js';
3
- export { Cache } from './cache.js';
4
- export { PubSub } from './pubsub.js';
5
- export { DistributedLock } from './lock.js';
6
- export { HealthChecker } from './health.js';
7
- export { RateLimiter } from './ratelimiter.js';
8
- export type { RateLimitAlgorithm, RateLimitOptions, RateLimitResult } from './ratelimiter.js';
9
- export { createSessionManager } from './session/session-manager.js';
10
- export { SessionManager } from './session/session-manager.js';
11
- export type { SessionManagerOptions } from './session/session-manager.js';
12
- export { SessionService } from './session/session-service.js';
13
- export type { SessionServiceDeps } from './session/session-service.js';
14
- export { SessionRepository } from './session/session-repository.js';
15
- export { SessionKeyStrategy, encodeUserId } from './session/session-keys.js';
16
- export { SessionTokenManager } from './session/session-token.js';
17
- export { SessionMetrics } from './session/session-metrics.js';
18
- export type { SessionMetricsAdapter } from './session/session-metrics.js';
19
- export { SessionCircuitBreaker } from './session/session-circuit-breaker.js';
20
- export type { CircuitBreakerState } from './session/session-circuit-breaker.js';
21
- export { SessionHealthChecker } from './session/session-health.js';
22
- export type { SessionHealthStatus } from './session/session-health.js';
23
- export { SessionCookieManager, type SerializeCookieOptions, type SerializedCookie, type SerializedCookieAttributes, } from './session/session-cookie.js';
24
- export { parseSessionConfig, redactSessionConfig, TTL, IDLE_TIMEOUT, TOUCH_INTERVAL, } from './session/session-config.js';
25
- export type { SessionConfig, SessionConfigInput, PartialSessionConfig, } from './session/session-config.js';
26
- export { SessionError, SessionNotFoundError, SessionExpiredError, SessionRevokedError, SessionInvalidError, SessionRotationError, SessionReplayError, SessionStorageError, SessionSerializationError, SessionConfigurationError, SessionConcurrencyError, RevocationError, RevocationBatchError, CircuitBreakerOpenError, redactIdentifier, } from './session/session-errors.js';
27
- export { serializeSession, serializeEncryptedSession, deserializeSession, validateSessionRecord, envelopeKind, encryptedHeaderOf, assertHeaderMatches, } from './session/session-serializer.js';
28
- export { StaticSessionKeyProvider, createRandomSessionKeyProvider, toKeyBuffer, } from './session/session-encryption.js';
29
- export type { SessionKeyProvider } from './session/session-encryption.js';
30
- export type { SessionRecord, SessionCreateInput, SessionUpdatePatch, CreatedSession, RotatedSession, SessionValidationResult, SessionInvalidReason, TouchOutcome, SessionEnvelope, EncryptedSessionEnvelope, PlainSessionEnvelope, ListOptions, RotateOptions, TouchOptions, UpdateOptions, ValidateOptions, BindingMismatch, } from './session/session-types.js';
31
- export { RedisError } from './errors.js';
32
- export type { RedisConfig, RedisConfigInput, RedisCommonConfigInput, RedisMode, RedisNode, StandaloneRedisConfig, SentinelRedisConfig, ClusterRedisConfig, RedisConfigForMode, CacheOptions, LockInfo, DistributedLockOptions, HealthStatus, PubSubStats, PubSubMessage, ClusterInfo, ClusterSlotRange, ConnectionStatus, Redis } from './types.js';
33
- export { RedisConfigSchema } from './types.js';
34
- export { calculateRedisClusterSlot, hashTag } from './cluster-slot.js';
35
- export type { RedisConfig as RedisConfiguration } from './types.js';
36
- import { RedisClientWrapper as RedisClient, createRedisClient } from './client.js';
37
- import { Cache } from './cache.js';
38
- import { PubSub } from './pubsub.js';
39
- import { DistributedLock } from './lock.js';
40
- import { HealthChecker } from './health.js';
41
- import { RateLimiter } from './ratelimiter.js';
42
- declare const _default: {
43
- RedisClient: typeof RedisClient;
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
- // Core exports
2
- export { RedisClientWrapper as RedisClient, createRedisClient } from './client.js';
3
- export { Cache } from './cache.js';
4
- export { PubSub } from './pubsub.js';
5
- export { DistributedLock } from './lock.js';
6
- export { HealthChecker } from './health.js';
7
- export { RateLimiter } from './ratelimiter.js';
8
- // Session subsystem (new API; the legacy stores remain exported via ./session)
9
- export { createSessionManager } from './session/session-manager.js';
10
- export { SessionManager } from './session/session-manager.js';
11
- export { SessionService } from './session/session-service.js';
12
- export { SessionRepository } from './session/session-repository.js';
13
- export { SessionKeyStrategy, encodeUserId } from './session/session-keys.js';
14
- export { SessionTokenManager } from './session/session-token.js';
15
- export { SessionMetrics } from './session/session-metrics.js';
16
- export { SessionCircuitBreaker } from './session/session-circuit-breaker.js';
17
- export { SessionHealthChecker } from './session/session-health.js';
18
- export { SessionCookieManager, } from './session/session-cookie.js';
19
- export { parseSessionConfig, redactSessionConfig, TTL, IDLE_TIMEOUT, TOUCH_INTERVAL, } from './session/session-config.js';
20
- export { SessionError, SessionNotFoundError, SessionExpiredError, SessionRevokedError, SessionInvalidError, SessionRotationError, SessionReplayError, SessionStorageError, SessionSerializationError, SessionConfigurationError, SessionConcurrencyError, RevocationError, RevocationBatchError, CircuitBreakerOpenError, redactIdentifier, } from './session/session-errors.js';
21
- export { serializeSession, serializeEncryptedSession, deserializeSession, validateSessionRecord, envelopeKind, encryptedHeaderOf, assertHeaderMatches, } from './session/session-serializer.js';
22
- export { StaticSessionKeyProvider, createRandomSessionKeyProvider, toKeyBuffer, } from './session/session-encryption.js';
23
- // Re-export logger types for convenience
24
- // Error exports
25
- export { RedisError } from './errors.js';
26
- // Zod schema
27
- export { RedisConfigSchema } from './types.js';
28
- export { calculateRedisClusterSlot, hashTag } from './cluster-slot.js';
29
- // Default export
30
- import { RedisClientWrapper as RedisClient, createRedisClient } from './client.js';
31
- import { Cache } from './cache.js';
32
- import { PubSub } from './pubsub.js';
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lock/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Controls whether fluent module configuration merges with or replaces the global module configuration. */
2
+ export type ModuleConfigMode = 'merge' | 'replace';
3
+ //# sourceMappingURL=modules-config.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=modules-config.js.map
@@ -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"}