{"_id":"@arki/kv","_rev":"7-2036c2fa3079e3d977c3c009714ef46e","name":"@arki/kv","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"@arki/kv","version":"0.1.0","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"license":"MIT","_id":"@arki/kv@0.1.0","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"dist":{"shasum":"750177a823890edec9e940a6c352ed58c51d972c","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.0.tgz","fileCount":31,"integrity":"sha512-UKB/INcKwiaG7FuHQctu0V9V5OrUgliQRVWCNK+izP13x5zFNqjk4vcGsoHhx8jz5YLgbod5UF+xzT6GBnSj1g==","signatures":[{"sig":"MEUCICrFQRMGjRYBAbhotYK76i/2ivslH0UAWPjg6U+r51xUAiEAjVLwvOtzrp4aU5ZrVEQTEp90cv0I7N4882lVbMt6rv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59234},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./package.json":"./package.json"},"gitHead":"9de2af727a30e1081cb81864ce1b144a91d79855","_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"repository":{"url":"git+https://github.com/arki-labs/arki.git","type":"git"},"_npmVersion":"10.9.2","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","dependencies":{"zod":"4.3.5","keyv":"^5.6.0","ioredis":"^5.9.2","@arki/log":"0.0.1","@keyv/redis":"5.1.6","@arki/contracts":"0.0.1","@t3-oss/env-core":"^0.13.10","rate-limiter-flexible":"^9.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@arki/dot":"^0.1.0"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kv_0.1.0_1779377957631_0.23198606302948677","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@arki/kv","version":"0.1.1","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"license":"MIT","_id":"@arki/kv@0.1.1","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"dist":{"shasum":"66a8c82161fc726925410349a6f51375d3dc291e","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.1.tgz","fileCount":31,"integrity":"sha512-jpX//eQ7+839k/5zSKn+kxCTBCTkCyQYvfn6/vViGKgYQDj5jiOdtvgjkZzgiYs0s6ZOMAqNU2txv6J62Qn5Sw==","signatures":[{"sig":"MEYCIQCC2mewWAWfKoUE3CCD9pa8V5OAUtJIfPnGKA2QFbiwCgIhAPh6NNeCNYPoTdF6slgAOWmmO2Ke4MMfCi1gtC3FE8kd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57723},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./package.json":"./package.json"},"gitHead":"ec6a34f9c9551065c4487586fc1fde916257bbba","_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"repository":{"url":"git+https://github.com/arki-labs/arki.git","type":"git"},"_npmVersion":"10.9.2","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","dependencies":{"zod":"4.3.5","keyv":"^5.6.0","ioredis":"^5.9.2","@arki/env":"0.0.2","@arki/log":"0.0.1","@keyv/redis":"5.1.6","@arki/contracts":"0.0.1","@t3-oss/env-core":"^0.13.10","rate-limiter-flexible":"^9.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@arki/dot":"^0.1.1"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kv_0.1.1_1783065016492_0.8264815492070352","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@arki/kv","version":"0.1.2","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"license":"MIT","_id":"@arki/kv@0.1.2","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"dist":{"shasum":"d161d077bed380966e759a63670ba2d61ff27b6b","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.2.tgz","fileCount":38,"integrity":"sha512-p5Fk7vKKbvvq/uj27mF8NLS3nosWOdC3M2XWIwj3/rGnZuabFQhlHFLLyMKkBCd/DJmM64mhHyRyCCZz2/dhgg==","signatures":[{"sig":"MEUCIQCtxX/Ef29VVXXz4KHw9adnC+5AHxkl+59iNWDfbd9gjQIgGGbXneu3whnUVpzFlnOwy2mDrqCTDFZ57XBTKQvTL74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81580},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./package.json":"./package.json"},"gitHead":"a46a9c2b0765c402f95674b9d12135930d5b213f","_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"repository":{"url":"git+https://github.com/arki-labs/arki.git","type":"git"},"_npmVersion":"10.9.2","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","dependencies":{"zod":"4.3.5","keyv":"^5.6.0","ioredis":"^5.9.2","@arki/env":"0.0.3","@arki/log":"0.0.2","@keyv/redis":"5.1.6","@arki/contracts":"0.0.2","@t3-oss/env-core":"^0.13.10","rate-limiter-flexible":"^9.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@arki/dot":"^0.1.2"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kv_0.1.2_1783067624586_0.3117655636238261","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@arki/kv","version":"0.1.3","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"license":"MIT","_id":"@arki/kv@0.1.3","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"dist":{"shasum":"b636cd0179884832a4c8fe8488d58af6b9551ab8","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.3.tgz","fileCount":38,"integrity":"sha512-t6dw6ZfY9+Cq28oFwueCe0BgEDNufcH7ouQcx3n92Ui7htfRph9dFkLnbF+ke43o5P3nmzavdyn4mH3XWuadIA==","signatures":[{"sig":"MEUCIQDAZMe4op2q6WvDV9XlSuzGurWBTupTIbGyYkovcM+jfAIgd98qLE74vyo2rOyDAkZb/MeCZUbA9BJWCRRz9Cd/Clg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81580},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./package.json":"./package.json"},"gitHead":"86a6bc36ef57bfc108f1040f0ea02a4dc87bad6e","_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"repository":{"url":"git+https://github.com/arki-labs/arki.git","type":"git"},"_npmVersion":"10.9.2","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","dependencies":{"zod":"4.3.5","keyv":"^5.6.0","ioredis":"^5.9.2","@arki/env":"0.0.4","@arki/log":"0.0.2","@keyv/redis":"5.1.6","@arki/contracts":"0.0.2","@t3-oss/env-core":"^0.13.10","rate-limiter-flexible":"^9.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@arki/dot":"^0.1.3"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kv_0.1.3_1783172482778_0.019941979749111605","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@arki/kv","version":"0.1.4","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"license":"MIT","_id":"@arki/kv@0.1.4","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"dist":{"shasum":"b02247611a0e40a7ceb971794a93e151ca3da1f0","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.4.tgz","fileCount":38,"integrity":"sha512-vidZIFDhwNh9N1rQDocdx+qG0eo85MlCAmn9gDV7a/v/IENYX2DikvrgjjAijgoWEKCo2P482uvXRBISdVVBLg==","signatures":[{"sig":"MEQCIEXtmRJX48i/2SQIRhNF19Gev6HAN2g0EU2qUoWvb6JgAiAaTd6HCJou7+LG6lyMEbZBGzB5MZoXOOPk5ULzA1JeKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81580},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./package.json":"./package.json"},"gitHead":"a10bbc5a4bae5c1532111165056aea17fdc3730f","_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"repository":{"url":"git+https://github.com/arki-labs/arki.git","type":"git"},"_npmVersion":"10.9.2","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","dependencies":{"zod":"4.3.5","keyv":"^5.6.0","ioredis":"^5.9.2","@arki/env":"0.0.5","@arki/log":"0.0.2","@keyv/redis":"5.1.6","@arki/contracts":"0.0.2","@t3-oss/env-core":"^0.13.10","rate-limiter-flexible":"^9.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@arki/dot":"^0.2.0"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kv_0.1.4_1783348389337_0.7237330576108367","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@arki/kv","version":"0.1.5","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"license":"MIT","_id":"@arki/kv@0.1.5","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"dist":{"shasum":"bb4ecca84ed20b47f2c169212b21bc77affb404b","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.5.tgz","fileCount":38,"integrity":"sha512-0+ipWovcFiVvkXiUQUjNyosioF8/9NAD5wKl+Lv/NMmAq6HzWzwes8rbtpLhWkR4OyQfJF62ksfm+1trhu1XNA==","signatures":[{"sig":"MEUCIQCkmERdGJ6n39kJgQwvP26HrF3i2IwyLG03ImURaJN6hQIgbPPUHCimyvR8LhbgfzO1Lnhh4Rva7FjOynGOijEDMaw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81580},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./package.json":"./package.json"},"gitHead":"31bbbd188f6a5f5e1c278c40f8dbcbefa21ac196","_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"repository":{"url":"git+https://github.com/arki-labs/arki.git","type":"git"},"_npmVersion":"10.9.2","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","dependencies":{"zod":"4.3.5","keyv":"^5.6.0","ioredis":"^5.9.2","@arki/env":"0.0.6","@arki/log":"0.0.2","@keyv/redis":"5.1.6","@arki/contracts":"0.0.2","@t3-oss/env-core":"^0.13.10","rate-limiter-flexible":"^9.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@arki/dot":"^0.3.0"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kv_0.1.5_1783407017744_0.44953608164704306","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@arki/kv","version":"0.1.6","description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/arki-labs/arki.git"},"homepage":"https://arki.dev","bugs":{"url":"https://github.com/arki-labs/arki/issues"},"keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"type":"module","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./env":{"types":"./dist/env.d.ts","import":"./dist/env.js","default":"./dist/env.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js","default":"./dist/errors.js"},"./instance":{"types":"./dist/instance.d.ts","import":"./dist/instance.js","default":"./dist/instance.js"},"./dot":{"types":"./dist/dot.d.ts","import":"./dist/dot.js","default":"./dist/dot.js"},"./package.json":"./package.json"},"dependencies":{"@arki/contracts":"0.0.3","@arki/env":"0.0.7","@arki/log":"0.0.2","@arki/ts":"0.0.3","@keyv/redis":"5.1.6","@t3-oss/env-core":"^0.13.10","ioredis":"^5.9.2","keyv":"^5.6.0","rate-limiter-flexible":"^9.0.1","zod":"4.3.5"},"peerDependencies":{"@arki/dot":"^0.4.0"},"peerDependenciesMeta":{"@arki/dot":{"optional":true}},"publishConfig":{"access":"public"},"_id":"@arki/kv@0.1.6","gitHead":"c2f4c2606cf870f636b60690fee772a4ff7935c9","_nodeVersion":"22.13.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-sr3Sl9KZM233kvRsS0HrbKw86+icDVP0pjEjT3ZgKFjrn/znbcOm/heGZcmyvJiX/DCpY1bxx/BEoNl1ghh6pQ==","shasum":"4b13309878c9b0a9c924ee88a00278c870496587","tarball":"https://registry.npmjs.org/@arki/kv/-/kv-0.1.6.tgz","fileCount":38,"unpackedSize":85832,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDAL3GqTXZIL/MfLum9g38+GMmlqknoKxLZ98o+uHAa3AIhAKHY/Ds40x0M+8sI8LdzlOcoiOhFUgGL7vAZLKZjfhJ6"}]},"_npmUser":{"name":"afurculita","email":"alex@furculita.net"},"directories":{},"maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kv_0.1.6_1783539604459_0.24241965393722653"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-21T15:39:17.521Z","modified":"2026-07-08T19:40:04.792Z","0.1.0":"2026-05-21T15:39:17.772Z","0.1.1":"2026-07-03T07:50:16.651Z","0.1.2":"2026-07-03T08:33:44.701Z","0.1.3":"2026-07-04T13:41:22.914Z","0.1.4":"2026-07-06T14:33:09.475Z","0.1.5":"2026-07-07T06:50:17.876Z","0.1.6":"2026-07-08T19:40:04.618Z"},"bugs":{"url":"https://github.com/arki-labs/arki/issues"},"license":"MIT","homepage":"https://arki.dev","keywords":["arki","typescript","kv","key-value","redis","keyv","rate-limit","cache"],"repository":{"type":"git","url":"git+https://github.com/arki-labs/arki.git"},"description":"Key-value store abstraction with pluggable adapters for ARKI — Redis-backed Keyv client and rate-limiter with TLS auto-detection and Upstash support.","maintainers":[{"name":"afurculita","email":"alex@furculita.net"}],"readme":"# @arki/kv\n\nKey-value store abstraction with pluggable adapters for ARKI. Wraps [Keyv](https://keyv.org/) for general key-value access and [`rate-limiter-flexible`](https://github.com/animir/node-rate-limiter-flexible) for Redis-backed rate limiting. Provides automatic TLS handling (via `rediss://` URLs), Upstash support, and a graceful in-memory fallback when Redis is unreachable.\n\n## Installation\n\n```sh\nnpm install @arki/kv\n# or\nbun add @arki/kv\n# or\npnpm add @arki/kv\n```\n\n## Usage\n\n### `KV` — direct construction\n\n```ts\nimport { KV } from '@arki/kv';\n\nconst kv = new KV('redis://localhost:6379', 'my-app');\n\nawait kv.set('hello', 'world', 60); // 60-second TTL\nconst value = await kv.get('hello'); // 'world'\nawait kv.delete('hello');\n\nawait kv.close();\n```\n\n### `createKV` / `createKVInstance` — env-driven factories\n\n```ts\nimport { createKV } from '@arki/kv';\nimport { createKVInstance } from '@arki/kv/instance';\n\n// Reads KV_URL from process.env, throws if missing.\nconst kv = createKV('my-app');\n\n// Returns null in development if KV_URL is missing (no throw); exits in production.\nconst kvOrNull = createKVInstance('my-app');\n```\n\n### Rate limiting\n\n```ts\nimport { createKV } from '@arki/kv';\nimport { RateLimitExceededError } from '@arki/kv/errors';\n\nconst kv = createKV('my-app');\nconst limiter = kv.getRateLimiter('login', { points: 5, duration: 60 });\n\ntry {\n  await limiter.consume(userId);\n} catch (cause) {\n  if (cause instanceof RateLimitExceededError) {\n    // 429 + Retry-After headers from `cause.getHttpHeaders(5)`.\n  }\n}\n```\n\nWhen the rate-limiter Redis client is not ready, the limiter transparently falls back to an in-memory implementation — your code keeps working, persistence is briefly lost.\n\n## API\n\n- `@arki/kv`\n  - `KV` — Redis-backed key-value + rate-limiter client.\n  - `createKV(namespace?, rateLimitPrefix?)` — env-driven KV factory.\n  - `createRateLimitKV(namespace?)` — env-driven KV factory tuned for rate limiting.\n- `@arki/kv/env` — `env` object holding the validated KV/Redis env vars.\n- `@arki/kv/errors` — `RateLimitExceededError` with HTTP-header helpers.\n- `@arki/kv/instance` — `initializeKV`, `createKVInstance` lazy-singleton helpers.\n\n## Environment variables\n\n| Variable                  | Purpose                                       |\n| ------------------------- | --------------------------------------------- |\n| `KV_URL`                  | Primary Redis/Keyv URL (use `rediss://` TLS). |\n| `KV_NAMESPACE`            | Optional default namespace for keys.          |\n| `RATE_LIMIT_REDIS_URL`    | Dedicated Redis URL for rate limiting.        |\n| `RATE_LIMIT_PREFIX`       | Prefix for rate-limit keys (default `rl`).    |\n| `CACHE_TTL_DEFAULT`       | Default TTL in seconds (default `3600`).      |\n\n## Documentation\n\n`@arki/kv` ships an optional `@arki/kv/dot` adapter for the\n[`@arki/dot`](https://www.npmjs.com/package/@arki/dot) framework.\n\n- See `packages/dot/docs/` in the [`@arki/dot`](https://www.npmjs.com/package/@arki/dot)\n  package for plugin authoring, lifecycle, diagnostics, and the\n  [adapter authoring guide](https://github.com/arkijs/arki/blob/main/packages/dot/docs/adapter-authoring.md).\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}