create-rate-limiter
Generates Rate Limiter pattern for PHP 8.4. Creates request throttling with token bucket, sliding window, and fixed window algorithms. Includes unit tests.
Works with
---
name: create-rate-limiter
description: Generates Rate Limiter pattern for PHP 8.4. Creates request throttling with token bucket, sliding window, and fixed window algorithms. Includes unit tests.
license: MIT
---
# Rate Limiter Generator
Creates Rate Limiter pattern infrastructure for request throttling and API protection.
## When to Use
| Scenario | Example |
|----------|---------|
| API protection | Prevent abuse |
| Resource throttling | Database connection limits |
| Fair usage | Per-user request limits |
| Burst protection | Spike handling |
## Component Characteristics
### RateLimiterInterface
- Common interface for all algorithms
- Check and consume methods
- Remaining capacity queries
### Algorithms
- **Token Bucket**: Smooth rate limiting with burst capacity
- **Sliding Window**: Time-based with sliding window log
- **Fixed Window**: Simple time-based counter
### RateLimitResult
- Contains allowed/denied status
- Provides retry-after information
- Generates HTTP headers
---
## Generation Process
### Step 1: Generate Core Components
**Path:** `src/Infrastructure/Resilience/RateLimiter/`
1. `RateLimiterInterface.php` — Common interface
2. `RateLimitResult.php` — Result value object with headers
3. `RateLimitExceededException.php` — Exception with retry info
4. `StorageInterface.php` — Storage abstraction
### Step 2: Choose and Generate Algorithm
Choose based on use case:
1. `TokenBucketRateLimiter.php` — For APIs with burst allowance
2. `SlidingWindowRateLimiter.php` — For strict per-time limits
3. `FixedWindowRateLimiter.php` — For simple rate limiting
### Step 3: Generate Storage
1. `RedisStorage.php` — Production storage with TTL
### Step 4: Generate Tests
1. `{Algorithm}RateLimiterTest.php` — Algorithm tests
2. `RateLimitResultTest.php` — Result value object tests
---
## File Placement
| Component | Path |
|-----------|------|
| All Classes | `src/Infrastructure/Resilience/RateLimiter/` |
| Unit Tests | `tests/Unit/Infrastructure/Resilience/RateLimiter/` |
---
## Naming Conventions
| Component | Pattern | Example |
|-----------|---------|---------|
| Interface | `RateLimiterInterface` | `RateLimiterInterface` |
| Token Bucket | `TokenBucketRateLimiter` | `TokenBucketRateLimiter` |
| Sliding Window | `SlidingWindowRateLimiter` | `SlidingWindowRateLimiter` |
| Fixed Window | `FixedWindowRateLimiter` | `FixedWindowRateLimiter` |
| Result | `RateLimitResult` | `RateLimitResult` |
| Exception | `RateLimitExceededException` | `RateLimitExceededException` |
| Test | `{ClassName}Test` | `TokenBucketRateLimiterTest` |
---
## Quick Template Reference
### RateLimiterInterface
```php
interface RateLimiterInterface
{
public function attempt(string $key, int $tokens = 1): RateLimitResult;
public function getRemainingTokens(string $key): int;
public function getRetryAfter(string $key): ?int;
public function reset(string $key): void;
}
```
### RateLimitResult
```php
final readonly class RateLimitResult
{
public static function allowed(int $remaining, int $limit, \DateTimeImmutable $resetsAt): self;
public static function denied(int $limit, int $retryAfter, \DateTimeImmutable $resetsAt): self;
public function isAllowed(): bool;
public function isDenied(): bool;
public function toHeaders(): array; // X-RateLimit-* headers
}
```
---
## Usage Example
```php
// Create limiter
$limiter = new TokenBucketRateLimiter(
capacity: 100,
refillRate: 10.0, // 10 tokens per second
clock: $clock,
storage: new RedisStorage($redis)
);
// Check limit
$result = $limiter->attempt('user:123');
if ($result->isDenied()) {
throw new RateLimitExceededException(
key: 'user:123',
limit: $result->limit,
retryAfterSeconds: $result->retryAfterSeconds
);
}
// Add headers to response
foreach ($result->toHeaders() as $name => $value) {
$response = $response->withHeader($name, (string) $value);
}
```
---
## Algorithm Comparison
| Algorithm | Burst Handling | Memory | Precision | Use Case |
|-----------|----------------|--------|-----------|----------|
| Token Bucket | Good (configurable) | Low | Medium | APIs with burst allowance |
| Sliding Window | Limited | High | High | Strict per-time limits |
| Fixed Window | Poor (boundary issues) | Low | Low | Simple rate limiting |
---
## Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|--------------|---------|----------|
| No Redis/Shared Storage | Per-instance limits | Use shared storage |
| Missing Headers | Client can't adapt | Return X-RateLimit-* headers |
| Single Algorithm | Doesn't fit all cases | Choose per use case |
| No Retry-After | Client spams | Always return retry timing |
| Synchronous Blocking | Thread blocking | Use non-blocking check |
---
## References
For complete PHP templates and examples, see:
- `references/templates.md` — All algorithm implementations
- `references/examples.md` — Middleware example and testsMore API Design skills
lark-event
larksuite/cli
Lark/Feishu real-time event listening / subscribing / consuming: stream events as NDJSON via `lark-cli event consume <EventKey>` (covers IM messages/reactions/chat changes, Approval status changes, Task updates, VC meeting started/joined/ended, Minutes generated, Whiteboard updated, etc.). Use for Lark bots, real-time message processing, long-running subscribers, streaming webhook/push handlers. Supports `--max-events` / `--timeout` bounded runs and a stderr ready-marker contract — designed for AI agents running as subprocesses.
lark-contact
larksuite/cli
飞书 / Lark 通讯录:按姓名 / 邮箱解析成 open_id,或按 open_id 反查姓名 / 部门 / 邮箱 / 联系方式 / 个人状态 / 签名,以及按关键词搜索当前用户可见的机器人 / 智能体(agent)。当用户提到一个名字要下一步发消息 / 排日程,或拿到 open_id 想查具体信息时使用。不负责部门树遍历、按部门列员工、组织架构图,这类需求走原生 OpenAPI。
lark-openapi-explorer
larksuite/cli
飞书/Lark 原生 OpenAPI 探索:从官方文档库中挖掘未经 CLI 封装的原生 OpenAPI 接口。当用户的需求无法被现有 lark-* skill 或 lark-cli 已注册命令满足,需要查找并调用原生飞书 OpenAPI 时使用。

