mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
refactor: 共享请求管道、按需懒加载、流式内存护栏与连接池治理
- 抽取 ApiRequestPipeline 单例,44 个路由文件共享同一实例 - Handler/Adapter 模块级 __getattr__ 延迟导入,减少启动时间 - 新增 ensure_stream_buffer_limit() 流式内存护栏(16MB 单行 / 32MB 总量) - HTTP 空闲连接清理与 curl_cffi LRU 会话池 - ensure_providers_bootstrapped 按需引导指定 provider_types - Usage 事件序列化迁移至 msgpack,Redis codec 隔离 - 启动预热任务(/readyz 就绪门控)与优雅关闭 - 通知邮件模块独立开关与 SMTP 配置校验 - CryptoService DCL 线程安全修复 - 通知模块开关 DB 查询 30s 内存缓存 - /readyz 对 unknown 状态返回 503 - 预热关闭 5s 超时保护 - 预热适配器逐个 try-except 容错 - FormatConversionRegistry 哨兵模式防并发重复物化 - 流式缓冲检查无条件执行 Closes #230 Co-authored-by: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
@@ -68,6 +68,77 @@ export function getProbeCountdown(nextProbeAt: string | null | undefined, _tick:
|
||||
return '探测中'
|
||||
}
|
||||
|
||||
/**
|
||||
* Codex 配额重置倒计时状态
|
||||
*/
|
||||
export interface CodexResetStatus {
|
||||
text: string
|
||||
isUrgent: boolean
|
||||
isCritical: boolean
|
||||
isExpired: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算 Codex 配额重置倒计时
|
||||
* @param resetAt 绝对重置时间(Unix 秒)
|
||||
* @param resetSecs 相对剩余秒数(用于 fallback)
|
||||
* @param updatedAt 元数据更新时间(Unix 秒)
|
||||
* @param _tick 响应式触发器(传入 tick.value 以触发响应式更新)
|
||||
*/
|
||||
export function getCodexResetCountdown(
|
||||
resetAt: number | null | undefined,
|
||||
resetSecs: number | null | undefined,
|
||||
updatedAt: number | null | undefined,
|
||||
_tick: number
|
||||
): CodexResetStatus | null {
|
||||
void _tick
|
||||
|
||||
const nowSec = Math.floor(Date.now() / 1000)
|
||||
let remaining: number
|
||||
|
||||
if (resetAt != null && resetAt > 0) {
|
||||
// 优先绝对时间戳,避免相对秒数快照漂移。
|
||||
remaining = resetAt - nowSec
|
||||
} else if (resetSecs != null && resetSecs >= 0) {
|
||||
if (updatedAt != null && updatedAt > 0) {
|
||||
// 时钟偏移下 updatedAt 可能晚于当前时间,elapsed 需要下限钳制到 0。
|
||||
const elapsedSec = Math.max(nowSec - updatedAt, 0)
|
||||
remaining = resetSecs - elapsedSec
|
||||
} else {
|
||||
remaining = resetSecs
|
||||
}
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
|
||||
if (remaining <= 0) {
|
||||
return { text: '已重置', isUrgent: false, isCritical: false, isExpired: true }
|
||||
}
|
||||
|
||||
const total = Math.floor(remaining)
|
||||
const days = Math.floor(total / 86400)
|
||||
const hours = Math.floor((total % 86400) / 3600)
|
||||
const minutes = Math.floor((total % 3600) / 60)
|
||||
const seconds = total % 60
|
||||
const pad = (n: number) => n.toString().padStart(2, '0')
|
||||
|
||||
let text: string
|
||||
if (days > 0) {
|
||||
text = `${days}天 ${hours}:${pad(minutes)}:${pad(seconds)}`
|
||||
} else if (hours > 0) {
|
||||
text = `${hours}:${pad(minutes)}:${pad(seconds)}`
|
||||
} else {
|
||||
text = `${minutes}:${pad(seconds)}`
|
||||
}
|
||||
|
||||
return {
|
||||
text,
|
||||
isUrgent: total < 3600,
|
||||
isCritical: total < 300,
|
||||
isExpired: false,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* OAuth Token 状态信息
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user