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.
- package/LICENSE +21 -0
- package/README.md +645 -0
- package/dist/cache.d.ts +298 -0
- package/dist/cache.js +606 -0
- package/dist/client.d.ts +177 -0
- package/dist/client.js +958 -0
- package/dist/cluster-slot.d.ts +4 -0
- package/dist/cluster-slot.js +31 -0
- package/dist/cluster.d.ts +79 -0
- package/dist/cluster.js +156 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.js +63 -0
- package/dist/health.d.ts +39 -0
- package/dist/health.js +106 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +44 -0
- package/dist/lock.d.ts +215 -0
- package/dist/lock.js +385 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.js +40 -0
- package/dist/pubsub.d.ts +171 -0
- package/dist/pubsub.js +285 -0
- package/dist/ratelimiter.d.ts +162 -0
- package/dist/ratelimiter.js +289 -0
- package/dist/session/index.d.ts +23 -0
- package/dist/session/index.js +16 -0
- package/dist/session/revocation-store.d.ts +171 -0
- package/dist/session/revocation-store.js +310 -0
- package/dist/session/scripts/cleanup-index.lua +21 -0
- package/dist/session/scripts/conditional-update-encrypted.lua +60 -0
- package/dist/session/scripts/conditional-update.lua +63 -0
- package/dist/session/scripts/create.lua +68 -0
- package/dist/session/scripts/delete-by-user.lua +29 -0
- package/dist/session/scripts/delete.lua +15 -0
- package/dist/session/scripts/enforce-limit.lua +38 -0
- package/dist/session/scripts/revoke.lua +61 -0
- package/dist/session/scripts/rotate-encrypted.lua +107 -0
- package/dist/session/scripts/rotate.lua +119 -0
- package/dist/session/scripts/touch-encrypted.lua +89 -0
- package/dist/session/scripts/touch.lua +72 -0
- package/dist/session/scripts/validate.lua +90 -0
- package/dist/session/session-circuit-breaker.d.ts +42 -0
- package/dist/session/session-circuit-breaker.js +129 -0
- package/dist/session/session-config.d.ts +335 -0
- package/dist/session/session-config.js +162 -0
- package/dist/session/session-cookie.d.ts +72 -0
- package/dist/session/session-cookie.js +101 -0
- package/dist/session/session-encryption.d.ts +87 -0
- package/dist/session/session-encryption.js +139 -0
- package/dist/session/session-errors.d.ts +85 -0
- package/dist/session/session-errors.js +145 -0
- package/dist/session/session-health.d.ts +38 -0
- package/dist/session/session-health.js +60 -0
- package/dist/session/session-keys.d.ts +51 -0
- package/dist/session/session-keys.js +113 -0
- package/dist/session/session-manager.d.ts +59 -0
- package/dist/session/session-manager.js +94 -0
- package/dist/session/session-metrics.d.ts +33 -0
- package/dist/session/session-metrics.js +112 -0
- package/dist/session/session-repository.d.ts +161 -0
- package/dist/session/session-repository.js +683 -0
- package/dist/session/session-scripts.d.ts +36 -0
- package/dist/session/session-scripts.js +130 -0
- package/dist/session/session-serializer.d.ts +42 -0
- package/dist/session/session-serializer.js +248 -0
- package/dist/session/session-service.d.ts +104 -0
- package/dist/session/session-service.js +611 -0
- package/dist/session/session-token.d.ts +38 -0
- package/dist/session/session-token.js +86 -0
- package/dist/session/session-types.d.ts +253 -0
- package/dist/session/session-types.js +16 -0
- package/dist/types.d.ts +782 -0
- package/dist/types.js +140 -0
- package/package.json +97 -0
package/dist/client.d.ts
ADDED
|
@@ -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 {};
|