ChAbdulWahhab/flowcap

GitHub: ChAbdulWahhab/flowcap

一个零依赖、框架无关的 Node.js HTTP 速率限制中间件,基于内存滑动窗口算法提供高性能请求频率控制。

Stars: 1 | Forks: 0

![Rate limiting, the way it should've been](https://static.pigsec.cn/wp-content/uploads/repos/cas/9c/9cd34c65e54bb106ffe5664ce890e7076b75275473e1149dcaf82ebe3b8f7aa7.png) # @chabdulwahab/flowcap 一个适用于 Node.js 的零依赖、框架无关的 HTTP 速率限制中间件。 [![NPM 版本](https://img.shields.io/npm/v/@chabdulwahab/flowcap.svg?style=flat-square&color=blue)](https://www.npmjs.com/package/@chabdulwahab/flowcap) [![NPM 下载量](https://img.shields.io/npm/dt/@chabdulwahab/flowcap.svg?style=flat-square)](https://www.npmjs.com/package/@chabdulwahab/flowcap) [![依赖项](https://img.shields.io/badge/dependencies-0-brightgreen.svg?style=flat-square)](https://www.npmjs.com/package/@chabdulwahab/flowcap) [![类型:已包含](https://img.shields.io/badge/types-included-blue.svg?style=flat-square)](#) [![Node.js 支持](https://img.shields.io/badge/node-%3E%3D%2018.0.0-brightgreen.svg?style=flat-square)](https://nodejs.org/) [![许可证:MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](https://opensource.org/licenses/MIT)
## 功能 - **框架无关:** 与 Express、Fastify、Koa 以及原生 Node.js HTTP 模块无缝集成。 - **零依赖:** 没有外部运行时依赖,最大程度降低安全风险并减小打包体积。 - **人类可读的时间窗口:** 使用直观的字符串(如 `'15m'`、`'30s'` 或 `'1h'`)来配置持续时间。 - **高性能:** 采用带有 O(1) 自动清理机制的内存滑动窗口算法。 - **内置预设:** 针对常见场景包含预配置的规则集(login、api、strict、loose)。 - **符合标准:** 遵循 RateLimit 标头的 IETF draft-8 标准。 - **一流的 TypeScript 支持:** 包含开箱即用的类型声明。 ## 安装说明 ``` npm install @chabdulwahab/flowcap ``` ## 使用方法 ### Express ``` const express = require('express'); const flowcap = require('@chabdulwahab/flowcap'); const app = express(); // Apply a global rate limit of 100 requests per minute app.use(flowcap({ limit: 100, window: '1m' })); ``` ### 内置预设 预设为常见用例提供了默认配置。这些设置可以被覆盖。 ``` // Protect login route (5 req / 15m) app.post('/login', flowcap.login()); // Standard API limit (100 req / 1m) app.use('/api', flowcap.api()); // Strict limit for administrative routes (20 req / 1m) app.post('/admin', flowcap.strict()); // Loose limit for public assets (500 req / 1m) app.get('/public', flowcap.loose()); // Override a preset configuration app.post('/login', flowcap.login({ limit: 3 })); ``` ## 框架支持 ### Fastify ``` const fastify = require('fastify')(); const flowcap = require('@chabdulwahab/flowcap'); fastify.use(flowcap()); ``` ### Koa ``` const Koa = require('koa'); const flowcap = require('@chabdulwahab/flowcap'); const app = new Koa(); app.use(async (ctx, next) => { return new Promise((resolve) => { flowcap()(ctx.req, ctx.res, () => resolve(next())); }); }); ``` ## API 参考 ### 配置选项 | 选项 | 类型 | 默认值 | 描述 | | --- | --- | --- | --- | | `limit` | `number` | `100` | 每个时间窗口允许的最大请求数。 | | `window` | `string` | `number` | `'1m'` | 时间窗口持续时间。接受可读字符串(例如 `'15m'`、`'30s'`)或毫秒数。 | | `keyBy` | `function` | `req => req.ip` | 提取发起请求的客户端的唯一标识符。 | | `skip` | `function` | `null` | 返回 `true` 以无条件跳过速率限制。 | | `onLimit` | `function` | `null` | HTTP 429 响应的自定义处理器:`(req, res, next)`。 | | `legacyHeaders` | `boolean` | `true` | 在 IETF draft-8 标准之外,附加传统的 `X-RateLimit-*` 标头。 | | `store` | `Store` | `Memory` | 自定义状态存储的实例。 | ### 高级配置 #### 自定义客户端识别 ``` app.use(flowcap({ limit: 200, window: '1h', keyBy: (req) => req.headers['x-api-key'] || req.ip })); ``` #### 条件跳过 ``` app.use(flowcap({ limit: 100, window: '1m', skip: (req) => req.path === '/health' })); ``` #### 自定义速率限制响应 ``` app.use(flowcap({ limit: 50, window: '30s', onLimit: (req, res, next) => { res.status(429).json({ error: 'Rate limit exceeded. Please try again later.' }); } })); ``` ### 自定义存储实现 对于分布式环境(例如 Redis),请实现 `FlowcapStore` 接口并将该实例传递给 `options.store`。 ``` interface FlowcapStore { count(key: string, windowMs: number): number; add(key: string, windowMs: number): void; resetTime(key: string, windowMs: number): number; } ``` ## 资源 * **深度解析 / 文章:** 阅读 [dev.to](https://dev.to/chabdulwahhab310/why-i-stopped-writing-15-60-1000-in-every-project-4gb) 上的详细文章,了解 Flowcap 背后的设计决策和实现细节。 ## 许可证 MIT
标签:Express, Fastify, GNU通用公共许可证, Koa, MITM代理, Node.js, Syscall, Web开发, 中间件, 自定义脚本, 限流