@nexusts/redis 0.7.0 → 0.7.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/README.md CHANGED
@@ -15,7 +15,7 @@ This module is part of the NexusTS monorepo. Each module is published as its own
15
15
  Most apps start with just the core:
16
16
 
17
17
  ```bash
18
- bun add @nexusts/core reflect-metadata zod hono
18
+ bun add @nexusts/core
19
19
  ```
20
20
 
21
21
  Then add this module only if you need it:
@@ -30,7 +30,9 @@ bun add @nexusts/redis
30
30
  bun add ioredis
31
31
  ```
32
32
 
33
- Required by this module. Without them the module loads but its public methods throw a clear error pointing to this install command on first call.
33
+ - **`ioredis`** ^5.11.1 Required for Redis-backed sessions / cache / limiter / queue. Skip if you use only the memory / Drizzle backends.
34
+
35
+ Without them the module loads but its public methods throw a clear error pointing to this install command on first call.
34
36
 
35
37
  ## Usage
36
38
 
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Bun runtime adapter for `nexusjs/redis`.
3
+ *
4
+ * Uses the built-in `Bun.redis` client. No extra package needed.
5
+ * The client is lazily opened on first use.
6
+ */
7
+ import type { RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue } from "../types.js";
8
+ export declare class BunRedisAdapter implements RedisClient {
9
+ readonly adapter: "bun";
10
+ private client;
11
+ private readonly url;
12
+ private readonly keyPrefix;
13
+ private readonly defaultTtlSeconds;
14
+ constructor(config?: RedisConfig);
15
+ private getClient;
16
+ private k;
17
+ get(key: string): Promise<RedisValue>;
18
+ set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
19
+ del(key: string): Promise<number>;
20
+ exists(key: string): Promise<boolean>;
21
+ incr(key: string, by?: number, options?: {
22
+ ex?: number;
23
+ }): Promise<number>;
24
+ scan(options?: RedisScanOptions): Promise<RedisScanResult>;
25
+ close(): Promise<void>;
26
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Cloudflare Workers KV adapter for `nexusjs/redis`.
3
+ *
4
+ * Workers KV is **not** Redis, but the surface is close enough
5
+ * that the same `RedisClient` API can sit on top of it. The
6
+ * adapter:
7
+ *
8
+ * - Maps `set(key, value, { ex })` to `KVNamespace.put()` with
9
+ * `expirationTtl` (seconds).
10
+ * - Maps `scan({ match })` to `KVNamespace.list({ prefix })`,
11
+ * which is the closest thing KV offers to Redis `SCAN MATCH`.
12
+ * The `cursor` field is a Cloudflare opaque string.
13
+ * - `del` uses `KVNamespace.delete()`.
14
+ * - `incr` falls back to a small read-modify-write: get the
15
+ * value, parse as int, add, put back. (KV doesn't have
16
+ * atomic INCR.) Use with care — concurrent writes can lose
17
+ * updates. For high-contention counters use a real Redis.
18
+ *
19
+ * Cloudflare imposes a 25 MB value limit per key and a global
20
+ * 100k reads / 1000 writes per second per KV namespace. Don't
21
+ * store large objects in KV.
22
+ *
23
+ * To use:
24
+ *
25
+ * // In a Worker request handler:
26
+ * const client = createRedisClient({
27
+ * adapter: "cloudflare",
28
+ * kv: c.env.SESSIONS, // KVNamespace binding from wrangler.toml
29
+ * });
30
+ */
31
+ import type { RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue } from "../types.js";
32
+ export declare class CloudflareKVAdapter implements RedisClient {
33
+ readonly adapter: "cloudflare";
34
+ private kv;
35
+ private readonly keyPrefix;
36
+ private readonly defaultTtlSeconds;
37
+ constructor(config?: RedisConfig);
38
+ private getKV;
39
+ private k;
40
+ private stripPrefix;
41
+ get(key: string): Promise<RedisValue>;
42
+ set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
43
+ del(key: string): Promise<number>;
44
+ exists(key: string): Promise<boolean>;
45
+ incr(key: string, by?: number, options?: {
46
+ ex?: number;
47
+ }): Promise<number>;
48
+ scan(options?: RedisScanOptions): Promise<RedisScanResult>;
49
+ close(): Promise<void>;
50
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Runtime detection and factory for `nexusjs/redis` adapters.
3
+ *
4
+ * - `Bun` → `BunRedisAdapter` (built-in `Bun.redis`, no extra package).
5
+ * - `node` → `NodeRedisAdapter` (uses `ioredis` — install separately).
6
+ * - `cloudflare` (Workers / Pages) → `CloudflareKVAdapter` (Workers KV).
7
+ * - `memory` → `MemoryRedisAdapter` (always available, no external dep).
8
+ *
9
+ * The factory `createRedisClient(config)` auto-detects when
10
+ * `config.adapter` is omitted.
11
+ */
12
+ import type { RedisAdapterKind, RedisClient, RedisConfig } from "../types.js";
13
+ import { BunRedisAdapter } from "./bun.js";
14
+ import { CloudflareKVAdapter } from "./cloudflare.js";
15
+ import { MemoryRedisAdapter } from "./memory.js";
16
+ import { NodeRedisAdapter } from "./node.js";
17
+ /** Detect the active runtime. */
18
+ export declare function detectRedisRuntime(): RedisAdapterKind;
19
+ /**
20
+ * Create a Redis client with the configured (or auto-detected)
21
+ * adapter.
22
+ *
23
+ * const client = createRedisClient({ adapter: "bun", url: "redis://localhost:6379" });
24
+ * await client.set("hello", "world", { ex: 60 });
25
+ * console.log(await client.get("hello")); // → "world"
26
+ */
27
+ export declare function createRedisClient(config?: RedisConfig): RedisClient;
28
+ export { BunRedisAdapter, CloudflareKVAdapter, MemoryRedisAdapter, NodeRedisAdapter, };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * In-memory adapter for `nexusjs/redis`.
3
+ *
4
+ * Used for tests and single-process dev. Not cluster-safe; values
5
+ * don't survive process restart.
6
+ */
7
+ import type { RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue } from "../types.js";
8
+ export declare class MemoryRedisAdapter implements RedisClient {
9
+ readonly adapter: "memory";
10
+ private data;
11
+ private readonly keyPrefix;
12
+ private readonly defaultTtlSeconds;
13
+ constructor(config?: RedisConfig);
14
+ private k;
15
+ private stripPrefix;
16
+ private isExpired;
17
+ private purge;
18
+ get(key: string): Promise<RedisValue>;
19
+ set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
20
+ del(key: string): Promise<number>;
21
+ exists(key: string): Promise<boolean>;
22
+ incr(key: string, by?: number, options?: {
23
+ ex?: number;
24
+ }): Promise<number>;
25
+ scan(options?: RedisScanOptions): Promise<RedisScanResult>;
26
+ close(): Promise<void>;
27
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Node.js runtime adapter for `nexusjs/redis`.
3
+ *
4
+ * Uses the `ioredis` package. The package is an **optional**
5
+ * peer dependency of `nexusjs` — install it only when targeting
6
+ * Node:
7
+ *
8
+ * bun add ioredis
9
+ *
10
+ * The adapter opens a single shared client per `RedisConfig` and
11
+ * reuses it across `get` / `set` / `del` / `scan` calls. Use
12
+ * `await client.close()` to release the connection.
13
+ */
14
+ import type { RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue } from "../types.js";
15
+ export declare class NodeRedisAdapter implements RedisClient {
16
+ readonly adapter: "node";
17
+ private client;
18
+ private readonly url;
19
+ private readonly keyPrefix;
20
+ private readonly defaultTtlSeconds;
21
+ private readonly nodeOptions;
22
+ constructor(config?: RedisConfig);
23
+ private getClient;
24
+ private k;
25
+ private stripPrefix;
26
+ get(key: string): Promise<RedisValue>;
27
+ set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
28
+ del(key: string): Promise<number>;
29
+ exists(key: string): Promise<boolean>;
30
+ incr(key: string, by?: number, options?: {
31
+ ex?: number;
32
+ }): Promise<number>;
33
+ scan(options?: RedisScanOptions): Promise<RedisScanResult>;
34
+ close(): Promise<void>;
35
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `nexusjs/redis` — runtime-aware Redis-compatible key/value client.
3
+ *
4
+ * Public API:
5
+ * - `createRedisClient(config)` — factory; auto-detects the runtime
6
+ * when `config.adapter` is omitted.
7
+ * - `RedisClient` — the minimal interface every adapter implements.
8
+ * - `detectRedisRuntime()` — returns "bun" | "node" | "cloudflare" | "memory".
9
+ * - Adapters: `BunRedisAdapter` (Bun built-in, no dep),
10
+ * `NodeRedisAdapter` (`ioredis` peer), `CloudflareKVAdapter`
11
+ * (Workers KV, no dep), `MemoryRedisAdapter` (always available).
12
+ * - `RedisModule.forRoot(config)` — DI wiring.
13
+ *
14
+ * Runtime auto-detection:
15
+ *
16
+ * | Runtime | Adapter | External dep |
17
+ * | -------------------- | --------------- | ------------ |
18
+ * | Bun | `bun` | none (Bun.redis built-in) |
19
+ * | Node.js | `node` | `ioredis` (optional peer) |
20
+ * | Cloudflare Workers | `cloudflare` | none (Workers KV) |
21
+ * | (other / no signal) | `memory` | none |
22
+ *
23
+ * Same API across runtimes — `nexusjs/session`, `nexusjs/cache`, and
24
+ * `nexusjs/queue` (where applicable) all use the `RedisClient`
25
+ * interface so a single config switch chooses the backend.
26
+ *
27
+ * bun add ioredis # only for Node runtime
28
+ * bun add @cloudflare/workers-types # only for Cloudflare TS types
29
+ */
30
+ export { createRedisClient, detectRedisRuntime, BunRedisAdapter, CloudflareKVAdapter, MemoryRedisAdapter, NodeRedisAdapter, } from "./adapters/index.js";
31
+ export { RedisModule, REDIS_CLIENT_TOKEN } from "./module.js";
32
+ export type { RedisAdapterKind, RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue, RedisKey, RedisCursor, KVNamespaceLike, } from "./types.js";
package/dist/index.js CHANGED
@@ -1,20 +1,4 @@
1
1
  // @bun
2
- var __create = Object.create;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
2
  var __legacyDecorateClassTS = function(decorators, target, key, desc) {
19
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -388,7 +372,7 @@ function createRedisClient(config = {}) {
388
372
  }
389
373
  }
390
374
  // packages/redis/src/module.ts
391
- import { Module } from "@nexusts/core/decorators/index.js";
375
+ import { Module } from "@nexusts/core";
392
376
  var REDIS_CLIENT_TOKEN = Symbol.for("nexus:RedisClient");
393
377
 
394
378
  class RedisModule {
@@ -436,5 +420,5 @@ export {
436
420
  BunRedisAdapter
437
421
  };
438
422
 
439
- //# debugId=0BCE9406D8DDE88C64756E2164756E21
423
+ //# debugId=CAD8CF6CBFBF911464756E2164756E21
440
424
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -7,9 +7,9 @@
7
7
  "/**\n * In-memory adapter for `nexusjs/redis`.\n *\n * Used for tests and single-process dev. Not cluster-safe; values\n * don't survive process restart.\n */\n\nimport type {\n\tRedisClient,\n\tRedisConfig,\n\tRedisScanOptions,\n\tRedisScanResult,\n\tRedisSetOptions,\n\tRedisValue,\n} from \"../types.js\";\n\ninterface Entry {\n\tvalue: string;\n\texpiresAt: number | null; // ms epoch; null = no expiry\n}\n\nexport class MemoryRedisAdapter implements RedisClient {\n\treadonly adapter = \"memory\" as const;\n\tprivate data = new Map<string, Entry>();\n\tprivate readonly keyPrefix: string;\n\tprivate readonly defaultTtlSeconds: number;\n\n\tconstructor(config: RedisConfig = {}) {\n\t\tthis.keyPrefix = config.keyPrefix ?? \"\";\n\t\tthis.defaultTtlSeconds = config.defaultTtlSeconds ?? 0;\n\t}\n\n\tprivate k(key: string): string {\n\t\treturn this.keyPrefix + key;\n\t}\n\n\tprivate stripPrefix(key: string): string {\n\t\treturn this.keyPrefix && key.startsWith(this.keyPrefix)\n\t\t\t? key.slice(this.keyPrefix.length)\n\t\t\t: key;\n\t}\n\n\tprivate isExpired(e: Entry | undefined): e is undefined {\n\t\treturn !e || (e.expiresAt !== null && e.expiresAt < Date.now());\n\t}\n\n\tprivate purge(key: string): void {\n\t\tconst e = this.data.get(key);\n\t\tif (this.isExpired(e)) this.data.delete(key);\n\t}\n\n\tasync get(key: string): Promise<RedisValue> {\n\t\tconst k = this.k(key);\n\t\tthis.purge(k);\n\t\tconst e = this.data.get(k);\n\t\treturn e ? e.value : null;\n\t}\n\n\tasync set(key: string, value: string, options?: RedisSetOptions): Promise<void> {\n\t\tconst k = this.k(key);\n\t\tconst ttl =\n\t\t\toptions?.ex !== undefined\n\t\t\t\t? options.ex\n\t\t\t\t: options?.px !== undefined\n\t\t\t\t\t? options.px / 1000\n\t\t\t\t\t: this.defaultTtlSeconds;\n\t\tconst expiresAt = ttl && ttl > 0 ? Date.now() + ttl * 1000 : null;\n\t\tif (options?.nx && !this.isExpired(this.data.get(k))) return; // NX semantics\n\t\tif (options?.xx && this.isExpired(this.data.get(k))) return; // XX semantics\n\t\tthis.data.set(k, { value, expiresAt });\n\t}\n\n\tasync del(key: string): Promise<number> {\n\t\tconst k = this.k(key);\n\t\tconst existed = this.data.delete(k);\n\t\treturn existed ? 1 : 0;\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\tconst k = this.k(key);\n\t\tthis.purge(k);\n\t\treturn this.data.has(k);\n\t}\n\n\tasync incr(key: string, by = 1, options?: { ex?: number }): Promise<number> {\n\t\tconst k = this.k(key);\n\t\tthis.purge(k);\n\t\tconst e = this.data.get(k);\n\t\tconst current = e ? Number.parseInt(e.value, 10) || 0 : 0;\n\t\tconst next = current + by;\n\t\tconst ttl = options?.ex ?? this.defaultTtlSeconds ?? undefined;\n\t\tconst expiresAt = ttl && ttl > 0 ? Date.now() + ttl * 1000 : null;\n\t\tthis.data.set(k, { value: String(next), expiresAt });\n\t\treturn next;\n\t}\n\n\tasync scan(options: RedisScanOptions = {}): Promise<RedisScanResult> {\n\t\tconst match = options.match ?? \"*\";\n\t\t// The match pattern is matched against the full key (with\n\t\t// prefix included). Callers should write patterns that\n\t\t// include the prefix.\n\t\tconst re = globToRegex(match);\n\t\tconst keys: string[] = [];\n\t\tfor (const k of this.data.keys()) {\n\t\t\tif (this.keyPrefix && !k.startsWith(this.keyPrefix)) continue;\n\t\t\tif (re.test(k)) keys.push(this.stripPrefix(k));\n\t\t}\n\t\treturn { cursor: \"0\", keys };\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.data.clear();\n\t}\n}\n\nfunction globToRegex(glob: string): RegExp {\n\tconst escaped = glob\n\t\t.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\t\t.replace(/\\*/g, \".*\")\n\t\t.replace(/\\?/g, \".\");\n\treturn new RegExp(\"^\" + escaped + \"$\");\n}\n",
8
8
  "/**\n * Node.js runtime adapter for `nexusjs/redis`.\n *\n * Uses the `ioredis` package. The package is an **optional**\n * peer dependency of `nexusjs` — install it only when targeting\n * Node:\n *\n * bun add ioredis\n *\n * The adapter opens a single shared client per `RedisConfig` and\n * reuses it across `get` / `set` / `del` / `scan` calls. Use\n * `await client.close()` to release the connection.\n */\n\nimport type {\n\tRedisClient,\n\tRedisConfig,\n\tRedisScanOptions,\n\tRedisScanResult,\n\tRedisSetOptions,\n\tRedisValue,\n} from \"../types.js\";\n\n/** The shape we need from `ioredis`. We don't depend on the\n * package at the type level so users who don't install it\n * still type-check. */\ninterface IORedisLike {\n\tget(key: string): Promise<string | null>;\n\tset(\n\t\tkey: string,\n\t\tvalue: string,\n\t\tmodeOrEx?: string | number,\n\t\tduration?: number,\n\t\tflag?: \"NX\" | \"XX\",\n\t): Promise<\"OK\" | null>;\n\tdel(key: string | string[]): Promise<number>;\n\texists(key: string): Promise<number>;\n\tincr(key: string): Promise<number>;\n\texpire(key: string, seconds: number): Promise<number>;\n\tscan(\n\t\tcursor: number | string,\n\t\tmatch: string,\n\t\tcount: number,\n\t): Promise<[string | number, string[]]>;\n\tquit(): Promise<\"OK\">;\n\tdisconnect(): void;\n}\n\nexport class NodeRedisAdapter implements RedisClient {\n\treadonly adapter = \"node\" as const;\n\tprivate client: IORedisLike | null = null;\n\tprivate readonly url: string;\n\tprivate readonly keyPrefix: string;\n\tprivate readonly defaultTtlSeconds: number;\n\tprivate readonly nodeOptions: Record<string, unknown>;\n\n\tconstructor(config: RedisConfig = {}) {\n\t\tthis.url = config.url ?? process.env[\"REDIS_URL\"] ?? \"redis://localhost:6379\";\n\t\tthis.keyPrefix = config.keyPrefix ?? \"\";\n\t\tthis.defaultTtlSeconds = config.defaultTtlSeconds ?? 0;\n\t\tthis.nodeOptions = config.nodeOptions ?? {};\n\t}\n\n\tprivate async getClient(): Promise<IORedisLike> {\n\t\tif (this.client) return this.client;\n\t\ttry {\n\t\t\t// @ts-ignore - optional peer dep\n\t\t\tconst mod = await import(\"ioredis\");\n\t\t\tconst Ctor = (mod as any).default ?? (mod as any);\n\t\t\tif (typeof Ctor !== \"function\") {\n\t\t\t\tthrow new Error(\"ioredis module did not export a constructor\");\n\t\t\t}\n\t\t\tthis.client = new Ctor(this.url, this.nodeOptions) as IORedisLike;\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t\"NodeRedisAdapter requires the `ioredis` package. \" +\n\t\t\t\t\t\"Install with: bun add ioredis\",\n\t\t\t);\n\t\t}\n\t\treturn this.client!;\n\t}\n\n\tprivate k(key: string): string {\n\t\treturn this.keyPrefix + key;\n\t}\n\n\tprivate stripPrefix(key: string): string {\n\t\treturn this.keyPrefix && key.startsWith(this.keyPrefix)\n\t\t\t? key.slice(this.keyPrefix.length)\n\t\t\t: key;\n\t}\n\n\tasync get(key: string): Promise<RedisValue> {\n\t\treturn (await this.getClient()).get(this.k(key));\n\t}\n\n\tasync set(key: string, value: string, options?: RedisSetOptions): Promise<void> {\n\t\tconst ex = options?.ex ?? this.defaultTtlSeconds ?? undefined;\n\t\tconst c = await this.getClient();\n\t\tconst fullKey = this.k(key);\n\t\t// ioredis set signature: set(key, value, EX, seconds, NX|XX) or\n\t\t// set(key, value, NX|XX). We dispatch on the combination of\n\t\t// flags.\n\t\tif (options?.nx) {\n\t\t\tawait c.set(fullKey, value, \"EX\", ex ?? 0, \"NX\");\n\t\t} else if (options?.xx) {\n\t\t\tawait c.set(fullKey, value, \"EX\", ex ?? 0, \"XX\");\n\t\t} else if (ex) {\n\t\t\tawait c.set(fullKey, value, \"EX\", ex);\n\t\t} else {\n\t\t\tawait c.set(fullKey, value);\n\t\t}\n\t}\n\n\tasync del(key: string): Promise<number> {\n\t\treturn (await this.getClient()).del(this.k(key));\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\tconst n = await (await this.getClient()).exists(this.k(key));\n\t\treturn n > 0;\n\t}\n\n\tasync incr(key: string, by = 1, options?: { ex?: number }): Promise<number> {\n\t\tconst fullKey = this.k(key);\n\t\tconst c = await this.getClient();\n\t\tlet value: number;\n\t\tif (by === 1) {\n\t\t\tvalue = await c.incr(fullKey);\n\t\t} else {\n\t\t\t// ioredis doesn't have incrby with delta? It does — use\n\t\t\t// the multi-step: `incrby` is the ioredis method. Patch\n\t\t\t// the IORedisLike to include it.\n\t\t\tvalue = await (c as unknown as { incrby: (k: string, n: number) => Promise<number> }).incrby(fullKey, by);\n\t\t}\n\t\tif (options?.ex && value === by) {\n\t\t\tawait c.expire(fullKey, options.ex);\n\t\t}\n\t\treturn value;\n\t}\n\n\tasync scan(options: RedisScanOptions = {}): Promise<RedisScanResult> {\n\t\tconst cursor = typeof options.cursor === \"number\" || typeof options.cursor === \"string\"\n\t\t\t? options.cursor\n\t\t\t: 0;\n\t\tconst [next, keys] = await (await this.getClient()).scan(\n\t\t\tcursor,\n\t\t\toptions.match ?? \"*\",\n\t\t\toptions.count ?? 100,\n\t\t);\n\t\treturn {\n\t\t\tcursor: next,\n\t\t\tkeys: (keys ?? []).map((k) => this.stripPrefix(k)),\n\t\t};\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.client) {\n\t\t\ttry {\n\t\t\t\tawait this.client.quit();\n\t\t\t} catch {\n\t\t\t\tthis.client.disconnect();\n\t\t\t}\n\t\t\tthis.client = null;\n\t\t}\n\t}\n}\n",
9
9
  "/**\n * Runtime detection and factory for `nexusjs/redis` adapters.\n *\n * - `Bun` → `BunRedisAdapter` (built-in `Bun.redis`, no extra package).\n * - `node` → `NodeRedisAdapter` (uses `ioredis` — install separately).\n * - `cloudflare` (Workers / Pages) → `CloudflareKVAdapter` (Workers KV).\n * - `memory` → `MemoryRedisAdapter` (always available, no external dep).\n *\n * The factory `createRedisClient(config)` auto-detects when\n * `config.adapter` is omitted.\n */\n\nimport type { RedisAdapterKind, RedisClient, RedisConfig } from \"../types.js\";\nimport { BunRedisAdapter } from \"./bun.js\";\nimport { CloudflareKVAdapter } from \"./cloudflare.js\";\nimport { MemoryRedisAdapter } from \"./memory.js\";\nimport { NodeRedisAdapter } from \"./node.js\";\n\n/** Detect the active runtime. */\nexport function detectRedisRuntime(): RedisAdapterKind {\n\t// Cloudflare Workers — most specific first.\n\tif (\n\t\ttypeof (globalThis as { caches?: unknown }).caches !== \"undefined\" &&\n\t\ttypeof (globalThis as { WebSocketPair?: unknown }).WebSocketPair !== \"undefined\"\n\t) {\n\t\treturn \"cloudflare\";\n\t}\n\tif (typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\") return \"bun\";\n\tif (typeof process !== \"undefined\" && process.versions?.node) return \"node\";\n\treturn \"memory\";\n}\n\n/**\n * Create a Redis client with the configured (or auto-detected)\n * adapter.\n *\n * const client = createRedisClient({ adapter: \"bun\", url: \"redis://localhost:6379\" });\n * await client.set(\"hello\", \"world\", { ex: 60 });\n * console.log(await client.get(\"hello\")); // → \"world\"\n */\nexport function createRedisClient(config: RedisConfig = {}): RedisClient {\n\tconst adapter = config.adapter ?? detectRedisRuntime();\n\tswitch (adapter) {\n\t\tcase \"bun\":\n\t\t\treturn new BunRedisAdapter(config);\n\t\tcase \"node\":\n\t\t\treturn new NodeRedisAdapter(config);\n\t\tcase \"cloudflare\":\n\t\t\treturn new CloudflareKVAdapter(config);\n\t\tcase \"memory\":\n\t\t\treturn new MemoryRedisAdapter(config);\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = adapter;\n\t\t\tthrow new Error(`unknown redis adapter: ${_exhaustive as string}`);\n\t\t}\n\t}\n}\n\nexport {\n\tBunRedisAdapter,\n\tCloudflareKVAdapter,\n\tMemoryRedisAdapter,\n\tNodeRedisAdapter,\n};",
10
- "/**\n * `RedisModule` — wires `RedisClient` into the DI container.\n *\n * @Module({\n * imports: [\n * RedisModule.forRoot({\n * adapter: \"bun\", // or \"node\" | \"cloudflare\" | \"memory\"\n * url: \"redis://localhost:6379\",\n * keyPrefix: \"myapp:\",\n * }),\n * ],\n * })\n * class AppModule {}\n *\n * @Injectable()\n * class UserService {\n * constructor(@Inject(REDIS_CLIENT_TOKEN) private redis: RedisClient) {}\n * async countVisits(userId: string) {\n * return this.redis.incr(`visits:${userId}`, 1, { ex: 60 * 60 });\n * }\n * }\n *\n * Most users won't import `RedisModule` directly — the\n * `SessionModule` and `CacheModule` use it under the hood when\n * the user configures a `redis` / `cloudflare-kv` backend.\n */\n\nimport { Module } from \"@nexusts/core/decorators/index.js\";\nimport { createRedisClient } from \"./adapters/index.js\";\nimport type { RedisClient, RedisConfig } from \"./types.js\";\n\nexport const REDIS_CLIENT_TOKEN = Symbol.for(\"nexus:RedisClient\");\n\n@Module({\n\tproviders: [\n\t\t{\n\t\t\tprovide: REDIS_CLIENT_TOKEN,\n\t\t\tuseFactory: () => createRedisClient(),\n\t\t},\n\t],\n\texports: [REDIS_CLIENT_TOKEN],\n})\nexport class RedisModule {\n\tstatic forRoot(config: RedisConfig = {}) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\t{\n\t\t\t\t\tprovide: REDIS_CLIENT_TOKEN,\n\t\t\t\t\tuseFactory: () => createRedisClient(config),\n\t\t\t\t},\n\t\t\t\t{ provide: \"REDIS_CONFIG\", useValue: config },\n\t\t\t],\n\t\t\texports: [REDIS_CLIENT_TOKEN, \"REDIS_CONFIG\"],\n\t\t})\n\t\tclass ConfiguredRedisModule {}\n\t\tObject.defineProperty(ConfiguredRedisModule, \"name\", {\n\t\t\tvalue: \"ConfiguredRedisModule\",\n\t\t});\n\t\treturn ConfiguredRedisModule as unknown as typeof RedisModule;\n\t}\n}\n"
10
+ "/**\n * `RedisModule` — wires `RedisClient` into the DI container.\n *\n * @Module({\n * imports: [\n * RedisModule.forRoot({\n * adapter: \"bun\", // or \"node\" | \"cloudflare\" | \"memory\"\n * url: \"redis://localhost:6379\",\n * keyPrefix: \"myapp:\",\n * }),\n * ],\n * })\n * class AppModule {}\n *\n * @Injectable()\n * class UserService {\n * constructor(@Inject(REDIS_CLIENT_TOKEN) private redis: RedisClient) {}\n * async countVisits(userId: string) {\n * return this.redis.incr(`visits:${userId}`, 1, { ex: 60 * 60 });\n * }\n * }\n *\n * Most users won't import `RedisModule` directly — the\n * `SessionModule` and `CacheModule` use it under the hood when\n * the user configures a `redis` / `cloudflare-kv` backend.\n */\n\nimport { Module } from \"@nexusts/core\";\nimport { createRedisClient } from \"./adapters/index.js\";\nimport type { RedisClient, RedisConfig } from \"./types.js\";\n\nexport const REDIS_CLIENT_TOKEN = Symbol.for(\"nexus:RedisClient\");\n\n@Module({\n\tproviders: [\n\t\t{\n\t\t\tprovide: REDIS_CLIENT_TOKEN,\n\t\t\tuseFactory: () => createRedisClient(),\n\t\t},\n\t],\n\texports: [REDIS_CLIENT_TOKEN],\n})\nexport class RedisModule {\n\tstatic forRoot(config: RedisConfig = {}) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\t{\n\t\t\t\t\tprovide: REDIS_CLIENT_TOKEN,\n\t\t\t\t\tuseFactory: () => createRedisClient(config),\n\t\t\t\t},\n\t\t\t\t{ provide: \"REDIS_CONFIG\", useValue: config },\n\t\t\t],\n\t\t\texports: [REDIS_CLIENT_TOKEN, \"REDIS_CONFIG\"],\n\t\t})\n\t\tclass ConfiguredRedisModule {}\n\t\tObject.defineProperty(ConfiguredRedisModule, \"name\", {\n\t\t\tvalue: \"ConfiguredRedisModule\",\n\t\t});\n\t\treturn ConfiguredRedisModule as unknown as typeof RedisModule;\n\t}\n}\n"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "0BCE9406D8DDE88C64756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "CAD8CF6CBFBF911464756E2164756E21",
14
14
  "names": []
15
15
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `RedisModule` — wires `RedisClient` into the DI container.
3
+ *
4
+ * @Module({
5
+ * imports: [
6
+ * RedisModule.forRoot({
7
+ * adapter: "bun", // or "node" | "cloudflare" | "memory"
8
+ * url: "redis://localhost:6379",
9
+ * keyPrefix: "myapp:",
10
+ * }),
11
+ * ],
12
+ * })
13
+ * class AppModule {}
14
+ *
15
+ * @Injectable()
16
+ * class UserService {
17
+ * constructor(@Inject(REDIS_CLIENT_TOKEN) private redis: RedisClient) {}
18
+ * async countVisits(userId: string) {
19
+ * return this.redis.incr(`visits:${userId}`, 1, { ex: 60 * 60 });
20
+ * }
21
+ * }
22
+ *
23
+ * Most users won't import `RedisModule` directly — the
24
+ * `SessionModule` and `CacheModule` use it under the hood when
25
+ * the user configures a `redis` / `cloudflare-kv` backend.
26
+ */
27
+ import type { RedisConfig } from "./types.js";
28
+ export declare const REDIS_CLIENT_TOKEN: unique symbol;
29
+ export declare class RedisModule {
30
+ static forRoot(config?: RedisConfig): typeof RedisModule;
31
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Public types for `nexusjs/redis`.
3
+ *
4
+ * `nexusjs/redis` is a thin, runtime-aware abstraction over a
5
+ * Redis-compatible key-value store. The same API works on:
6
+ *
7
+ * - **Bun** (primary): uses the built-in `Bun.redis` — no
8
+ * extra package needed.
9
+ * - **Node.js**: uses the `ioredis` package (optional peer dep).
10
+ * - **Cloudflare Workers / Pages**: uses Workers KV
11
+ * (`c.env.KV`). KV is **not** Redis, but the surface is
12
+ * close enough that a single API serves both — KV is
13
+ * eventually consistent and limited to ~25 MB per value,
14
+ * so use it only for ephemeral state like sessions and
15
+ * short-lived cache.
16
+ *
17
+ * For the Cloudflare case, set `adapter: "cloudflare"` and
18
+ * pass the `KVNamespace` binding via `client.env.KV`. The
19
+ * framework will pick it up automatically when running in
20
+ * the Workers runtime.
21
+ *
22
+ * Zero hard deps. `ioredis` is an **optional** peer dep —
23
+ * install it only when targeting Node.
24
+ */
25
+ export type RedisAdapterKind = "bun" | "node" | "cloudflare" | "memory";
26
+ /** A single key/value with optional expiry. */
27
+ export interface RedisSetOptions {
28
+ /** TTL in seconds. */
29
+ ex?: number;
30
+ /** TTL in milliseconds. */
31
+ px?: number;
32
+ /** Only set if the key does not exist. */
33
+ nx?: boolean;
34
+ /** Only set if the key already exists. */
35
+ xx?: boolean;
36
+ }
37
+ /** Result of a `get` call — `null` if missing. */
38
+ export type RedisValue = string | null;
39
+ /** A single key returned by `scan` / `keys`. */
40
+ export type RedisKey = string;
41
+ /** Cursor returned by `scan`. */
42
+ export type RedisCursor = string | number;
43
+ /** Scan options. */
44
+ export interface RedisScanOptions {
45
+ /** Match pattern. Default: `*` (all keys). */
46
+ match?: string;
47
+ /** Number of keys per cursor step. Default: 100. */
48
+ count?: number;
49
+ /** Starting cursor. Default: 0. */
50
+ cursor?: RedisCursor;
51
+ }
52
+ /** Result of a single `scan` step. */
53
+ export interface RedisScanResult {
54
+ /** Next cursor; `"0"` means iteration is complete. */
55
+ cursor: RedisCursor;
56
+ /** Keys found in this step. */
57
+ keys: RedisKey[];
58
+ }
59
+ /**
60
+ * The minimal Redis-compatible API surface that NexusTS modules
61
+ * (session, cache, queue) depend on. Adapters implement this.
62
+ */
63
+ export interface RedisClient {
64
+ readonly adapter: RedisAdapterKind;
65
+ /** Get a value by key. `null` if missing. */
66
+ get(key: string): Promise<RedisValue>;
67
+ /**
68
+ * Set a value with optional expiry. Resolves once the value
69
+ * is durably written.
70
+ */
71
+ set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
72
+ /** Delete a key. Returns the number of keys removed (0 or 1). */
73
+ del(key: string): Promise<number>;
74
+ /** Test whether a key exists. */
75
+ exists(key: string): Promise<boolean>;
76
+ /**
77
+ * Increment a counter, optionally setting an initial value
78
+ * with `ex` (only applied on creation). Resolves to the new
79
+ * value.
80
+ */
81
+ incr(key: string, by?: number, options?: {
82
+ ex?: number;
83
+ }): Promise<number>;
84
+ /**
85
+ * Iterate keys. Each call returns a cursor; pass the next
86
+ * cursor back in until `cursor === "0"`. For Cloudflare KV
87
+ * this is implemented via `KV.list()`.
88
+ */
89
+ scan(options?: RedisScanOptions): Promise<RedisScanResult>;
90
+ /** Close the client (release sockets, etc.). No-op for in-memory. */
91
+ close(): Promise<void>;
92
+ }
93
+ export interface RedisConfig {
94
+ /**
95
+ * Adapter to use. Default: auto-detected from the runtime.
96
+ * - `"bun"`: uses `Bun.redis`
97
+ * - `"node"`: uses `ioredis`
98
+ * - `"cloudflare"`: uses Workers KV (set `client.env.KV`)
99
+ * - `"memory"`: in-process map (no external dep; useful
100
+ * for tests / single-process dev)
101
+ */
102
+ adapter?: RedisAdapterKind;
103
+ /**
104
+ * Redis server URL. Used by `bun` and `node` adapters.
105
+ * Default: `process.env.REDIS_URL ?? "redis://localhost:6379"`.
106
+ */
107
+ url?: string;
108
+ /** Key prefix. Default: `""` (no prefix). */
109
+ keyPrefix?: string;
110
+ /** Default TTL in seconds. `0` = no expiry. Default: 0. */
111
+ defaultTtlSeconds?: number;
112
+ /**
113
+ * Cloudflare-only. The `KVNamespace` binding to use. The
114
+ * framework auto-detects `c.env?.KV` at boot when running
115
+ * on Workers; you can also pass it explicitly.
116
+ */
117
+ kv?: KVNamespaceLike;
118
+ /**
119
+ * Node-only. Extra `ioredis` options (tls, password, db index,
120
+ * retry strategy, etc.). Ignored by other adapters.
121
+ */
122
+ nodeOptions?: Record<string, unknown>;
123
+ }
124
+ /** Minimal shape we need from Workers `KVNamespace`. */
125
+ export interface KVNamespaceLike {
126
+ get(key: string): Promise<string | null>;
127
+ put(key: string, value: string, options?: {
128
+ expirationTtl?: number;
129
+ expiration?: number | string;
130
+ metadata?: unknown;
131
+ }): Promise<void>;
132
+ delete(key: string): Promise<void>;
133
+ list<Metadata = unknown>(options?: {
134
+ prefix?: string;
135
+ limit?: number;
136
+ cursor?: string;
137
+ }): Promise<{
138
+ keys: {
139
+ name: string;
140
+ metadata?: Metadata;
141
+ }[];
142
+ cursor: string;
143
+ list_complete: boolean;
144
+ }>;
145
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexusts/redis",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Runtime-aware Redis client (Bun / Node / Workers)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,28 +12,15 @@
12
12
  "import": "./dist/index.js"
13
13
  }
14
14
  },
15
- "files": [
16
- "dist",
17
- "README.md"
18
- ],
15
+ "files": ["dist", "README.md"],
19
16
  "scripts": {
20
17
  "build": "bun run ../../build.ts"
21
18
  },
22
- "keywords": [
23
- "nexusts",
24
- "framework",
25
- "bun"
26
- ],
19
+ "keywords": ["nexusts", "framework", "bun"],
27
20
  "license": "MIT",
28
- "peerDependencies": {
29
- "ioredis": "^5.11.1"
30
- },
31
- "peerDependenciesMeta": {
32
- "ioredis": {
33
- "optional": true
34
- }
35
- },
21
+ "peerDependencies": { "ioredis": "^5.11.1" },
22
+ "peerDependenciesMeta": { "ioredis": { "optional": true } },
36
23
  "dependencies": {
37
- "@nexusts/core": "^0.7.0"
24
+ "@nexusts/core": "file:../core"
38
25
  }
39
26
  }