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/types.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Rate Limiting
|
|
4
|
+
// ============================================================================
|
|
5
|
+
export const RateLimitAlgorithmSchema = z.enum(["fixed", "sliding"]);
|
|
6
|
+
export const RateLimitOptionsSchema = z.object({
|
|
7
|
+
limit: z.number().int().positive().default(100),
|
|
8
|
+
duration: z.number().int().positive().default(60),
|
|
9
|
+
algorithm: RateLimitAlgorithmSchema.default("sliding"),
|
|
10
|
+
namespace: z.string().min(1).default("ratelimit"),
|
|
11
|
+
});
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Redis Topology
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export const RedisModeSchema = z.enum(["standalone", "sentinel", "cluster"]);
|
|
16
|
+
export const RedisNodeSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
host: z.string().min(1),
|
|
19
|
+
port: z.number().int().min(1).max(65_535),
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// TLS
|
|
24
|
+
// ============================================================================
|
|
25
|
+
export const RedisTlsOptionsSchema = z
|
|
26
|
+
.object({
|
|
27
|
+
ca: z.string().optional(),
|
|
28
|
+
cert: z.string().optional(),
|
|
29
|
+
key: z.string().optional(),
|
|
30
|
+
rejectUnauthorized: z.boolean().default(true),
|
|
31
|
+
})
|
|
32
|
+
.strict();
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Session
|
|
35
|
+
// ============================================================================
|
|
36
|
+
export const SessionOptionsSchema = z.custom();
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Common Redis Configuration
|
|
39
|
+
// ============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Configuration shared by all Redis topologies.
|
|
42
|
+
*
|
|
43
|
+
* IMPORTANT:
|
|
44
|
+
* - This schema describes the user-facing input.
|
|
45
|
+
* - `.default()` makes the property optional on input while guaranteeing
|
|
46
|
+
* the value exists on output.
|
|
47
|
+
*/
|
|
48
|
+
export const BaseRedisConfigSchema = z
|
|
49
|
+
.object({
|
|
50
|
+
password: z.string().optional(),
|
|
51
|
+
username: z.string().optional(),
|
|
52
|
+
database: z.number().int().min(0).max(15).default(0),
|
|
53
|
+
tls: z.boolean().default(false),
|
|
54
|
+
tlsOptions: RedisTlsOptionsSchema.optional(),
|
|
55
|
+
maxRetries: z.number().int().min(0).max(10).default(3),
|
|
56
|
+
retryDelay: z.number().int().min(50).max(5_000).default(250),
|
|
57
|
+
connectionTimeout: z.number().int().min(100).default(5_000),
|
|
58
|
+
maxFanOutConcurrency: z.number().int().min(1).max(128).default(8),
|
|
59
|
+
maxBatchSize: z.number().int().min(1).max(10_000).default(500),
|
|
60
|
+
defaultTTL: z.number().int().min(0).default(3_600),
|
|
61
|
+
compressionThreshold: z.number().int().min(1).default(1_024),
|
|
62
|
+
slowCommandThreshold: z.number().int().min(0).default(1_000),
|
|
63
|
+
rateLimit: RateLimitOptionsSchema.default({
|
|
64
|
+
algorithm: "sliding",
|
|
65
|
+
duration: 60,
|
|
66
|
+
limit: 100,
|
|
67
|
+
namespace: "ratelimit",
|
|
68
|
+
}),
|
|
69
|
+
sessionOptions: z.custom().optional(),
|
|
70
|
+
})
|
|
71
|
+
.strict();
|
|
72
|
+
// ============================================================================
|
|
73
|
+
// Standalone Configuration
|
|
74
|
+
// ============================================================================
|
|
75
|
+
/**
|
|
76
|
+
* Standalone Redis configuration.
|
|
77
|
+
*
|
|
78
|
+
* `mode` is optional on input because standalone is the default topology.
|
|
79
|
+
*/
|
|
80
|
+
export const StandaloneRedisConfigSchema = BaseRedisConfigSchema.extend({
|
|
81
|
+
mode: z.literal("standalone").optional(),
|
|
82
|
+
host: z.string().min(1).default("localhost"),
|
|
83
|
+
port: z.number().int().min(1).max(65_535).default(6379),
|
|
84
|
+
url: z.url().optional(),
|
|
85
|
+
}).strict();
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// Sentinel Configuration
|
|
88
|
+
// ============================================================================
|
|
89
|
+
export const SentinelRedisConfigSchema = BaseRedisConfigSchema.extend({
|
|
90
|
+
mode: z.literal("sentinel"),
|
|
91
|
+
sentinelNodes: z.array(RedisNodeSchema).min(1),
|
|
92
|
+
sentinelMasterName: z.string().min(1),
|
|
93
|
+
}).strict();
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// Cluster Configuration
|
|
96
|
+
// ============================================================================
|
|
97
|
+
/**
|
|
98
|
+
* Redis Cluster only supports database 0.
|
|
99
|
+
*/
|
|
100
|
+
export const ClusterRedisConfigSchema = BaseRedisConfigSchema.extend({
|
|
101
|
+
mode: z.literal("cluster"),
|
|
102
|
+
clusterNodes: z.array(RedisNodeSchema).min(1),
|
|
103
|
+
database: z.literal(0).default(0),
|
|
104
|
+
}).strict();
|
|
105
|
+
// ============================================================================
|
|
106
|
+
// Public Redis Configuration
|
|
107
|
+
// ============================================================================
|
|
108
|
+
/**
|
|
109
|
+
* Raw configuration union.
|
|
110
|
+
*
|
|
111
|
+
* This is intentionally a normal union rather than a discriminated union
|
|
112
|
+
* because standalone allows `mode` to be omitted.
|
|
113
|
+
*/
|
|
114
|
+
export const RedisConfigInputSchema = z.union([
|
|
115
|
+
StandaloneRedisConfigSchema,
|
|
116
|
+
SentinelRedisConfigSchema,
|
|
117
|
+
ClusterRedisConfigSchema,
|
|
118
|
+
]);
|
|
119
|
+
/**
|
|
120
|
+
* Normalized configuration.
|
|
121
|
+
*
|
|
122
|
+
* After parsing:
|
|
123
|
+
*
|
|
124
|
+
* - standalone.mode === "standalone"
|
|
125
|
+
* - sentinel.mode === "sentinel"
|
|
126
|
+
* - cluster.mode === "cluster"
|
|
127
|
+
* - defaults have been materialized
|
|
128
|
+
*/
|
|
129
|
+
export const RedisConfigSchema = RedisConfigInputSchema.transform((config) => {
|
|
130
|
+
if (config.mode === "sentinel") {
|
|
131
|
+
return config;
|
|
132
|
+
}
|
|
133
|
+
if (config.mode === "cluster") {
|
|
134
|
+
return config;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
...config,
|
|
138
|
+
mode: "standalone",
|
|
139
|
+
};
|
|
140
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ioredis-toolkit",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Production-grade, type-safe Redis infrastructure for standalone, Sentinel, and Cluster deployments",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./types": {
|
|
14
|
+
"types": "./dist/types.d.ts",
|
|
15
|
+
"import": "./dist/types.js"
|
|
16
|
+
},
|
|
17
|
+
"./client": {
|
|
18
|
+
"types": "./dist/client.d.ts",
|
|
19
|
+
"import": "./dist/client.js"
|
|
20
|
+
},
|
|
21
|
+
"./cache": {
|
|
22
|
+
"types": "./dist/cache.d.ts",
|
|
23
|
+
"import": "./dist/cache.js"
|
|
24
|
+
},
|
|
25
|
+
"./pubsub": {
|
|
26
|
+
"types": "./dist/pubsub.d.ts",
|
|
27
|
+
"import": "./dist/pubsub.js"
|
|
28
|
+
},
|
|
29
|
+
"./lock": {
|
|
30
|
+
"types": "./dist/lock.d.ts",
|
|
31
|
+
"import": "./dist/lock.js"
|
|
32
|
+
},
|
|
33
|
+
"./health": {
|
|
34
|
+
"types": "./dist/health.d.ts",
|
|
35
|
+
"import": "./dist/health.js"
|
|
36
|
+
},
|
|
37
|
+
"./ratelimiter": {
|
|
38
|
+
"types": "./dist/ratelimiter.d.ts",
|
|
39
|
+
"import": "./dist/ratelimiter.js"
|
|
40
|
+
},
|
|
41
|
+
"./session": {
|
|
42
|
+
"types": "./dist/session/index.d.ts",
|
|
43
|
+
"import": "./dist/session/index.js"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public",
|
|
48
|
+
"registry": "https://registry.npmjs.org/"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsc && node scripts/copy-assets.mjs",
|
|
52
|
+
"build:watch": "tsc --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"typecheck": "tsc --noEmit",
|
|
56
|
+
"test:coverage": "vitest run --coverage",
|
|
57
|
+
"format": "prettier --write 'src/**/*.ts'",
|
|
58
|
+
"clean:git": "git clean -xdf",
|
|
59
|
+
"changeset:init": "changeset init",
|
|
60
|
+
"changeset": "changeset",
|
|
61
|
+
"version": "changeset version",
|
|
62
|
+
"publish": "changeset publish",
|
|
63
|
+
"release": "npm run build && changeset publish",
|
|
64
|
+
"prebuild": "npm run typecheck",
|
|
65
|
+
"test:unit": "vitest run test/cluster-slot.test.ts test/config.test.ts test/client.test.ts test/cache.test.ts test/ratelimiter.test.ts"
|
|
66
|
+
},
|
|
67
|
+
"keywords": [
|
|
68
|
+
"redis",
|
|
69
|
+
"cluster",
|
|
70
|
+
"sentinel",
|
|
71
|
+
"distributed",
|
|
72
|
+
"cache",
|
|
73
|
+
"pubsub",
|
|
74
|
+
"locking"
|
|
75
|
+
],
|
|
76
|
+
"author": "Your Organization",
|
|
77
|
+
"license": "MIT",
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"ioredis": "^5.11.1",
|
|
80
|
+
"zod": "^4.4.3"
|
|
81
|
+
},
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=22.0.0"
|
|
84
|
+
},
|
|
85
|
+
"files": [
|
|
86
|
+
"dist",
|
|
87
|
+
"README.md",
|
|
88
|
+
"LICENSE"
|
|
89
|
+
],
|
|
90
|
+
"devDependencies": {
|
|
91
|
+
"@changesets/changelog-github": "^0.7.0",
|
|
92
|
+
"@changesets/cli": "^2.31.1",
|
|
93
|
+
"@types/node": "^26.2.0",
|
|
94
|
+
"typescript": "^7.0.2",
|
|
95
|
+
"vitest": "^4.1.10"
|
|
96
|
+
}
|
|
97
|
+
}
|