{"_id":"@bmz_1/graphql-rate-limiter","_rev":"2-a88888fdaeb527757f398c26c6354ff6","name":"@bmz_1/graphql-rate-limiter","dist-tags":{"latest":"1.1.0"},"versions":{"0.0.6":{"name":"@bmz_1/graphql-rate-limiter","version":"0.0.6","author":{"name":"BMZ"},"license":"MIT","_id":"@bmz_1/graphql-rate-limiter@0.0.6","maintainers":[{"name":"bmz_1","email":"boermate@gmail.com"}],"homepage":"https://github.com/bmz1/graphql-rate-limiter#readme","bugs":{"url":"https://github.com/bmz1/graphql-rate-limiter/issues"},"dist":{"shasum":"37c40c8f05995fef98ccdad7a05c4dd1176ad55c","tarball":"https://registry.npmjs.org/@bmz_1/graphql-rate-limiter/-/graphql-rate-limiter-0.0.6.tgz","fileCount":21,"integrity":"sha512-xRTiiXBQ9/OFUAHzpMVDyZPI6+kazH6D6S0RPNlfBVmVqzIo0JavU2JclCxkQnV8ZyymO0aPIDKqiO/bMBnbUg==","signatures":[{"sig":"MEUCIQCysSC/0thP8GN3oUXmMDOFu1QVnIThKL4K0ba0Z0xY5QIgFeyB0BZInJxX/omjcdowggwIJSK621RE77fGJYR6uv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bmz_1%2fgraphql-rate-limiter@0.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18067},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"208a7725a9d5ff9c9bbe4bfcf468ecb6306a1172","scripts":{"test":"vitest --test-timeout=15000","build":"tsc","format":"prettier --write ."},"_npmUser":{"name":"bmz_1","email":"boermate@gmail.com"},"repository":{"url":"git+https://github.com/bmz1/graphql-rate-limiter.git","type":"git"},"_npmVersion":"10.8.2","description":"[![npm version](https://img.shields.io/npm/v/@bmz_1/graphql-rate-limiter](https://www.npmjs.com/package/@bmz_1/graphql-rate-limiter) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"redis":"^4.6.13","graphql":"^16.8.1","ioredis":"^5.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.4","prettier":"^3.4.2","typescript":"^5.7.3","@types/node":"^20.17.16"},"_npmOperationalInternal":{"tmp":"tmp/graphql-rate-limiter_0.0.6_1737892714260_0.08227356970867028","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bmz_1/graphql-rate-limiter","version":"1.0.1","author":{"name":"BMZ"},"license":"MIT","_id":"@bmz_1/graphql-rate-limiter@1.0.1","maintainers":[{"name":"bmz_1","email":"boermate@gmail.com"}],"homepage":"https://github.com/bmz1/graphql-rate-limiter#readme","bugs":{"url":"https://github.com/bmz1/graphql-rate-limiter/issues"},"dist":{"shasum":"76d8d4258106cc2bdf46a3613701a220338ce6ce","tarball":"https://registry.npmjs.org/@bmz_1/graphql-rate-limiter/-/graphql-rate-limiter-1.0.1.tgz","fileCount":21,"integrity":"sha512-bmTf9eMfyPdkkhmUsE5EFkJC+0Jjbom4Dgrj0htv1XNynuCKm9aNRTDJlSN9TCH2kEJMI7Jj4wZGZiw2eFA57w==","signatures":[{"sig":"MEYCIQDTs2vc2KL61H96HyWphHa4rcBxl3z86yTUchzTAA/vygIhAPRlt0YoDtH0L07ptZstJskuDRqq4BAAFeXNEc5e8PSV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bmz_1%2fgraphql-rate-limiter@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":15691},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0b92bb23128d7755357f423b1a590297d849f02b","scripts":{"test":"vitest --test-timeout=15000","build":"tsc","format":"prettier --write ."},"_npmUser":{"name":"bmz_1","email":"boermate@gmail.com"},"repository":{"url":"git+https://github.com/bmz1/graphql-rate-limiter.git","type":"git"},"_npmVersion":"10.8.2","description":"[![npm version](https://img.shields.io/npm/v/@bmz_1/graphql-rate-limiter](https://www.npmjs.com/package/@bmz_1/graphql-rate-limiter) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"redis":"^4.6.13","graphql":"^16.8.1","ioredis":"^5.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.4","prettier":"^3.4.2","typescript":"^5.7.3","@types/node":"^20.17.16"},"_npmOperationalInternal":{"tmp":"tmp/graphql-rate-limiter_1.0.1_1737899971053_0.6762260458917242","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bmz_1/graphql-rate-limiter","version":"1.1.0","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"vitest --test-timeout=15000","format":"prettier --write ."},"dependencies":{"graphql":"^16.8.1","ioredis":"^5.4.2","redis":"^4.6.13"},"devDependencies":{"@types/node":"^20.17.16","prettier":"^3.4.2","typescript":"^5.7.3","vitest":"^3.0.4"},"author":{"name":"BMZ"},"publishConfig":{"access":"public"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bmz1/graphql-rate-limiter.git"},"_id":"@bmz_1/graphql-rate-limiter@1.1.0","gitHead":"7e7cc5fcac7bd605210042ed3ce756e2a45138bb","description":"[![npm version](https://img.shields.io/npm/v/@bmz_1/graphql-rate-limiter](https://www.npmjs.com/package/@bmz_1/graphql-rate-limiter) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)","bugs":{"url":"https://github.com/bmz1/graphql-rate-limiter/issues"},"homepage":"https://github.com/bmz1/graphql-rate-limiter#readme","_nodeVersion":"20.18.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-B6K/uz+IK95CS97ce827J3dzvr50v78/zaAX/Ib2vITwF9Bvpc3/DJTuRwddTm4pASzSQTXZQs324JgV91A0Bw==","shasum":"5e4a9c189a5dcf3dcfc0c1df784b2199bd68f833","tarball":"https://registry.npmjs.org/@bmz_1/graphql-rate-limiter/-/graphql-rate-limiter-1.1.0.tgz","fileCount":21,"unpackedSize":16074,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bmz_1%2fgraphql-rate-limiter@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICKt530cRjwsZtuNYp1cYLxsCYzcAIYrTZKGLXoh17OsAiEAjWn3zTfgWXCj4jV1vVSx3B8Rp8YjYYVuIR0QEhzLBmQ="}]},"_npmUser":{"name":"bmz_1","email":"boermate@gmail.com"},"directories":{},"maintainers":[{"name":"bmz_1","email":"boermate@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/graphql-rate-limiter_1.1.0_1737901026042_0.15912100894463777"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-26T11:58:34.151Z","modified":"2025-01-26T14:17:06.733Z","0.0.6":"2025-01-26T11:58:34.450Z","1.0.1":"2025-01-26T13:59:31.235Z","1.1.0":"2025-01-26T14:17:06.236Z"},"bugs":{"url":"https://github.com/bmz1/graphql-rate-limiter/issues"},"author":{"name":"BMZ"},"license":"MIT","homepage":"https://github.com/bmz1/graphql-rate-limiter#readme","repository":{"type":"git","url":"git+https://github.com/bmz1/graphql-rate-limiter.git"},"description":"[![npm version](https://img.shields.io/npm/v/@bmz_1/graphql-rate-limiter](https://www.npmjs.com/package/@bmz_1/graphql-rate-limiter) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)","maintainers":[{"name":"bmz_1","email":"boermate@gmail.com"}],"readme":"# Shopify Rate Limiter\n\n[![npm version](https://img.shields.io/npm/v/@bmz_1/graphql-rate-limiter](https://www.npmjs.com/package/@bmz_1/graphql-rate-limiter)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA distributed rate limiter for Shopify Admin GraphQL API with Redis backend, supporting multi-store and plan-based rate limits.\n\n## Features\n\n- 🚦 Handle Shopify's calculated query costs\n- 🛑 Distributed rate limiting using Redis\n- ⏱️ Accurate restore time calculations\n- 🏪 Multi-store support\n- 📊 Plan-based rate limits (Standard, Advanced, Plus, Enterprise)\n- 🚀 Atomic operations with Lua scripts\n\n# Shopify Rate Limiter\n\n🔖 _A distributed rate limiter for Shopify Admin GraphQL API with Redis backend_\n\n---\n\n## 📦 Installation\n\n```bash\nnpm install @bmz_1/graphql-rate-limiter ioredis\n```\n\n---\n\n## 🚀 Quick Start\n\n```typescript\nimport Redis from 'ioredis';\nimport { RateLimiter, Plan } from '@bmz_1/graphql-rate-limiter';\n\n// Initialize\nconst redis = new Redis();\nconst limiter = new RateLimiter(redis);\n\n// Usage pattern\nasync function makeShopifyRequest(storeId: string) {\n  const limit = await limiter.checkRateLimit(storeId, Plan.STANDARD);\n\n  if (!limit.allowed) {\n    throw new Error(`Rate limited. Retry in ${limit.retryAfter}ms`);\n  }\n\n  try {\n    const response = await fetchShopifyData();\n\n    // Update with actual API cost\n    await limiter.updateThrottleStatus(storeId, response.extensions.cost.throttleStatus, Plan.STANDARD);\n\n    return response;\n  } catch (error) {\n    // Handle failed request costs\n    await limiter.updateThrottleStatus(\n      storeId,\n      {\n        maximumAvailable: 1000,\n        currentlyAvailable: limit.remainingPoints,\n        restoreRate: 100,\n      },\n      Plan.STANDARD,\n    );\n    throw error;\n  }\n}\n```\n\n---\n\n## ⚙️ Configuration\n\n```plain\n| Plan        | Max Points | Restore Rate |\n|-------------|------------|--------------|\n| Standard    | 1000       | 100/s        |\n| Advanced    | 2000       | 200/s        |\n| Plus        | 5000       | 1000/s       |\n| Enterprise  | 10000      | 2000/s       |\n```\n\n---\n\n## 🧪 Testing Setup\n\n```bash\n# Start Redis\ndocker-compose up -d\n\n# Run tests\nnpm test\n```\n\n---\n\n## 🛠️ Development Commands\n\n```bash\n# Build project\nnpm run build\n\n# Watch mode\nnpm run dev\n\n# Test coverage\nnpm test\n```\n\n---\n\n## 📜 License\n\nMIT © BMZ\n","readmeFilename":"Readme.md"}