unified-keys 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +15 -8
- package/package.json +2 -2
- package/src/index.ts +2 -0
- package/src/types.ts +32 -12
package/SKILL.md
CHANGED
|
@@ -49,7 +49,7 @@ const { keys } = await client.createKey({
|
|
|
49
49
|
externalId: "user-123", // 应用层关联业务实体(可选)
|
|
50
50
|
meta: { plan: "pro" }, // 任意元数据(可选)
|
|
51
51
|
rateLimit: { max: 60, windowSec: 60 }, // 限流(max 不传 = 不限速)
|
|
52
|
-
autoBan: { threshold: 10, windowSec: 600,
|
|
52
|
+
autoBan: { pause: { threshold: 10, windowSec: 600, durationSec: 3600 }, banAfter: 3 },
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
// 公开只读校验(无需 rootKey,不扣减不删)
|
|
@@ -108,20 +108,27 @@ if (!r.valid) return res.status(403).json({ error: "Key 无效" });
|
|
|
108
108
|
| check/verify 拆分 | ✅ 公开只读 vs 管理扣减 | ❌ 单端点 |
|
|
109
109
|
| 用尽自动删 | ✅ autoDelete(createKey 预设) | ❌ |
|
|
110
110
|
| 永久痕迹 | ✅ soft delete 反查 | ❌ 真删丢痕迹 |
|
|
111
|
-
| 限流 / 自动封禁 | ✅ DO 滑动窗口 /
|
|
111
|
+
| 限流 / 自动封禁 | ✅ DO SQLite 滑动窗口 / pause·ban·渐进 | ❌ |
|
|
112
112
|
| 前置格式校验 | ✅ SDK isValidKeyFormat | ❌ |
|
|
113
113
|
|
|
114
|
-
##
|
|
114
|
+
## 自动处罚(autoBan)
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
`pause` / `ban` 互斥,`banAfter` 渐进式升级。三种模式:
|
|
117
|
+
|
|
118
|
+
**纯暂停**:窗口内 rate_limited 达 `pause.threshold` → 暂停(`pauseCount++`)。
|
|
119
|
+
```jsonc
|
|
120
|
+
{ "pause": { "threshold": 10, "windowSec": 600, "durationSec": 3600 } }
|
|
121
|
+
```
|
|
122
|
+
**直接封禁**:窗口内 rate_limited 达 `ban.threshold` → 永久 ban。
|
|
117
123
|
```jsonc
|
|
118
|
-
{ "
|
|
124
|
+
{ "ban": { "threshold": 15, "windowSec": 600 } }
|
|
119
125
|
```
|
|
120
|
-
|
|
126
|
+
**渐进**(先 pause,累计 N 次升级 ban):`pause` + `banAfter`。
|
|
121
127
|
```jsonc
|
|
122
|
-
{ "
|
|
128
|
+
{ "pause": { "threshold": 10, "windowSec": 600, "durationSec": 3600 }, "banAfter": 3 }
|
|
123
129
|
```
|
|
124
|
-
|
|
130
|
+
|
|
131
|
+
校验:`pause` 与 `ban` 互斥;`banAfter` 仅配 `pause` 时允许。`unban` 重置 `pauseCount`;`unpause` 不重置。
|
|
125
132
|
|
|
126
133
|
## event 类型(usage_log)
|
|
127
134
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unified-keys",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "通用 API key 管理 SDK(明文存储 + 明文返回 + 完整使用记录 + per-key 限流/自动处罚)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
7
7
|
"types": "./src/index.ts",
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ export type {
|
|
|
3
3
|
AppRecord,
|
|
4
4
|
AutoBanConfig,
|
|
5
5
|
BanInput,
|
|
6
|
+
BanRule,
|
|
6
7
|
BatchDeleteResult,
|
|
7
8
|
CheckInput,
|
|
8
9
|
CheckResult,
|
|
@@ -24,6 +25,7 @@ export type {
|
|
|
24
25
|
LookupResult,
|
|
25
26
|
PauseInput,
|
|
26
27
|
PauseResult,
|
|
28
|
+
PauseRule,
|
|
27
29
|
RateLimitConfig,
|
|
28
30
|
UpdateCreditsInput,
|
|
29
31
|
UpdateCreditsResult,
|
package/src/types.ts
CHANGED
|
@@ -35,24 +35,44 @@ export interface RateLimitConfig {
|
|
|
35
35
|
windowSec?: number;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
/**
|
|
39
|
-
export interface
|
|
40
|
-
/**
|
|
41
|
-
action?: "pause" | "ban";
|
|
42
|
-
/** pause 持续秒数,默认 3600(1h)*/
|
|
38
|
+
/** 暂停触发规则(与 ban 互斥):窗口内 rate_limited 达 threshold → 暂停 */
|
|
39
|
+
export interface PauseRule {
|
|
40
|
+
/** 暂停时长秒数,默认 3600(1h) */
|
|
43
41
|
durationSec?: number;
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
/** 统计窗口内 rate_limited 达此数 → 触发一次 pause(pause_count +1) */
|
|
43
|
+
threshold: number;
|
|
44
|
+
/** 统计窗口秒数,默认 600(10min) */
|
|
45
|
+
windowSec?: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** 封禁触发规则(与 pause 互斥):窗口内 rate_limited 达 threshold → 永久 ban */
|
|
49
|
+
export interface BanRule {
|
|
50
|
+
/** 统计窗口内 rate_limited 达此数 → 永久 ban */
|
|
49
51
|
threshold: number;
|
|
50
|
-
/** 统计窗口秒数,默认 600(10min
|
|
52
|
+
/** 统计窗口秒数,默认 600(10min) */
|
|
51
53
|
windowSec?: number;
|
|
52
54
|
}
|
|
53
55
|
|
|
56
|
+
/**
|
|
57
|
+
* 自动处罚策略(存 meta.autoBan)。三种模式:
|
|
58
|
+
* - 纯暂停:`{ pause: { threshold, durationSec } }`
|
|
59
|
+
* - 直接封禁:`{ ban: { threshold } }`
|
|
60
|
+
* - 渐进(先 pause,达 banAfter 后 ban):`{ pause: {...}, banAfter: N }`
|
|
61
|
+
*/
|
|
62
|
+
export interface AutoBanConfig {
|
|
63
|
+
/** 封禁规则。与 pause 互斥。 */
|
|
64
|
+
ban?: BanRule;
|
|
65
|
+
/**
|
|
66
|
+
* 渐进式升级(仅配 pause 时有效):累计 pause 次数达此数 → 升级永久 ban。
|
|
67
|
+
* 配 ban 时不能配;没配 pause 时不能配。
|
|
68
|
+
*/
|
|
69
|
+
banAfter?: number;
|
|
70
|
+
/** 暂停规则。与 ban 互斥。 */
|
|
71
|
+
pause?: PauseRule;
|
|
72
|
+
}
|
|
73
|
+
|
|
54
74
|
export interface CreateKeyInput {
|
|
55
|
-
/**
|
|
75
|
+
/** 自动处罚策略(存 meta.autoBan):pause/ban 互斥,banAfter 渐进式 */
|
|
56
76
|
autoBan?: AutoBanConfig;
|
|
57
77
|
/**
|
|
58
78
|
* autoDelete(createKey 时预设为 key 属性,verify 扣减到 0 时执行;verify 端点不再接受调用方传参):
|