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
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
+ }