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.
Files changed (267) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +1 -1
  3. package/README.md +68 -1058
  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/src/scripts/cleanup-index.lua +4 -0
  187. package/src/scripts/conditional-update.lua +21 -0
  188. package/src/scripts/consume-session.lua +21 -0
  189. package/src/scripts/create-session.lua +28 -0
  190. package/src/scripts/delete.lua +2 -0
  191. package/src/scripts/destroy-user.lua +13 -0
  192. package/src/scripts/enforce-limit.lua +17 -0
  193. package/src/scripts/revoke-session.lua +13 -0
  194. package/src/scripts/rotate.lua +24 -0
  195. package/src/scripts/touch-session.lua +28 -0
  196. package/src/scripts/update-session.lua +18 -0
  197. package/dist/cache.d.ts +0 -796
  198. package/dist/cache.js +0 -1120
  199. package/dist/client.d.ts +0 -284
  200. package/dist/client.js +0 -1114
  201. package/dist/cluster-slot.d.ts +0 -4
  202. package/dist/cluster-slot.js +0 -31
  203. package/dist/cluster.d.ts +0 -79
  204. package/dist/cluster.js +0 -156
  205. package/dist/errors.d.ts +0 -30
  206. package/dist/errors.js +0 -63
  207. package/dist/health.d.ts +0 -180
  208. package/dist/health.js +0 -239
  209. package/dist/lock.d.ts +0 -248
  210. package/dist/lock.js +0 -397
  211. package/dist/logger.d.ts +0 -12
  212. package/dist/logger.js +0 -40
  213. package/dist/pubsub.d.ts +0 -423
  214. package/dist/pubsub.js +0 -537
  215. package/dist/ratelimiter.d.ts +0 -441
  216. package/dist/ratelimiter.js +0 -539
  217. package/dist/session/index.d.ts +0 -23
  218. package/dist/session/index.js +0 -16
  219. package/dist/session/revocation-store.d.ts +0 -176
  220. package/dist/session/revocation-store.js +0 -318
  221. package/dist/session/scripts/cleanup-index.lua +0 -21
  222. package/dist/session/scripts/conditional-update-encrypted.lua +0 -60
  223. package/dist/session/scripts/conditional-update.lua +0 -63
  224. package/dist/session/scripts/create.lua +0 -83
  225. package/dist/session/scripts/delete-by-user.lua +0 -29
  226. package/dist/session/scripts/delete.lua +0 -15
  227. package/dist/session/scripts/enforce-limit.lua +0 -38
  228. package/dist/session/scripts/revoke.lua +0 -61
  229. package/dist/session/scripts/rotate-encrypted.lua +0 -110
  230. package/dist/session/scripts/rotate.lua +0 -122
  231. package/dist/session/scripts/touch-encrypted.lua +0 -89
  232. package/dist/session/scripts/touch.lua +0 -72
  233. package/dist/session/scripts/validate.lua +0 -90
  234. package/dist/session/session-circuit-breaker.d.ts +0 -42
  235. package/dist/session/session-circuit-breaker.js +0 -129
  236. package/dist/session/session-config.d.ts +0 -335
  237. package/dist/session/session-config.js +0 -162
  238. package/dist/session/session-cookie.d.ts +0 -72
  239. package/dist/session/session-cookie.js +0 -101
  240. package/dist/session/session-encryption.d.ts +0 -87
  241. package/dist/session/session-encryption.js +0 -139
  242. package/dist/session/session-errors.d.ts +0 -85
  243. package/dist/session/session-errors.js +0 -145
  244. package/dist/session/session-health.d.ts +0 -38
  245. package/dist/session/session-health.js +0 -60
  246. package/dist/session/session-keys.d.ts +0 -51
  247. package/dist/session/session-keys.js +0 -113
  248. package/dist/session/session-manager.d.ts +0 -73
  249. package/dist/session/session-manager.js +0 -94
  250. package/dist/session/session-metrics.d.ts +0 -33
  251. package/dist/session/session-metrics.js +0 -112
  252. package/dist/session/session-repository.d.ts +0 -161
  253. package/dist/session/session-repository.js +0 -683
  254. package/dist/session/session-scripts.d.ts +0 -36
  255. package/dist/session/session-scripts.js +0 -130
  256. package/dist/session/session-serializer.d.ts +0 -42
  257. package/dist/session/session-serializer.js +0 -248
  258. package/dist/session/session-service.d.ts +0 -104
  259. package/dist/session/session-service.js +0 -611
  260. package/dist/session/session-token.d.ts +0 -38
  261. package/dist/session/session-token.js +0 -86
  262. package/dist/session/session-types.d.ts +0 -253
  263. package/dist/session/session-types.js +0 -16
  264. package/dist/types.d.ts +0 -924
  265. package/dist/types.js +0 -151
  266. package/dist/utils/deepmerge.d.ts +0 -9
  267. package/dist/utils/deepmerge.js +0 -61
package/dist/types.js DELETED
@@ -1,151 +0,0 @@
1
- import { z } from "zod";
2
- export const DistributedLockOptionsSchema = z.object({
3
- ttl: z.coerce.number().int().positive().default(30000),
4
- retryCount: z.coerce.number().int().positive().default(3),
5
- retryDelay: z.coerce.number().int().positive().default(200)
6
- });
7
- export const CacheOptionsSchema = z.object({
8
- defaultTTL: z.number().int().min(0).default(3_600),
9
- compressionThreshold: z.number().int().min(1).default(1_024),
10
- namespace: z.string().min(1).default("cache"),
11
- });
12
- // ============================================================================
13
- // Rate Limiting
14
- // ============================================================================
15
- export const RateLimitAlgorithmSchema = z.enum(["fixed", "sliding"]);
16
- export const RateLimitOptionsSchema = z.object({
17
- limit: z.number().int().positive().default(100),
18
- duration: z.number().int().positive().default(60),
19
- algorithm: RateLimitAlgorithmSchema.default("sliding"),
20
- namespace: z.string().min(1).default("ratelimit"),
21
- });
22
- // ============================================================================
23
- // Redis Topology
24
- // ============================================================================
25
- export const RedisModeSchema = z.enum(["standalone", "sentinel", "cluster"]);
26
- export const RedisNodeSchema = z
27
- .object({
28
- host: z.string().min(1),
29
- port: z.number().int().min(1).max(65_535),
30
- })
31
- .strict();
32
- // ============================================================================
33
- // TLS
34
- // ============================================================================
35
- export const RedisTlsOptionsSchema = z
36
- .object({
37
- ca: z.string().optional(),
38
- cert: z.string().optional(),
39
- key: z.string().optional(),
40
- rejectUnauthorized: z.boolean().default(true),
41
- })
42
- .strict();
43
- // ============================================================================
44
- // Session
45
- // ============================================================================
46
- export const SessionOptionsSchema = z.custom();
47
- // ============================================================================
48
- // Common Redis Configuration
49
- // ============================================================================
50
- /**
51
- * Configuration shared by all Redis topologies.
52
- *
53
- * IMPORTANT:
54
- * - This schema describes the user-facing input.
55
- * - `.default()` makes the property optional on input while guaranteeing
56
- * the value exists on output.
57
- */
58
- export const BaseRedisConfigSchema = z
59
- .object({
60
- password: z.string().optional(),
61
- username: z.string().optional(),
62
- database: z.number().int().min(0).max(15).default(0),
63
- tls: z.boolean().default(false),
64
- tlsOptions: RedisTlsOptionsSchema.optional(),
65
- maxRetries: z.number().int().min(0).max(10).default(3),
66
- retryDelay: z.number().int().min(50).max(5_000).default(250),
67
- connectionTimeout: z.number().int().min(100).default(5_000),
68
- maxFanOutConcurrency: z.number().int().min(1).max(128).default(8),
69
- maxBatchSize: z.number().int().min(1).max(10_000).default(500),
70
- lockOptions: DistributedLockOptionsSchema.optional(),
71
- cacheOptions: CacheOptionsSchema.optional(),
72
- slowCommandThreshold: z.number().int().min(0).default(1_000),
73
- rateLimit: RateLimitOptionsSchema.optional(),
74
- // rateLimit: RateLimitOptionsSchema.default({
75
- // algorithm: "sliding",
76
- // duration: 60,
77
- // limit: 100,
78
- // namespace: "ratelimit",
79
- // }),
80
- sessionOptions: z.custom().optional(),
81
- })
82
- .strict();
83
- // ============================================================================
84
- // Standalone Configuration
85
- // ============================================================================
86
- /**
87
- * Standalone Redis configuration.
88
- *
89
- * `mode` is optional on input because standalone is the default topology.
90
- */
91
- export const StandaloneRedisConfigSchema = BaseRedisConfigSchema.extend({
92
- mode: z.literal("standalone").optional(),
93
- host: z.string().min(1).default("localhost"),
94
- port: z.number().int().min(1).max(65_535).default(6379),
95
- url: z.url().optional(),
96
- }).strict();
97
- // ============================================================================
98
- // Sentinel Configuration
99
- // ============================================================================
100
- export const SentinelRedisConfigSchema = BaseRedisConfigSchema.extend({
101
- mode: z.literal("sentinel"),
102
- sentinelNodes: z.array(RedisNodeSchema).min(1),
103
- sentinelMasterName: z.string().min(1),
104
- }).strict();
105
- // ============================================================================
106
- // Cluster Configuration
107
- // ============================================================================
108
- /**
109
- * Redis Cluster only supports database 0.
110
- */
111
- export const ClusterRedisConfigSchema = BaseRedisConfigSchema.extend({
112
- mode: z.literal("cluster"),
113
- clusterNodes: z.array(RedisNodeSchema).min(1),
114
- database: z.literal(0).default(0),
115
- }).strict();
116
- // ============================================================================
117
- // Public Redis Configuration
118
- // ============================================================================
119
- /**
120
- * Raw configuration union.
121
- *
122
- * This is intentionally a normal union rather than a discriminated union
123
- * because standalone allows `mode` to be omitted.
124
- */
125
- export const RedisConfigInputSchema = z.union([
126
- StandaloneRedisConfigSchema,
127
- SentinelRedisConfigSchema,
128
- ClusterRedisConfigSchema,
129
- ]);
130
- /**
131
- * Normalized configuration.
132
- *
133
- * After parsing:
134
- *
135
- * - standalone.mode === "standalone"
136
- * - sentinel.mode === "sentinel"
137
- * - cluster.mode === "cluster"
138
- * - defaults have been materialized
139
- */
140
- export const RedisConfigSchema = RedisConfigInputSchema.transform((config) => {
141
- if (config.mode === "sentinel") {
142
- return config;
143
- }
144
- if (config.mode === "cluster") {
145
- return config;
146
- }
147
- return {
148
- ...config,
149
- mode: "standalone",
150
- };
151
- });
@@ -1,9 +0,0 @@
1
- type Builtin = Date | RegExp | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | Promise<unknown> | Error;
2
- type DeepMerge<T, U> = T extends Builtin ? U : U extends Builtin ? U : T extends readonly unknown[] ? U : U extends readonly unknown[] ? U : T extends object ? U extends object ? {
3
- [K in keyof T | keyof U]: K extends keyof U ? K extends keyof T ? DeepMerge<T[K], U[K]> : U[K] : K extends keyof T ? T[K] : never;
4
- } : U : U;
5
- export declare function deepMerge<T extends object>(target: T): T;
6
- export declare function deepMerge<T extends object, U extends object>(target: T, source: U): DeepMerge<T, U>;
7
- export declare function deepMerge<T extends object, U extends object, V extends object>(target: T, source: U, source2: V): DeepMerge<DeepMerge<T, U>, V>;
8
- export declare function deepMerge<T extends object, U extends object, V extends object, W extends object>(target: T, source: U, source2: V, source3: W): DeepMerge<DeepMerge<DeepMerge<T, U>, V>, W>;
9
- export {};
@@ -1,61 +0,0 @@
1
- const BLOCKED_KEYS = new Set(["__proto__", "prototype", "constructor"]);
2
- function isBlockedKey(key) {
3
- return typeof key === "string" && BLOCKED_KEYS.has(key);
4
- }
5
- function isPlainObject(value) {
6
- if (value === null || typeof value !== "object") {
7
- return false;
8
- }
9
- const prototype = Object.getPrototypeOf(value);
10
- return prototype === Object.prototype || prototype === null;
11
- }
12
- function deepMergeTwo(target, source) {
13
- // Non-objects and special objects are replaced.
14
- if (!isPlainObject(target) || !isPlainObject(source)) {
15
- return source;
16
- }
17
- const result = Object.create(Object.getPrototypeOf(target));
18
- // Copy target.
19
- for (const key of Reflect.ownKeys(target)) {
20
- if (isBlockedKey(key)) {
21
- continue;
22
- }
23
- const descriptor = Object.getOwnPropertyDescriptor(target, key);
24
- if (descriptor) {
25
- Object.defineProperty(result, key, descriptor);
26
- }
27
- }
28
- // Merge source.
29
- for (const key of Reflect.ownKeys(source)) {
30
- if (isBlockedKey(key)) {
31
- continue;
32
- }
33
- const sourceDescriptor = Object.getOwnPropertyDescriptor(source, key);
34
- if (!sourceDescriptor) {
35
- continue;
36
- }
37
- const sourceValue = sourceDescriptor.value;
38
- const targetDescriptor = Object.getOwnPropertyDescriptor(target, key);
39
- const targetValue = targetDescriptor?.value;
40
- if (targetDescriptor &&
41
- "value" in targetDescriptor &&
42
- isPlainObject(targetValue) &&
43
- isPlainObject(sourceValue)) {
44
- Object.defineProperty(result, key, {
45
- ...sourceDescriptor,
46
- value: deepMergeTwo(targetValue, sourceValue),
47
- });
48
- }
49
- else {
50
- Object.defineProperty(result, key, sourceDescriptor);
51
- }
52
- }
53
- return result;
54
- }
55
- export function deepMerge(target, ...sources) {
56
- let result = target;
57
- for (const source of sources) {
58
- result = deepMergeTwo(result, source);
59
- }
60
- return result;
61
- }