@mhbdev/redis 0.2.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 (123) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +173 -0
  4. package/dist/bullmq/adapter.d.ts +49 -0
  5. package/dist/bullmq/adapter.d.ts.map +1 -0
  6. package/dist/bullmq/adapter.js +56 -0
  7. package/dist/bullmq/adapter.js.map +1 -0
  8. package/dist/bullmq/index.d.ts +3 -0
  9. package/dist/bullmq/index.d.ts.map +1 -0
  10. package/dist/bullmq/index.js +2 -0
  11. package/dist/bullmq/index.js.map +1 -0
  12. package/dist/cache/cache.d.ts +31 -0
  13. package/dist/cache/cache.d.ts.map +1 -0
  14. package/dist/cache/cache.js +78 -0
  15. package/dist/cache/cache.js.map +1 -0
  16. package/dist/cache/index.d.ts +3 -0
  17. package/dist/cache/index.d.ts.map +1 -0
  18. package/dist/cache/index.js +2 -0
  19. package/dist/cache/index.js.map +1 -0
  20. package/dist/core/codec.d.ts +7 -0
  21. package/dist/core/codec.d.ts.map +1 -0
  22. package/dist/core/codec.js +24 -0
  23. package/dist/core/codec.js.map +1 -0
  24. package/dist/core/errors.d.ts +43 -0
  25. package/dist/core/errors.d.ts.map +1 -0
  26. package/dist/core/errors.js +84 -0
  27. package/dist/core/errors.js.map +1 -0
  28. package/dist/core/executor.d.ts +28 -0
  29. package/dist/core/executor.d.ts.map +1 -0
  30. package/dist/core/executor.js +27 -0
  31. package/dist/core/executor.js.map +1 -0
  32. package/dist/core/keys.d.ts +4 -0
  33. package/dist/core/keys.d.ts.map +1 -0
  34. package/dist/core/keys.js +15 -0
  35. package/dist/core/keys.js.map +1 -0
  36. package/dist/index.d.ts +15 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +11 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/ioredis/executor.d.ts +30 -0
  41. package/dist/ioredis/executor.d.ts.map +1 -0
  42. package/dist/ioredis/executor.js +52 -0
  43. package/dist/ioredis/executor.js.map +1 -0
  44. package/dist/ioredis/index.d.ts +5 -0
  45. package/dist/ioredis/index.d.ts.map +1 -0
  46. package/dist/ioredis/index.js +3 -0
  47. package/dist/ioredis/index.js.map +1 -0
  48. package/dist/ioredis/pubsub.d.ts +16 -0
  49. package/dist/ioredis/pubsub.d.ts.map +1 -0
  50. package/dist/ioredis/pubsub.js +42 -0
  51. package/dist/ioredis/pubsub.js.map +1 -0
  52. package/dist/locks/index.d.ts +3 -0
  53. package/dist/locks/index.d.ts.map +1 -0
  54. package/dist/locks/index.js +2 -0
  55. package/dist/locks/index.js.map +1 -0
  56. package/dist/locks/locks.d.ts +25 -0
  57. package/dist/locks/locks.d.ts.map +1 -0
  58. package/dist/locks/locks.js +77 -0
  59. package/dist/locks/locks.js.map +1 -0
  60. package/dist/node/client.d.ts +47 -0
  61. package/dist/node/client.d.ts.map +1 -0
  62. package/dist/node/client.js +155 -0
  63. package/dist/node/client.js.map +1 -0
  64. package/dist/node/errors.d.ts +3 -0
  65. package/dist/node/errors.d.ts.map +1 -0
  66. package/dist/node/errors.js +16 -0
  67. package/dist/node/errors.js.map +1 -0
  68. package/dist/node/index.d.ts +6 -0
  69. package/dist/node/index.d.ts.map +1 -0
  70. package/dist/node/index.js +4 -0
  71. package/dist/node/index.js.map +1 -0
  72. package/dist/node/pool.d.ts +31 -0
  73. package/dist/node/pool.d.ts.map +1 -0
  74. package/dist/node/pool.js +131 -0
  75. package/dist/node/pool.js.map +1 -0
  76. package/dist/node/pubsub.d.ts +16 -0
  77. package/dist/node/pubsub.d.ts.map +1 -0
  78. package/dist/node/pubsub.js +41 -0
  79. package/dist/node/pubsub.js.map +1 -0
  80. package/dist/pubsub/contracts.d.ts +6 -0
  81. package/dist/pubsub/contracts.d.ts.map +1 -0
  82. package/dist/pubsub/contracts.js +2 -0
  83. package/dist/pubsub/contracts.js.map +1 -0
  84. package/dist/pubsub/index.d.ts +3 -0
  85. package/dist/pubsub/index.d.ts.map +1 -0
  86. package/dist/pubsub/index.js +2 -0
  87. package/dist/pubsub/index.js.map +1 -0
  88. package/dist/pubsub/pubsub.d.ts +15 -0
  89. package/dist/pubsub/pubsub.d.ts.map +1 -0
  90. package/dist/pubsub/pubsub.js +62 -0
  91. package/dist/pubsub/pubsub.js.map +1 -0
  92. package/dist/queue/index.d.ts +3 -0
  93. package/dist/queue/index.d.ts.map +1 -0
  94. package/dist/queue/index.js +2 -0
  95. package/dist/queue/index.js.map +1 -0
  96. package/dist/queue/queue.d.ts +78 -0
  97. package/dist/queue/queue.d.ts.map +1 -0
  98. package/dist/queue/queue.js +260 -0
  99. package/dist/queue/queue.js.map +1 -0
  100. package/dist/rate-limit/contracts.d.ts +93 -0
  101. package/dist/rate-limit/contracts.d.ts.map +1 -0
  102. package/dist/rate-limit/contracts.js +304 -0
  103. package/dist/rate-limit/contracts.js.map +1 -0
  104. package/dist/rate-limit/index.d.ts +3 -0
  105. package/dist/rate-limit/index.d.ts.map +1 -0
  106. package/dist/rate-limit/index.js +2 -0
  107. package/dist/rate-limit/index.js.map +1 -0
  108. package/dist/testing/fake-executor.d.ts +9 -0
  109. package/dist/testing/fake-executor.d.ts.map +1 -0
  110. package/dist/testing/fake-executor.js +15 -0
  111. package/dist/testing/fake-executor.js.map +1 -0
  112. package/dist/testing/index.d.ts +2 -0
  113. package/dist/testing/index.d.ts.map +1 -0
  114. package/dist/testing/index.js +2 -0
  115. package/dist/testing/index.js.map +1 -0
  116. package/docs/adapters.md +41 -0
  117. package/docs/architecture.md +41 -0
  118. package/docs/errors.md +27 -0
  119. package/docs/migration.md +21 -0
  120. package/docs/queues.md +13 -0
  121. package/docs/rate-limiting.md +23 -0
  122. package/docs/releasing.md +45 -0
  123. package/package.json +135 -0
@@ -0,0 +1,155 @@
1
+ import { createClient, } from "redis";
2
+ import { asError, RedisClientStateError, RedisConnectionError } from "../core/errors.js";
3
+ import { assertPositiveInteger, withTimeout, } from "../core/executor.js";
4
+ import { normalizeNodeRedisError } from "./errors.js";
5
+ export class RedisClient {
6
+ client;
7
+ options;
8
+ connecting = null;
9
+ closing = null;
10
+ closed = false;
11
+ constructor(options) {
12
+ if (!options.url.trim())
13
+ throw new RedisConnectionError("Redis URL is required");
14
+ this.options = {
15
+ ...options,
16
+ connectTimeoutMs: options.connectTimeoutMs ?? 3_000,
17
+ commandTimeoutMs: options.commandTimeoutMs ?? 3_000,
18
+ maxReconnectAttempts: options.maxReconnectAttempts ?? 3,
19
+ reconnectBaseDelayMs: options.reconnectBaseDelayMs ?? 100,
20
+ reconnectMaxDelayMs: options.reconnectMaxDelayMs ?? 1_000,
21
+ disableOfflineQueue: options.disableOfflineQueue ?? true,
22
+ };
23
+ assertPositiveInteger(this.options.connectTimeoutMs, "Redis connect timeout");
24
+ assertPositiveInteger(this.options.commandTimeoutMs, "Redis command timeout");
25
+ this.client = this.createClient();
26
+ }
27
+ get isReady() {
28
+ return this.client.isReady;
29
+ }
30
+ get isOpen() {
31
+ return this.client.isOpen;
32
+ }
33
+ createClient() {
34
+ const client = createClient({
35
+ ...this.options.clientOptions,
36
+ url: this.options.url,
37
+ disableOfflineQueue: this.options.disableOfflineQueue,
38
+ socket: {
39
+ ...this.options.clientOptions?.socket,
40
+ connectTimeout: this.options.connectTimeoutMs,
41
+ reconnectStrategy: (attempts) => {
42
+ if (attempts >= this.options.maxReconnectAttempts)
43
+ return false;
44
+ return Math.min(this.options.reconnectBaseDelayMs * 2 ** attempts, this.options.reconnectMaxDelayMs);
45
+ },
46
+ },
47
+ });
48
+ client.on("error", (error) => {
49
+ const normalized = asError(error);
50
+ this.options.onError?.(normalized);
51
+ this.options.hooks?.onError?.(normalized);
52
+ this.options.hooks?.onStateChange?.("error");
53
+ });
54
+ client.on("ready", () => this.options.hooks?.onStateChange?.("ready"));
55
+ client.on("reconnecting", () => this.options.hooks?.onStateChange?.("connecting"));
56
+ return client;
57
+ }
58
+ replaceClient() {
59
+ if (this.closed)
60
+ return;
61
+ if (this.client.isOpen)
62
+ this.client.destroy();
63
+ this.client = this.createClient();
64
+ }
65
+ async connect() {
66
+ if (this.closed)
67
+ throw new RedisClientStateError("The Redis client has been closed");
68
+ if (this.client.isReady)
69
+ return;
70
+ this.connecting ??= withTimeout(async () => {
71
+ this.options.hooks?.onStateChange?.("connecting");
72
+ try {
73
+ await this.client.connect();
74
+ }
75
+ catch (error) {
76
+ this.replaceClient();
77
+ throw new RedisConnectionError("Redis connection failed", error);
78
+ }
79
+ }, this.options.connectTimeoutMs, "Redis connection timed out")
80
+ .catch((error) => {
81
+ this.replaceClient();
82
+ throw error;
83
+ })
84
+ .finally(() => {
85
+ this.connecting = null;
86
+ });
87
+ await this.connecting;
88
+ if (this.closed)
89
+ throw new RedisClientStateError("The Redis client was closed while connecting");
90
+ }
91
+ async execute(command, options = {}) {
92
+ await this.connect();
93
+ const started = Date.now();
94
+ this.options.hooks?.onCommandStart?.(command);
95
+ try {
96
+ return await withTimeout((signal) => this.sendCommand(command, options.signal ?? signal), this.options.commandTimeoutMs);
97
+ }
98
+ finally {
99
+ this.options.hooks?.onCommandEnd?.(command, Date.now() - started);
100
+ }
101
+ }
102
+ async sendCommand(command, signal) {
103
+ try {
104
+ const client = this.client;
105
+ return (await client.withAbortSignal(signal).sendCommand([...command]));
106
+ }
107
+ catch (error) {
108
+ throw normalizeNodeRedisError(error);
109
+ }
110
+ }
111
+ async eval(script, options, request = {}) {
112
+ const command = [
113
+ "EVAL",
114
+ script,
115
+ String(options.keys?.length ?? 0),
116
+ ...(options.keys ?? []),
117
+ ...(options.arguments ?? []),
118
+ ];
119
+ return this.execute(command, request);
120
+ }
121
+ async ping() {
122
+ await this.execute(["PING"]);
123
+ }
124
+ raw() {
125
+ return this.client;
126
+ }
127
+ async close() {
128
+ this.closing ??= (async () => {
129
+ this.closed = true;
130
+ await this.connecting?.catch(() => undefined);
131
+ if (this.client.isOpen)
132
+ await this.client.close();
133
+ this.options.hooks?.onStateChange?.("closed");
134
+ })();
135
+ await this.closing;
136
+ }
137
+ }
138
+ export function createRedisClient(options) {
139
+ return new RedisClient(options);
140
+ }
141
+ /**
142
+ * Creates, connects, and closes a managed client around one operation.
143
+ * This is useful for scripts, jobs, and request-scoped composition tests.
144
+ */
145
+ export async function withRedisClient(options, operation) {
146
+ const redis = createRedisClient(options);
147
+ try {
148
+ await redis.connect();
149
+ return await operation(redis);
150
+ }
151
+ finally {
152
+ await redis.close();
153
+ }
154
+ }
155
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/node/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { RedisError } from "../core/errors.js";
2
+ export declare function normalizeNodeRedisError(error: unknown): RedisError;
3
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/node/errors.ts"],"names":[],"mappings":"AAQA,OAAO,EAEN,UAAU,EAKV,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAUlE"}
@@ -0,0 +1,16 @@
1
+ import { AbortError, ClientClosedError, ConnectionTimeoutError, ErrorReply, TimeoutError, } from "redis";
2
+ import { RedisClientStateError, RedisError, RedisProtocolError, RedisRequestAbortedError, RedisTimeoutError, RedisUnavailableError, } from "../core/errors.js";
3
+ export function normalizeNodeRedisError(error) {
4
+ if (error instanceof RedisError)
5
+ return error;
6
+ if (error instanceof AbortError)
7
+ return new RedisRequestAbortedError(error);
8
+ if (error instanceof ConnectionTimeoutError || error instanceof TimeoutError)
9
+ return new RedisTimeoutError("Redis command timed out", error);
10
+ if (error instanceof ClientClosedError)
11
+ return new RedisClientStateError("The Redis client has been closed");
12
+ if (error instanceof ErrorReply)
13
+ return new RedisProtocolError("Redis rejected the command", error);
14
+ return new RedisUnavailableError(error);
15
+ }
16
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/node/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,YAAY,GACZ,MAAM,OAAO,CAAC;AAEf,OAAO,EACN,qBAAqB,EACrB,UAAU,EACV,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACrD,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,KAAK,YAAY,sBAAsB,IAAI,KAAK,YAAY,YAAY;QAC3E,OAAO,IAAI,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChE,IAAI,KAAK,YAAY,iBAAiB;QACrC,OAAO,IAAI,qBAAqB,CAAC,kCAAkC,CAAC,CAAC;IACtE,IAAI,KAAK,YAAY,UAAU;QAC9B,OAAO,IAAI,kBAAkB,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACpE,OAAO,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { NodeRedisClient, RedisClientOptions } from "./client.js";
2
+ export { createRedisClient, RedisClient, withRedisClient } from "./client.js";
3
+ export type { RedisPoolOptions } from "./pool.js";
4
+ export { createRedisPool, RedisPool, withRedisPool } from "./pool.js";
5
+ export { createNodePubSubTransport, createNodeTypedPubSub } from "./pubsub.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9E,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createRedisClient, RedisClient, withRedisClient } from "./client.js";
2
+ export { createRedisPool, RedisPool, withRedisPool } from "./pool.js";
3
+ export { createNodePubSubTransport, createNodeTypedPubSub } from "./pubsub.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type RedisClientOptions as NodeRedisOptions } from "redis";
2
+ import { type RedisCommand, type RedisExecutor, type RedisScriptOptions } from "../core/executor.js";
3
+ import type { RedisClientOptions } from "./client.js";
4
+ export type RedisPoolOptions = RedisClientOptions & Readonly<{
5
+ minimum?: number;
6
+ maximum?: number;
7
+ acquireTimeoutMs?: number;
8
+ cleanupDelayMs?: number;
9
+ clientOptions?: Omit<NodeRedisOptions, "url" | "disableOfflineQueue">;
10
+ }>;
11
+ export declare class RedisPool implements RedisExecutor {
12
+ private readonly options;
13
+ private readonly pool;
14
+ private readonly commandTimeoutMs;
15
+ private readonly acquireTimeoutMs;
16
+ private closed;
17
+ private connected;
18
+ constructor(options: RedisPoolOptions);
19
+ get isReady(): boolean;
20
+ connect(): Promise<void>;
21
+ execute<T = unknown>(command: RedisCommand): Promise<T>;
22
+ eval<T = unknown>(script: string, options: RedisScriptOptions): Promise<T>;
23
+ ping(): Promise<void>;
24
+ use<T>(operation: (client: unknown) => Promise<T>): Promise<T>;
25
+ close(): Promise<void>;
26
+ private reportError;
27
+ }
28
+ export declare function createRedisPool(options: RedisPoolOptions): RedisPool;
29
+ /** Creates, connects, and closes a pool around one operation. */
30
+ export declare function withRedisPool<T>(options: RedisPoolOptions, operation: (pool: RedisPool) => Promise<T>): Promise<T>;
31
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/node/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,kBAAkB,IAAI,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAQtF,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAChD,QAAQ,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,qBAAqB,CAAC,CAAC;CACtE,CAAC,CAAC;AAIJ,qBAAa,SAAU,YAAW,aAAa;IAOlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAE1B,YAA6B,OAAO,EAAE,gBAAgB,EAoCrD;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB7B;IAEK,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAiB5D;IAEK,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ/E;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAEK,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAInE;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3B;IAED,OAAO,CAAC,WAAW;CAKnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAEpE;AAED,iEAAiE;AACjE,wBAAsB,aAAa,CAAC,CAAC,EACpC,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAQZ"}
@@ -0,0 +1,131 @@
1
+ import { createClientPool } from "redis";
2
+ import { RedisClientStateError, RedisConfigurationError, RedisConnectionError, RedisTimeoutError, } from "../core/errors.js";
3
+ import { assertPositiveInteger, withTimeout, } from "../core/executor.js";
4
+ import { normalizeNodeRedisError } from "./errors.js";
5
+ export class RedisPool {
6
+ options;
7
+ pool;
8
+ commandTimeoutMs;
9
+ acquireTimeoutMs;
10
+ closed = false;
11
+ connected = false;
12
+ constructor(options) {
13
+ this.options = options;
14
+ const minimum = options.minimum ?? 1;
15
+ const maximum = options.maximum ?? 10;
16
+ this.commandTimeoutMs = options.commandTimeoutMs ?? 3_000;
17
+ this.acquireTimeoutMs = options.acquireTimeoutMs ?? 3_000;
18
+ assertPositiveInteger(minimum, "Redis pool minimum");
19
+ assertPositiveInteger(maximum, "Redis pool maximum");
20
+ assertPositiveInteger(this.commandTimeoutMs, "Redis command timeout");
21
+ assertPositiveInteger(this.acquireTimeoutMs, "Redis acquire timeout");
22
+ if (minimum > maximum)
23
+ throw new RedisConfigurationError("Redis pool minimum cannot exceed maximum");
24
+ this.pool = createClientPool({
25
+ ...options.clientOptions,
26
+ url: options.url,
27
+ disableOfflineQueue: options.disableOfflineQueue ?? true,
28
+ socket: {
29
+ ...options.clientOptions?.socket,
30
+ connectTimeout: options.connectTimeoutMs ?? 3_000,
31
+ reconnectStrategy: (attempts) => {
32
+ if (attempts >= (options.maxReconnectAttempts ?? 3))
33
+ return false;
34
+ return Math.min((options.reconnectBaseDelayMs ?? 100) * 2 ** attempts, options.reconnectMaxDelayMs ?? 1_000);
35
+ },
36
+ },
37
+ }, {
38
+ minimum,
39
+ maximum,
40
+ acquireTimeout: this.acquireTimeoutMs,
41
+ cleanupDelay: options.cleanupDelayMs ?? 3_000,
42
+ });
43
+ this.pool.on("error", (error) => this.reportError(normalizeNodeRedisError(error)));
44
+ }
45
+ get isReady() {
46
+ return this.pool.isReady ?? true;
47
+ }
48
+ async connect() {
49
+ if (this.closed)
50
+ throw new RedisClientStateError("The Redis pool has been closed");
51
+ if (this.connected)
52
+ return;
53
+ try {
54
+ this.options.hooks?.onStateChange?.("connecting");
55
+ await withTimeout(() => this.pool.connect(), this.acquireTimeoutMs, "Redis pool connection timed out");
56
+ this.connected = true;
57
+ this.options.hooks?.onStateChange?.("ready");
58
+ }
59
+ catch (error) {
60
+ const normalized = normalizeNodeRedisError(error);
61
+ this.reportError(normalized);
62
+ throw normalized.code === "REDIS_CLIENT_STATE" ||
63
+ normalized instanceof RedisTimeoutError
64
+ ? normalized
65
+ : new RedisConnectionError("Redis pool connection failed", normalized);
66
+ }
67
+ }
68
+ async execute(command) {
69
+ if (this.closed)
70
+ throw new RedisClientStateError("The Redis pool has been closed");
71
+ await this.connect();
72
+ const started = Date.now();
73
+ this.options.hooks?.onCommandStart?.(command);
74
+ try {
75
+ return await withTimeout(() => this.pool.sendCommand([...command]), this.commandTimeoutMs);
76
+ }
77
+ catch (error) {
78
+ const normalized = normalizeNodeRedisError(error);
79
+ this.reportError(normalized);
80
+ throw normalized;
81
+ }
82
+ finally {
83
+ this.options.hooks?.onCommandEnd?.(command, Date.now() - started);
84
+ }
85
+ }
86
+ async eval(script, options) {
87
+ return this.execute([
88
+ "EVAL",
89
+ script,
90
+ String(options.keys?.length ?? 0),
91
+ ...(options.keys ?? []),
92
+ ...(options.arguments ?? []),
93
+ ]);
94
+ }
95
+ async ping() {
96
+ await this.execute(["PING"]);
97
+ }
98
+ async use(operation) {
99
+ if (this.closed)
100
+ throw new RedisClientStateError("The Redis pool has been closed");
101
+ await this.connect();
102
+ return this.pool.execute(operation);
103
+ }
104
+ async close() {
105
+ if (this.closed)
106
+ return;
107
+ this.closed = true;
108
+ await this.pool.close();
109
+ this.options.hooks?.onStateChange?.("closed");
110
+ }
111
+ reportError(error) {
112
+ this.options.onError?.(error);
113
+ this.options.hooks?.onError?.(error);
114
+ this.options.hooks?.onStateChange?.("error");
115
+ }
116
+ }
117
+ export function createRedisPool(options) {
118
+ return new RedisPool(options);
119
+ }
120
+ /** Creates, connects, and closes a pool around one operation. */
121
+ export async function withRedisPool(options, operation) {
122
+ const pool = createRedisPool(options);
123
+ try {
124
+ await pool.connect();
125
+ return await operation(pool);
126
+ }
127
+ finally {
128
+ await pool.close();
129
+ }
130
+ }
131
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/node/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { RedisCodec } from "../core/codec.js";
2
+ import type { RedisSubscriptionTransport } from "../pubsub/contracts.js";
3
+ export declare function createNodePubSubTransport(options: Readonly<{
4
+ url: string;
5
+ onError?: (error: Error) => void;
6
+ }>): RedisSubscriptionTransport;
7
+ export declare function createNodeTypedPubSub<T>(options: Readonly<{
8
+ url: string;
9
+ codec: RedisCodec<T>;
10
+ onError?: (error: Error) => void;
11
+ }>): {
12
+ publish(channel: string, value: T): Promise<number>;
13
+ subscribe(channel: string, handler: (value: T) => void | Promise<void>): Promise<() => Promise<void>>;
14
+ close(): Promise<void>;
15
+ };
16
+ //# sourceMappingURL=pubsub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../src/node/pubsub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAKzE,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAAE,CAAC,GAClE,0BAA0B,CA2B5B;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EACtC,OAAO,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC,GACA;IACF,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,SAAS,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzC,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAWA"}
@@ -0,0 +1,41 @@
1
+ import { createClient } from "redis";
2
+ export function createNodePubSubTransport(options) {
3
+ let publisher = null;
4
+ let subscriber = null;
5
+ return {
6
+ async publish(channel, message) {
7
+ publisher ??= createClient({ url: options.url });
8
+ publisher.on("error", (error) => options.onError?.(error));
9
+ if (!publisher.isReady)
10
+ await publisher.connect();
11
+ return publisher.publish(channel, message);
12
+ },
13
+ async subscribe(channel, handler) {
14
+ subscriber ??= createClient({ url: options.url });
15
+ subscriber.on("error", (error) => options.onError?.(error));
16
+ if (!subscriber.isReady)
17
+ await subscriber.connect();
18
+ await subscriber.subscribe(channel, handler);
19
+ return async () => {
20
+ if (!subscriber)
21
+ return;
22
+ await subscriber.unsubscribe(channel);
23
+ };
24
+ },
25
+ async close() {
26
+ await Promise.all([
27
+ publisher?.isOpen ? publisher.close() : undefined,
28
+ subscriber?.isOpen ? subscriber.close() : undefined,
29
+ ]);
30
+ },
31
+ };
32
+ }
33
+ export function createNodeTypedPubSub(options) {
34
+ const transport = createNodePubSubTransport(options);
35
+ return {
36
+ publish: async (channel, value) => transport.publish(channel, options.codec.encode(value)),
37
+ subscribe: (channel, handler) => transport.subscribe(channel, async (message) => handler(options.codec.decode(message))),
38
+ close: () => transport.close(),
39
+ };
40
+ }
41
+ //# sourceMappingURL=pubsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../src/node/pubsub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAwB,MAAM,OAAO,CAAC;AAO3D,MAAM,UAAU,yBAAyB,CACxC,OAAoE;IAEpE,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,OAAO;QACN,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;YAC7B,SAAS,KAAK,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YAClD,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO;YAC/B,UAAU,KAAK,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAClD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,KAAK,IAAI,EAAE;gBACjB,IAAI,CAAC,UAAU;oBAAE,OAAO;gBACxB,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK;YACV,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;gBACjD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;aACnD,CAAC,CAAC;QACJ,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,OAIE;IASF,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO;QACN,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CACjC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxD,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC/B,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAC9C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CACtC;QACF,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;KAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface RedisSubscriptionTransport {
2
+ publish(channel: string, message: string): Promise<number>;
3
+ subscribe(channel: string, handler: (message: string) => void | Promise<void>): Promise<() => Promise<void>>;
4
+ close(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/pubsub/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IAC1C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,SAAS,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAChD,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/pubsub/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export type { RedisSubscriptionTransport } from "./contracts.js";
2
+ export { createPubSub, createRedisPubSub, RedisPubSub } from "./pubsub.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pubsub/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createPubSub, createRedisPubSub, RedisPubSub } from "./pubsub.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pubsub/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type RedisCodec } from "../core/codec.js";
2
+ import type { RedisSubscriptionTransport } from "./contracts.js";
3
+ export declare class RedisPubSub<T> {
4
+ private readonly transport;
5
+ private readonly codec;
6
+ constructor(transport: RedisSubscriptionTransport, codec?: RedisCodec<T>);
7
+ publish(channel: string, value: T): Promise<number>;
8
+ subscribe(channel: string, handler: (value: T) => void | Promise<void>): Promise<() => Promise<void>>;
9
+ messages(channel: string): AsyncIterable<T>;
10
+ close(): Promise<void>;
11
+ }
12
+ export declare function createPubSub<T>(transport: RedisSubscriptionTransport, codec?: RedisCodec<T>): RedisPubSub<T>;
13
+ /** A discoverable alias for applications that prefer Redis-prefixed factory names. */
14
+ export declare const createRedisPubSub: typeof createPubSub;
15
+ //# sourceMappingURL=pubsub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../src/pubsub/pubsub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,qBAAa,WAAW,CAAC,CAAC;IAExB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFvB,YACkB,SAAS,EAAE,0BAA0B,EACrC,KAAK,GAAE,UAAU,CAAC,CAAC,CAAkB,EACnD;IAEE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxD;IAEK,SAAS,CACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzC,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAK9B;IAED,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CA4B1C;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;CACD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC7B,SAAS,EAAE,0BAA0B,EACrC,KAAK,GAAE,UAAU,CAAC,CAAC,CAAkB,GACnC,WAAW,CAAC,CAAC,CAAC,CAEhB;AAED,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,qBAAe,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { jsonCodec } from "../core/codec.js";
2
+ import { RedisConfigurationError } from "../core/errors.js";
3
+ export class RedisPubSub {
4
+ transport;
5
+ codec;
6
+ constructor(transport, codec = jsonCodec()) {
7
+ this.transport = transport;
8
+ this.codec = codec;
9
+ }
10
+ async publish(channel, value) {
11
+ if (!channel.trim())
12
+ throw new RedisConfigurationError("Pub/sub channel is required");
13
+ return this.transport.publish(channel, this.codec.encode(value));
14
+ }
15
+ async subscribe(channel, handler) {
16
+ if (!channel.trim())
17
+ throw new RedisConfigurationError("Pub/sub channel is required");
18
+ return this.transport.subscribe(channel, async (message) => handler(this.codec.decode(message)));
19
+ }
20
+ messages(channel) {
21
+ const queue = [];
22
+ const waiters = [];
23
+ let closed = false;
24
+ let unsubscribe;
25
+ const ready = this.subscribe(channel, (value) => {
26
+ const waiter = waiters.shift();
27
+ if (waiter)
28
+ waiter({ done: false, value });
29
+ else
30
+ queue.push(value);
31
+ }).then((stop) => {
32
+ unsubscribe = stop;
33
+ });
34
+ const iterator = {
35
+ next: async () => {
36
+ await ready;
37
+ if (queue.length)
38
+ return { done: false, value: queue.shift() };
39
+ if (closed)
40
+ return { done: true, value: undefined };
41
+ return new Promise((resolve) => waiters.push(resolve));
42
+ },
43
+ return: async () => {
44
+ closed = true;
45
+ await unsubscribe?.();
46
+ for (const waiter of waiters.splice(0))
47
+ waiter({ done: true, value: undefined });
48
+ return { done: true, value: undefined };
49
+ },
50
+ };
51
+ return { [Symbol.asyncIterator]: () => iterator };
52
+ }
53
+ close() {
54
+ return this.transport.close();
55
+ }
56
+ }
57
+ export function createPubSub(transport, codec = jsonCodec()) {
58
+ return new RedisPubSub(transport, codec);
59
+ }
60
+ /** A discoverable alias for applications that prefer Redis-prefixed factory names. */
61
+ export const createRedisPubSub = createPubSub;
62
+ //# sourceMappingURL=pubsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../src/pubsub/pubsub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { EnqueueOptions, JobQueue, QueueJob, QueueOptions, QueueWorker, QueueWorkerOptions, } from "./queue.js";
2
+ export { createQueue, createRedisQueue, RedisQueue, RedisQueueWorker } from "./queue.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createQueue, createRedisQueue, RedisQueue, RedisQueueWorker } from "./queue.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}