/** * `@drama/ratelimit` 公共面(唯一对外入口,§3 契约)。 * * 给烧钱的 AI 端点(LLM 续写 / TTS 合成 / 生图)挂一层基础令牌桶限流, * 防止 D0 上线即被脚本按 per-IP / 匿名维度薅穿真金白银。计数状态走注入的 * store(生产 redis、测试/单机内存);本包不认识 redis、不读 env、不建任何 * 顶层连接,store 与时钟全部由工厂参数注入。 * * 对外只暴露三个符号:`createRateLimiter`(工厂)、`createMemoryStore`(单机/单测 * store 实现)、`RateLimitConfigError`(结构化配置错误)。桶数学(token-bucket)、 * key 构造、规则匹配均为内部细节,不导出。 * * redis store 不在本包——它需要 redis client(建连接),属 composition root 关切。 * `@app/server` 注入实现 RateLimitStore 接口的 redis 适配(client 仍由 server 注入)。 * * @typedef {import('./rules.js').RateRule} RateRule * @typedef {import('./limiter.js').RateQuery} RateQuery * @typedef {import('./limiter.js').RateDecision} RateDecision */ export { createRateLimiter } from './limiter.js' export { createMemoryStore } from './memory-store.js' export { RateLimitConfigError } from './errors.js'