ioredis-toolkit 0.0.1

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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +645 -0
  3. package/dist/cache.d.ts +298 -0
  4. package/dist/cache.js +606 -0
  5. package/dist/client.d.ts +177 -0
  6. package/dist/client.js +958 -0
  7. package/dist/cluster-slot.d.ts +4 -0
  8. package/dist/cluster-slot.js +31 -0
  9. package/dist/cluster.d.ts +79 -0
  10. package/dist/cluster.js +156 -0
  11. package/dist/errors.d.ts +30 -0
  12. package/dist/errors.js +63 -0
  13. package/dist/health.d.ts +39 -0
  14. package/dist/health.js +106 -0
  15. package/dist/index.d.ts +51 -0
  16. package/dist/index.js +44 -0
  17. package/dist/lock.d.ts +215 -0
  18. package/dist/lock.js +385 -0
  19. package/dist/logger.d.ts +12 -0
  20. package/dist/logger.js +40 -0
  21. package/dist/pubsub.d.ts +171 -0
  22. package/dist/pubsub.js +285 -0
  23. package/dist/ratelimiter.d.ts +162 -0
  24. package/dist/ratelimiter.js +289 -0
  25. package/dist/session/index.d.ts +23 -0
  26. package/dist/session/index.js +16 -0
  27. package/dist/session/revocation-store.d.ts +171 -0
  28. package/dist/session/revocation-store.js +310 -0
  29. package/dist/session/scripts/cleanup-index.lua +21 -0
  30. package/dist/session/scripts/conditional-update-encrypted.lua +60 -0
  31. package/dist/session/scripts/conditional-update.lua +63 -0
  32. package/dist/session/scripts/create.lua +68 -0
  33. package/dist/session/scripts/delete-by-user.lua +29 -0
  34. package/dist/session/scripts/delete.lua +15 -0
  35. package/dist/session/scripts/enforce-limit.lua +38 -0
  36. package/dist/session/scripts/revoke.lua +61 -0
  37. package/dist/session/scripts/rotate-encrypted.lua +107 -0
  38. package/dist/session/scripts/rotate.lua +119 -0
  39. package/dist/session/scripts/touch-encrypted.lua +89 -0
  40. package/dist/session/scripts/touch.lua +72 -0
  41. package/dist/session/scripts/validate.lua +90 -0
  42. package/dist/session/session-circuit-breaker.d.ts +42 -0
  43. package/dist/session/session-circuit-breaker.js +129 -0
  44. package/dist/session/session-config.d.ts +335 -0
  45. package/dist/session/session-config.js +162 -0
  46. package/dist/session/session-cookie.d.ts +72 -0
  47. package/dist/session/session-cookie.js +101 -0
  48. package/dist/session/session-encryption.d.ts +87 -0
  49. package/dist/session/session-encryption.js +139 -0
  50. package/dist/session/session-errors.d.ts +85 -0
  51. package/dist/session/session-errors.js +145 -0
  52. package/dist/session/session-health.d.ts +38 -0
  53. package/dist/session/session-health.js +60 -0
  54. package/dist/session/session-keys.d.ts +51 -0
  55. package/dist/session/session-keys.js +113 -0
  56. package/dist/session/session-manager.d.ts +59 -0
  57. package/dist/session/session-manager.js +94 -0
  58. package/dist/session/session-metrics.d.ts +33 -0
  59. package/dist/session/session-metrics.js +112 -0
  60. package/dist/session/session-repository.d.ts +161 -0
  61. package/dist/session/session-repository.js +683 -0
  62. package/dist/session/session-scripts.d.ts +36 -0
  63. package/dist/session/session-scripts.js +130 -0
  64. package/dist/session/session-serializer.d.ts +42 -0
  65. package/dist/session/session-serializer.js +248 -0
  66. package/dist/session/session-service.d.ts +104 -0
  67. package/dist/session/session-service.js +611 -0
  68. package/dist/session/session-token.d.ts +38 -0
  69. package/dist/session/session-token.js +86 -0
  70. package/dist/session/session-types.d.ts +253 -0
  71. package/dist/session/session-types.js +16 -0
  72. package/dist/types.d.ts +782 -0
  73. package/dist/types.js +140 -0
  74. package/package.json +97 -0
@@ -0,0 +1,177 @@
1
+ import { Cluster, Redis as RedisClient } from "ioredis";
2
+ import { type ClusterInfo, type ClusterSlotRange, type ConnectionStatus, type RedisConfigInput, type RedisMode } from "./types.js";
3
+ import { type LoggerLike } from "./logger.js";
4
+ import { Cache } from "./cache.js";
5
+ import { PubSub } from "./pubsub.js";
6
+ import { DistributedLock } from "./lock.js";
7
+ import { RateLimiter } from "./ratelimiter.js";
8
+ import { SessionManager } from "./session/session-manager.js";
9
+ export interface RedisClientOptions {
10
+ config: RedisConfigInput;
11
+ logger?: LoggerLike;
12
+ }
13
+ /**
14
+ * Cluster-only administrative/capability surface.
15
+ */
16
+ export interface ClusterCapabilities {
17
+ getClusterNodes(): RedisClient[];
18
+ getClusterSlots(): Promise<ClusterSlotRange[]>;
19
+ getClusterInfo(): ClusterInfo;
20
+ calculateSlot(key: string): number;
21
+ getSlotRanges(): Promise<Map<number, string[]>>;
22
+ getNodeForKey(key: string): Promise<RedisClient | null>;
23
+ isKeyServed(key: string): Promise<boolean>;
24
+ executeOnNode<T>(key: string, command: string, ...args: unknown[]): Promise<T>;
25
+ mgetClusterAware(keys: string[]): Promise<(string | null)[]>;
26
+ clearNamespaceClusterAware(prefix: string, options?: {
27
+ batchSize?: number;
28
+ scanCount?: number;
29
+ }): Promise<number>;
30
+ }
31
+ type ClusterMethodName = keyof ClusterCapabilities | "isCluster";
32
+ /**
33
+ * Public client surface specialized by Redis topology.
34
+ */
35
+ export type RedisClientForMode<M extends RedisMode> = M extends "cluster" ? Omit<RedisClientWrapper, "select" | ClusterMethodName> & ClusterCapabilities & {
36
+ isCluster(): true;
37
+ } : Omit<RedisClientWrapper, "isCluster" | "getClusterNodes" | "getClusterSlots" | "getClusterInfo" | "calculateSlot" | "getSlotRanges" | "getNodeForKey" | "isKeyServed" | "executeOnNode" | "mgetClusterAware" | "clearNamespaceClusterAware"> & {
38
+ isCluster(): false;
39
+ };
40
+ type RedisUnderlyingClient = RedisClient | Cluster;
41
+ type RedisCommandArgument = string | number | Buffer;
42
+ type ScanOptions = {
43
+ count?: number;
44
+ batchSize?: number;
45
+ };
46
+ type DeletePatternOptions = {
47
+ batchSize?: number;
48
+ scanCount?: number;
49
+ };
50
+ /**
51
+ * Production-grade Redis client wrapper supporting:
52
+ *
53
+ * - standalone Redis
54
+ * - Redis Sentinel
55
+ * - Redis Cluster
56
+ * - connection lifecycle handling
57
+ * - slow-command tracking
58
+ * - cluster-aware multi-key operations
59
+ * - cache
60
+ * - pub/sub
61
+ * - distributed locks
62
+ * - rate limiting
63
+ * - sessions
64
+ */
65
+ export declare class RedisClientWrapper {
66
+ private readonly client;
67
+ private _cache?;
68
+ private _pubsub?;
69
+ private _lock?;
70
+ private _rateLimiter?;
71
+ private _session?;
72
+ private readonly config;
73
+ private readonly logger;
74
+ private isReady;
75
+ constructor(config: RedisConfigInput, logger?: LoggerLike);
76
+ get mode(): RedisMode;
77
+ get cache(): Cache;
78
+ set cache(value: Cache);
79
+ get pubsub(): PubSub;
80
+ set pubsub(value: PubSub);
81
+ get lock(): DistributedLock;
82
+ set lock(value: DistributedLock);
83
+ get rateLimiter(): RateLimiter;
84
+ set rateLimiter(value: RateLimiter);
85
+ get session(): SessionManager;
86
+ set session(value: SessionManager);
87
+ private createClient;
88
+ private createClusterClient;
89
+ private createSentinelClient;
90
+ private createStandaloneClient;
91
+ private buildCommonRedisOptions;
92
+ private setupEventHandlers;
93
+ getRawClient<T extends RedisUnderlyingClient = RedisUnderlyingClient>(): T;
94
+ get raw(): RedisUnderlyingClient;
95
+ ping(): Promise<boolean>;
96
+ close(): Promise<void>;
97
+ private isClusterClient;
98
+ private exec;
99
+ get(key: string): Promise<string | null>;
100
+ set(key: string, value: string | Buffer, ttl?: number): Promise<"OK" | null>;
101
+ setexnx(key: string, value: string | Buffer, ttl?: number): Promise<"OK" | null>;
102
+ defineCommand(...args: Parameters<RedisClient["defineCommand"]>): ReturnType<RedisClient["defineCommand"]>;
103
+ eval(script: string, numKeys: number, ...args: RedisCommandArgument[]): Promise<unknown>;
104
+ evalsha(sha: string, script: string, numKeys: number, ...args: RedisCommandArgument[]): Promise<unknown>;
105
+ scriptLoad(script: string): Promise<string>;
106
+ setnx(key: string, value: string | Buffer, ttl?: number): Promise<number>;
107
+ del(...keys: string[]): Promise<number>;
108
+ getdel(key: string): Promise<string | null>;
109
+ exists(key: string): Promise<number>;
110
+ expire(key: string, ttl: number): Promise<number>;
111
+ ttl(key: string): Promise<number>;
112
+ incr(key: string): Promise<number>;
113
+ decr(key: string): Promise<number>;
114
+ incrby(key: string, amount: number): Promise<number>;
115
+ decrby(key: string, amount: number): Promise<number>;
116
+ time(): Promise<number>;
117
+ mget(...keys: string[]): Promise<(string | null)[]>;
118
+ mset(...pairs: Array<[
119
+ string,
120
+ string | Buffer
121
+ ]>): Promise<"OK">;
122
+ hget(key: string, field: string): Promise<string | null>;
123
+ hset(key: string, field: string, value: string | Buffer): Promise<number>;
124
+ hgetall(key: string): Promise<Record<string, string>>;
125
+ hdel(key: string, ...fields: string[]): Promise<number>;
126
+ sadd(key: string, ...members: string[]): Promise<number>;
127
+ srem(key: string, ...members: string[]): Promise<number>;
128
+ smembers(key: string): Promise<string[]>;
129
+ sismember(key: string, member: string): Promise<number>;
130
+ zadd(key: string, score: number, member: string): Promise<number>;
131
+ zrange(key: string, start: number, stop: number): Promise<string[]>;
132
+ zcard(key: string): Promise<number>;
133
+ zrem(key: string, ...members: string[]): Promise<number>;
134
+ pipeline(): ReturnType<RedisClient["pipeline"]>;
135
+ scanIterator(pattern: string, count?: number): AsyncIterable<string>;
136
+ scanCluster(pattern: string, options?: ScanOptions): AsyncIterable<string[]>;
137
+ isCluster(): boolean;
138
+ getClusterNodes(): RedisClient[];
139
+ getClusterSlots(): Promise<ClusterSlotRange[]>;
140
+ calculateSlot(key: string): number;
141
+ getNodeForKey(key: string): Promise<RedisClient | null>;
142
+ getSlotRanges(): Promise<Map<number, string[]>>;
143
+ isKeyServed(key: string): Promise<boolean>;
144
+ executeOnNode<T>(key: string, command: string, ...args: unknown[]): Promise<T>;
145
+ private executeCommandOnClient;
146
+ mgetClusterAware(keys: string[]): Promise<(string | null)[]>;
147
+ deletePattern(pattern: string, options?: DeletePatternOptions): Promise<number>;
148
+ clearNamespace(prefix: string, options?: DeletePatternOptions): Promise<number>;
149
+ clearNamespaceClusterAware(prefix: string, options?: DeletePatternOptions): Promise<number>;
150
+ getClusterInfo(): ClusterInfo;
151
+ info(section?: string): Promise<string>;
152
+ select(database: number): Promise<"OK">;
153
+ getConnectionStatus(): ConnectionStatus;
154
+ private runWithConcurrency;
155
+ }
156
+ /**
157
+ * Cluster-specific factory overload.
158
+ */
159
+ export declare function createRedisClient(config: Extract<RedisConfigInput, {
160
+ mode: "cluster";
161
+ }>, logger?: LoggerLike): RedisClientForMode<"cluster">;
162
+ /**
163
+ * Sentinel-specific factory overload.
164
+ */
165
+ export declare function createRedisClient(config: Extract<RedisConfigInput, {
166
+ mode: "sentinel";
167
+ }>, logger?: LoggerLike): RedisClientForMode<"sentinel">;
168
+ /**
169
+ * Standalone factory overload.
170
+ *
171
+ * Standalone is also the default topology, therefore the input type permits
172
+ * the discriminator to be omitted.
173
+ */
174
+ export declare function createRedisClient(config: Exclude<RedisConfigInput, {
175
+ mode: "cluster" | "sentinel";
176
+ }>, logger?: LoggerLike): RedisClientForMode<"standalone">;
177
+ export {};