{"_id":"@ws-kit/rate-limit","_rev":"7-48f2325cb02f0eaa6f17981199a4a590","name":"@ws-kit/rate-limit","dist-tags":{"latest":"0.10.0"},"versions":{"1.0.0":{"name":"@ws-kit/rate-limit","version":"1.0.0","keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"author":{"name":"Konstantin Tarkus"},"license":"MIT","_id":"@ws-kit/rate-limit@1.0.0","maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"homepage":"https://kriasoft.com/ws-kit/","bugs":{"url":"https://github.com/kriasoft/ws-kit/issues"},"dist":{"shasum":"27b591861502e9607dfc22a34b06e46ee56ea79c","tarball":"https://registry.npmjs.org/@ws-kit/rate-limit/-/rate-limit-1.0.0.tgz","fileCount":20,"integrity":"sha512-NddyH1hpvXAjXrJq/VuqCRBg++4zn/cp8rN8rR5MVNBwy54y5ldAEjFy0dPYDIEoFs+2QZX7zTfL3o6FwiHz/w==","signatures":[{"sig":"MEQCIBR7mPU8nIRVsu8x11BVmiYzOBtf3j7s/dTzHK8mFazUAiBOc1UrXUv4PntEvaoYWUMsbl554ogSCyYQxBfNvgvy4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ws-kit%2frate-limit@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":80972},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"}},"funding":{"url":"https://github.com/sponsors/koistya","type":"github"},"gitHead":"6d3f6cf7565bad547d6efc388e6840cd54e50b1c","_npmUser":{"name":"kriasoft-bot","email":"kriasoft@gmail.com"},"deprecated":"Invalid version number","repository":{"url":"git+https://github.com/kriasoft/ws-kit.git","type":"git","directory":"packages/rate-limit"},"_npmVersion":"11.6.2","description":"Token-bucket rate limiting middleware for WS-Kit","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.3","@ws-kit/zod":"workspace:^","@ws-kit/core":"workspace:^","@ws-kit/memory":"workspace:^"},"peerDependencies":{"@ws-kit/core":"^0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/rate-limit_1.0.0_1764541789449_0.4315296982566923","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@ws-kit/rate-limit","version":"0.7.0","keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"author":"Konstantin Tarkus","license":"MIT","_id":"@ws-kit/rate-limit@0.7.0","maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"homepage":"https://kriasoft.com/ws-kit/","bugs":"https://github.com/kriasoft/ws-kit/issues","dist":{"shasum":"f9127d069c3474785568f9def0d847a4357cf84d","tarball":"https://registry.npmjs.org/@ws-kit/rate-limit/-/rate-limit-0.7.0.tgz","fileCount":21,"integrity":"sha512-T0Y8OeLN+KZsHlTykbtGUqYPM6CUMYnW4cK/rMjCztKh8d/OVNZaReGK9cPfJBYOpYmsuPcoCa0MdBGMMQYW3g==","signatures":[{"sig":"MEUCICOqd37u6TtNr3/IaYygGiAoPexJ1fmllYKuBLvF39UXAiEAtLoK5R9UG73VXQ4pnyr8cQw9AC48G4zUXK/+JbKaS7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138223},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"f9127d069c3474785568f9def0d847a4357cf84d","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"funding":{"url":"https://github.com/sponsors/koistya","type":"github"},"_npmUser":{"name":"koistya","email":"hello@tarkus.me"},"_integrity":"sha512-T0Y8OeLN+KZsHlTykbtGUqYPM6CUMYnW4cK/rMjCztKh8d/OVNZaReGK9cPfJBYOpYmsuPcoCa0MdBGMMQYW3g==","repository":{"url":"https://github.com/kriasoft/ws-kit.git","type":"git","directory":"packages/rate-limit"},"_npmVersion":"10.8.3","description":"Token-bucket rate limiting middleware for WS-Kit","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.3","@ws-kit/zod":"^0.7.0","@ws-kit/core":"^0.7.0","@ws-kit/memory":"^0.7.0"},"peerDependencies":{"@ws-kit/core":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/rate-limit_0.7.0_1764544917917_0.5506214294922687","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@ws-kit/rate-limit","version":"0.8.0","keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"author":{"name":"Konstantin Tarkus"},"license":"MIT","_id":"@ws-kit/rate-limit@0.8.0","maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"homepage":"https://kriasoft.com/ws-kit/","bugs":{"url":"https://github.com/kriasoft/ws-kit/issues"},"dist":{"shasum":"1425c18c138581ea84628e616e61f5588ca05bf4","tarball":"https://registry.npmjs.org/@ws-kit/rate-limit/-/rate-limit-0.8.0.tgz","fileCount":20,"integrity":"sha512-qsbHE89KHkUtN8DAK9/GFhgHDz6+nz7WZa9DH4IJa1ZtpzZ2yCsYfjmEsR/xOvc0rWy/X8AZb1wLELDZE2ASfw==","signatures":[{"sig":"MEYCIQCGuEJwka6Y4g1Ll/z9SNautq4uPRY2pMTK3BjVu+jRBgIhANl7m32ZhJ1antSeqJyxXa8y2G6yyCUB1uY88ufOnyf6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ws-kit%2frate-limit@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81026},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"funding":{"url":"https://github.com/sponsors/koistya","type":"github"},"gitHead":"b1d18ca9b170c34c784ff4b4d5b03d44e13148b3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dc10e10c-87d0-4ec0-b6da-a491df922984"}},"repository":{"url":"git+https://github.com/kriasoft/ws-kit.git","type":"git","directory":"packages/rate-limit"},"_npmVersion":"11.6.2","description":"Token-bucket rate limiting middleware for WS-Kit","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.3","@ws-kit/zod":"^0.8.0","@ws-kit/core":"^0.8.0","@ws-kit/memory":"^0.8.0"},"peerDependencies":{"@ws-kit/core":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/rate-limit_0.8.0_1764547609990_0.03578745498490088","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@ws-kit/rate-limit","version":"0.8.1","keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"author":{"name":"Konstantin Tarkus"},"license":"MIT","_id":"@ws-kit/rate-limit@0.8.1","maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"homepage":"https://kriasoft.com/ws-kit/","bugs":{"url":"https://github.com/kriasoft/ws-kit/issues"},"dist":{"shasum":"9397230ba92ac61d14e3e0a8d66abce7cf2477cf","tarball":"https://registry.npmjs.org/@ws-kit/rate-limit/-/rate-limit-0.8.1.tgz","fileCount":20,"integrity":"sha512-+lYe5sQZwmQDOlq8Ij4Aw1AJZse+3tPOTCcrUJcku9YG/TV1yEIG/VoQQdEijt52nFqr7+zNhrn4iCQTVlBB4g==","signatures":[{"sig":"MEUCIQDEhMriuvYJiIdCb4PK4JnTIGYLgYxMTtk+Voepgz+RegIgQYYZsZ57ldwaCP5zLia5GaDlaRh/wB7F6LfGttasgUs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ws-kit%2frate-limit@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82256},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"funding":{"url":"https://github.com/sponsors/koistya","type":"github"},"gitHead":"7ba20c305112106486d082bd4241806667c98b8d","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dc10e10c-87d0-4ec0-b6da-a491df922984"}},"repository":{"url":"git+https://github.com/kriasoft/ws-kit.git","type":"git","directory":"packages/rate-limit"},"_npmVersion":"11.6.2","description":"Token-bucket rate limiting middleware for WS-Kit","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.3","@ws-kit/zod":"^0.8.1","@ws-kit/core":"^0.8.1","@ws-kit/memory":"^0.8.0"},"peerDependencies":{"@ws-kit/core":"^0.8.1"},"_npmOperationalInternal":{"tmp":"tmp/rate-limit_0.8.1_1764550070256_0.9146592348833453","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@ws-kit/rate-limit","version":"0.9.0","keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"author":{"name":"Konstantin Tarkus"},"license":"MIT","_id":"@ws-kit/rate-limit@0.9.0","maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"homepage":"https://kriasoft.com/ws-kit/","bugs":{"url":"https://github.com/kriasoft/ws-kit/issues"},"dist":{"shasum":"cd588d1a61e90ab3b7d88b7b0b51e6a56a9a5724","tarball":"https://registry.npmjs.org/@ws-kit/rate-limit/-/rate-limit-0.9.0.tgz","fileCount":20,"integrity":"sha512-lQ+DT9aTKhKKHj8xll6Y2KgnQi/MzgWVoHClScY/6ka0VZhoUnBeAhbWyl099QB3JMgCGDP1/+IRKrkWTBAcpg==","signatures":[{"sig":"MEUCIDdfldHUT6YQdEdQAUFHtpVaPnfGXGHnQWbUs0EZ2cLEAiEAhMvmHvVBBu3A9tES+KjBAobd7Lu0QfBNhKpjhKvC42I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ws-kit%2frate-limit@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82657},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"funding":{"url":"https://github.com/sponsors/koistya","type":"github"},"gitHead":"7f41d1c07b55142e2f575372066b7db0a6cc5362","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dc10e10c-87d0-4ec0-b6da-a491df922984"}},"repository":{"url":"git+https://github.com/kriasoft/ws-kit.git","type":"git","directory":"packages/rate-limit"},"_npmVersion":"11.6.2","description":"Token-bucket rate limiting middleware for WS-Kit","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.3","@ws-kit/zod":"^0.9.0","@ws-kit/core":"^0.9.0","@ws-kit/memory":"^0.9.0"},"peerDependencies":{"@ws-kit/core":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/rate-limit_0.9.0_1764885621811_0.907486850733771","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@ws-kit/rate-limit","version":"0.10.0","description":"Token-bucket rate limiting middleware for WS-Kit","type":"module","sideEffects":false,"license":"MIT","author":{"name":"Konstantin Tarkus"},"homepage":"https://kriasoft.com/ws-kit/","bugs":{"url":"https://github.com/kriasoft/ws-kit/issues"},"repository":{"type":"git","url":"git+https://github.com/kriasoft/ws-kit.git","directory":"packages/rate-limit"},"funding":{"type":"github","url":"https://github.com/sponsors/koistya"},"keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"main":"./dist/index.js","types":"./dist/index.d.ts","peerDependencies":{"@ws-kit/core":"^0.10.0"},"devDependencies":{"@types/bun":"^1.3.3","@ws-kit/core":"^0.10.0","@ws-kit/memory":"^0.10.0","@ws-kit/zod":"^0.10.0"},"engines":{"node":">=22"},"publishConfig":{"access":"public"},"gitHead":"b0a32263ddc6a0b9a54084519304f0bbb478538f","_id":"@ws-kit/rate-limit@0.10.0","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-KixZzx2mEEBQ7pKRTS4otBPP7MKlc0gj2h3Du4gIy7JSKSrZpOXt31DBISn809R1qJ1FMa3yk4lAqHCSv0cpPA==","shasum":"472ededd9dfab4aa48af97ea897b172eecf502ae","tarball":"https://registry.npmjs.org/@ws-kit/rate-limit/-/rate-limit-0.10.0.tgz","fileCount":20,"unpackedSize":82741,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ws-kit%2frate-limit@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCz5euoJiugQlEflvkXLP4njdrd7XswK0Ec9OmhqpX1JAIhAMaevf5ElMMWsRpf5lMVnPj0T5oEKQ9BexLjNzPQ2/8n"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dc10e10c-87d0-4ec0-b6da-a491df922984"}},"directories":{},"maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rate-limit_0.10.0_1764943202231_0.4757721555516776"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-30T22:29:49.373Z","modified":"2025-12-05T14:00:02.771Z","1.0.0":"2025-11-30T22:29:49.630Z","0.7.0":"2025-11-30T23:21:58.141Z","0.8.0":"2025-12-01T00:06:50.199Z","0.8.1":"2025-12-01T00:47:50.454Z","0.9.0":"2025-12-04T22:00:21.947Z","0.10.0":"2025-12-05T14:00:02.372Z"},"bugs":{"url":"https://github.com/kriasoft/ws-kit/issues"},"author":{"name":"Konstantin Tarkus"},"license":"MIT","homepage":"https://kriasoft.com/ws-kit/","keywords":["websocket","rate-limiting","rate-limiter","token-bucket","adapter","interface","type-safe","typescript"],"repository":{"type":"git","url":"git+https://github.com/kriasoft/ws-kit.git","directory":"packages/rate-limit"},"description":"Token-bucket rate limiting middleware for WS-Kit","maintainers":[{"name":"koistya","email":"hello@tarkus.me"},{"name":"kriasoft-bot","email":"kriasoft@gmail.com"}],"readme":"# @ws-kit/rate-limit\n\nToken-bucket rate limiting for WS-Kit with pluggable backends and ready-to-use key functions.\n\n## Installation\n\n```bash\nnpm install @ws-kit/rate-limit @ws-kit/memory @ws-kit/core\n```\n\n## Quick start\n\n```typescript\nimport { createRouter } from \"@ws-kit/core\";\nimport { rateLimit, keyPerUserPerType } from \"@ws-kit/rate-limit\";\nimport { memoryRateLimiter } from \"@ws-kit/memory\";\n\nconst limiter = memoryRateLimiter({ capacity: 100, tokensPerSecond: 10 });\n\nconst router = createRouter().use(\n  rateLimit({\n    limiter,\n    key: keyPerUserPerType, // rl:tenant:user:type\n    cost: () => 1,\n  }),\n);\n```\n\n## Adapters\n\n- **Memory (`@ws-kit/memory`)** — Single-process dev/test. Zero dependencies. Optional `prefix` to isolate policies sharing a backend.\n- **Redis (`@ws-kit/redis`)** — Distributed, atomic via Lua and server clock. Use when running multiple pods/servers.\n- **Durable Objects** — See Cloudflare adapter for serverless deployments.\n\n## Keys and cost\n\n- `keyPerUserPerType` (default): per-user, per-message-type fairness.\n- `keyPerUser`: single bucket per user (lighter memory).\n- Custom: `key: (ctx) => \"rl:tenant:user:type\"`; include tenant/user/type as needed.\n- `cost`: weight expensive operations (`return ctx.type === \"Compute\" ? 10 : 1`).\n- Anonymous users: built-in keys fall back to `\"anon\"`, so guests share one bucket; use a custom key with IP/session when you need per-guest isolation.\n\n## Policy shape\n\n```typescript\ninterface RateLimitPolicy {\n  capacity: number; // max tokens\n  tokensPerSecond: number; // refill rate\n  prefix?: string; // optional key namespace\n}\n```\n\n## Decisions\n\n`consume()` returns `{ allowed: boolean; remaining: number; retryAfterMs: number | null; }`. `retryAfterMs` is `null` when cost exceeds capacity.\n\n## Tips\n\n- Memory adapter is not shared across processes; pick Redis/DO for multi-instance limits.\n- Inject a clock into `memoryRateLimiter()` for deterministic tests.\n- Keep keys stable and short; prefix when sharing a backend across multiple policies.\n","readmeFilename":"README.md"}