{"_id":"@aegiskit/store-upstash","name":"@aegiskit/store-upstash","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@aegiskit/store-upstash","version":"0.1.0","description":"Atomic, serverless-correct rate-limit store for Aegis, backed by Upstash Redis.","license":"MIT","type":"module","sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"dependencies":{"@aegiskit/core":"0.1.0"},"peerDependencies":{"@upstash/redis":">=1.34"},"devDependencies":{"@types/node":"^24.0.0","@upstash/redis":"^1.38.0","tsup":"^8.5.1","typescript":"^6.0.3","vitest":"^4.1.9"},"engines":{"node":">=24.0.0"},"keywords":["security","rate-limiting","upstash","redis","serverless","nextjs"],"author":{"name":"tomodahinata"},"homepage":"https://github.com/tomodahinata/aegis/tree/main/packages/store-upstash#readme","repository":{"type":"git","url":"git+https://github.com/tomodahinata/aegis.git","directory":"packages/store-upstash"},"bugs":{"url":"https://github.com/tomodahinata/aegis/issues"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_id":"@aegiskit/store-upstash@0.1.0","_integrity":"sha512-fI5Cy2qfQ5khAW2gT0cDvxOQMwrmTTtDRb622xQNqIZu6G5sIx7kpmoUwaAb3cbI2qVFfKLhkuLHf1DWZ87g8w==","_resolved":"/tmp/c7e3d19a9a7afe368dc847e3bdbc0b51/aegiskit-store-upstash-0.1.0.tgz","_from":"file:aegiskit-store-upstash-0.1.0.tgz","_nodeVersion":"24.17.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-fI5Cy2qfQ5khAW2gT0cDvxOQMwrmTTtDRb622xQNqIZu6G5sIx7kpmoUwaAb3cbI2qVFfKLhkuLHf1DWZ87g8w==","shasum":"c5ac6f436e26d808747346703bd9f45ba9c50590","tarball":"https://registry.npmjs.org/@aegiskit/store-upstash/-/store-upstash-0.1.0.tgz","fileCount":5,"unpackedSize":6397,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID18+PEykGHKmfZAf2P1MAbRhqSsAPIDTMAQUElfPEy2AiA1nG9jNdXd1J1Toevr9iVwXBy2qczBWh11ImbaQxABjQ=="}]},"_npmUser":{"name":"tomodahinata","email":"hikaru.hinata.hikari@icloud.com"},"directories":{},"maintainers":[{"name":"tomodahinata","email":"hikaru.hinata.hikari@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/store-upstash_0.1.0_1782540504121_0.9130167435124001"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-27T06:08:24.001Z","0.1.0":"2026-06-27T06:08:24.263Z","modified":"2026-06-27T06:08:24.455Z"},"maintainers":[{"name":"tomodahinata","email":"hikaru.hinata.hikari@icloud.com"}],"description":"Atomic, serverless-correct rate-limit store for Aegis, backed by Upstash Redis.","homepage":"https://github.com/tomodahinata/aegis/tree/main/packages/store-upstash#readme","keywords":["security","rate-limiting","upstash","redis","serverless","nextjs"],"repository":{"type":"git","url":"git+https://github.com/tomodahinata/aegis.git","directory":"packages/store-upstash"},"author":{"name":"tomodahinata"},"bugs":{"url":"https://github.com/tomodahinata/aegis/issues"},"license":"MIT","readme":"# @aegiskit/store-upstash\n\nAn atomic, **serverless-correct** rate-limit store for [Aegis](https://github.com/your-org/aegis), backed by [Upstash Redis](https://upstash.com).\n\nThis is the store that makes Aegis rate limiting correct on serverless: the increment is a single atomic Redis op (a Lua `INCR` + first-hit `PEXPIRE`), so concurrent function invocations share one counter — unlike an in-process map, which resets per instance and never actually limits.\n\n## Install\n\n```bash\npnpm add @aegiskit/store-upstash @upstash/redis\n```\n\n## Usage\n\n```ts\nimport { RateLimiter, RATE_LIMIT_PRESETS } from '@aegiskit/core';\nimport { createUpstashStore } from '@aegiskit/store-upstash';\nimport { Redis } from '@upstash/redis';\n\nconst limiter = new RateLimiter({\n  store: createUpstashStore({ redis: Redis.fromEnv() }),\n  failureMode: 'open', // allow on Redis outage (logged); use 'closed' to deny\n});\n\nconst { success, retryAfter } = await limiter.limit(userId, RATE_LIMIT_PRESETS.auth);\n```\n\nPass the resulting `limiter` to `secure({ rateLimit: { limiter } })` or `secureRoute({ rateLimit: { limiter, rule } })` from `@aegiskit/next`.\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-b204792bc397aa27a52fd117b0dc0741"}