unified-keys 0.8.0 → 0.9.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/README.md CHANGED
@@ -55,7 +55,7 @@ const v = await client.verifyKey({ key: userKey, context: { ip: "1.2.3.4" } });
55
55
 
56
56
  创建 key(自动绑定 client.appId)。返回 `{ keys: [{ key, keyId }] }`,`key` 是完整明文。`length` 默认 8;**长期付费 key 传 16**。
57
57
 
58
- `autoDelete`:`true` 立即软删;`"3m"`/`"2h"`/`"3d"` 延迟软删(set deleteAt,Cron 清理,保留记录供 admin 查一段时间)。
58
+ `autoDelete`:`true` 立即软删;`"3m"`/`"2h"`/`"3d"` 延迟软删(set deleteAt,Cron 每 5min 清理,保留记录供 admin 查一段时间)。`"now"`/`"0"` 等价 `true`(0.9.0 收窄,向后兼容)。`KeyRecord.deleteAt` 返回软删时间点,前端可展示「将于 XX 软删」。
59
59
 
60
60
  ### `checkKey({ key, context? })` / `client.checkKey(...)`
61
61
 
@@ -89,6 +89,13 @@ const v = await client.verifyKey({ key: userKey, context: { ip: "1.2.3.4" } });
89
89
  - **rootKey 必传**:verify 扣减也需 rootKey(0.6.0 已加鉴权)
90
90
  - **baseUrl 内置**:不再在文档/示例暴露服务地址
91
91
 
92
+ ## 0.8.0 → 0.9.0
93
+
94
+ - **autoDelete 值域收窄**:`true`(立即软删) / `"3m"`/`"2h"`/`"3d"`(延迟) / 不设(不删);`"now"`/`"0"` 等价 `true`(向后兼容,worker 收到归一)
95
+ - **`KeyRecord.deleteAt`**:新增返回软删时间点(延迟模式 + verify 用尽后写入),前端可展示「将于 XX 软删」
96
+ - **Cron 10min → 5min**:延迟软删精度提升(deleteAt 与实际软删偏差 ≤5min)
97
+ - 非 breaking(additive + 兼容归一)
98
+
92
99
  ## License
93
100
 
94
101
  MIT
package/SKILL.md CHANGED
@@ -11,7 +11,7 @@ description: 当项目需要管理 API key(创建、只读校验、扣减验
11
11
 
12
12
  - **appId 是 client 的责任**:`createClient({ appId, rootKey })` 必传 appId,createKey/listKeys 自动绑定,不再每次传
13
13
  - **check/verify 端点拆分**(0.6.0 安全修复):`POST /v1/keys/check` 公开只读(不扣不删);`POST /v1/keys/verify` 需 `rootKeyAuth`(扣减是写操作)
14
- - **autoDelete 在 createKey 预设**(不再由 verify 调用方传——堵「任何人拿 key 明文删别人 key」漏洞)
14
+ - **autoDelete 在 createKey 预设**(不再由 verify 调用方传——堵「任何人拿 key 明文删别人 key」漏洞);值域 `true`(立即软删) / `"3d"` 等时长(延迟软删) / 不设(不删),`"now"`/`"0"` 等价 `true`(0.9.0 收窄,老值 worker 归一兼容)
15
15
  - **baseUrl 内置**:服务端点已内置到 SDK(`DEFAULT_BASE_URL`),文档/示例不暴露
16
16
 
17
17
  ## 何时用
@@ -87,7 +87,7 @@ if (!isValidKeyFormat(inputKey)) return invalid();
87
87
  | event | `check` | `verify`(无限 key 写 `check`) |
88
88
  | 场景 | 探活 / 前端校验 / 只验证不扣减 | 真正消费额度 |
89
89
 
90
- **`autoDelete`(createKey 预设,verify 执行)**:`true` 立即 soft delete;`"3m"`/`"2h"`/`"3d"` 延迟(set deleteAt,Cron 每 10min 清理);不传 = 不删(无限/长期 key)。
90
+ **`autoDelete`(用尽后软删策略,createKey 预设,verify 执行)**:`true` 立即 soft delete;`"3m"`/`"2h"`/`"3d"` 延迟(set deleteAt,Cron 每 5min 清理);不传 = 不删(无限/长期 key)。`KeyRecord.deleteAt` 返回软删时间点(延迟模式 + 用尽后写入),前端可展示「将于 XX 软删」。
91
91
 
92
92
  **返回 `code`**(valid=false 时):`RATE_LIMITED`(429) / `KEY_PAUSED`、`KEY_BANNED`(423) / `KEY_DISABLED` / `KEY_EXPIRED` / `KEY_EXHAUSTED`。
93
93
 
@@ -172,7 +172,7 @@ const { found, key, recentLogs } = await client.lookupKey({ plaintext: "sk_xxx"
172
172
  ## 实现位置(项目内)
173
173
 
174
174
  - 服务端:`apps/key-service`(Hono Worker;D1 binding `KEY_SERVICE_DB` + Durable Object `RATE_LIMITER`)
175
- - SDK:`packages/keys`(npm `unified-keys@0.7.0`,monorepo workspace 直接用 src;服务端点 `DEFAULT_BASE_URL` 在 `src/client.ts`)
175
+ - SDK:`packages/keys`(npm `unified-keys@0.9.0`,monorepo workspace 直接用 src;服务端点 `DEFAULT_BASE_URL` 在 `src/client.ts`)
176
176
  - schema:`packages/db/src/schemas/key-service.ts`(`key_apps` / `key_records`(含 `auto_delete` 列)/ `key_usage_logs`)
177
- - migrations:`packages/infra/migrations/keys/0001` ~ `0005`(alchemy deploy 自动跑)
177
+ - migrations:`packages/infra/migrations/keys/0001` ~ `0007`(alchemy deploy 自动跑)
178
178
  - rootKey:`packages/infra/.env` 的 `KEYS_ROOT_KEY`(admin-api + 4 应用共用,alchemy `secret("KEYS_ROOT_KEY")` 同步)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unified-keys",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "通用 API key 管理 SDK(明文存储 + 明文返回 + 完整使用记录 + per-key 限流/自动处罚)",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
package/src/types.ts CHANGED
@@ -75,8 +75,9 @@ export interface CreateKeyInput {
75
75
  /** 自动处罚策略(存 meta.autoBan):pause/ban 互斥,banAfter 渐进式 */
76
76
  autoBan?: AutoBanConfig;
77
77
  /**
78
- * autoDeletecreateKey 时预设为 key 属性,verify 扣减到 0 时执行;verify 端点不再接受调用方传参):
79
- * true / "now" → 立即 soft delete;"3m" / "2h" / "3d" → set deleteAt,Cron 软删(保留记录供 admin 查一段时间)
78
+ * autoDelete(用尽后软删策略:createKey 预设,verify 扣到 0 时执行;verify 端点不再接受调用方传参):
79
+ * true → 立即 soft delete;"3m"/"2h"/"3d" → set deleteAt,Cron 软删(保留记录供 admin 查一段时间);不设 = 不删
80
+ * ("now"/"0" 老值等价 true,向后兼容)
80
81
  */
81
82
  autoDelete?: boolean | string;
82
83
  /** 批量创建数量,默认 1 */
@@ -115,12 +116,14 @@ export interface CreateKeyResult {
115
116
 
116
117
  export interface KeyRecord {
117
118
  appId: string;
118
- /** autoDelete 策略(createKey 预设,verify 只读):null=不删 | "true"=用尽立即软删 | "3m"/"2h"/"3d"=延迟软删 */
119
+ /** autoDelete 策略(createKey 预设,verify 只读):null=不删 | "true"=用尽立即软删 | "Nm"/"Nh"/"Nd"=延迟软删 */
119
120
  autoDelete: string | null;
120
121
  banReason: string | null;
121
122
  banStatus: "active" | "paused" | "banned";
122
123
  createdAt: string;
123
124
  creditsRemaining: number;
125
+ /** 软删时间点(ISO):autoDelete 延迟模式 + verify 扣到 0 时写入;Cron 每 5min 扫描软删;null=未安排 */
126
+ deleteAt: string | null;
124
127
  /** soft delete 标志(true=已软删,verify/list 过滤但 admin 可查)*/
125
128
  deleted: boolean;
126
129
  enabled: boolean;