cloudaxe-opencode/packages/console/function/src/stat.ts

44 lines
1.5 KiB
TypeScript
Raw Normal View History

2026-05-13 01:37:34 +00:00
import { and, Database, inArray } from "@opencode-ai/console-core/drizzle/index.js"
import { ModelTpsRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js"
2026-05-13 19:58:32 +00:00
type Result = Record<string, { interval: number; qualify: number; unqualify: number }[]>
2026-05-13 01:37:34 +00:00
2026-05-13 03:19:23 +00:00
export default {
async fetch(request: Request) {
if (request.method !== "POST") return new Response("Method Not Allowed", { status: 405 })
2026-05-13 01:37:34 +00:00
2026-05-13 16:05:28 +00:00
const body = (await request.json()) as { ids: string[] }
const ids = body.ids
if (ids.length === 0) return Response.json({} satisfies Result)
2026-05-13 01:37:34 +00:00
const toInterval = (date: Date) =>
parseInt(
date
.toISOString()
.replace(/[^0-9]/g, "")
.substring(0, 12),
)
const now = Date.now()
2026-05-13 16:05:28 +00:00
const intervals = Array.from({ length: 30 }, (_, i) => toInterval(new Date(now - i * 60 * 1000)))
2026-05-13 01:37:34 +00:00
const rows = await Database.use((tx) =>
tx
.select()
.from(ModelTpsRateLimitTable)
2026-05-13 19:58:32 +00:00
.where(and(inArray(ModelTpsRateLimitTable.id, ids), inArray(ModelTpsRateLimitTable.interval, intervals))),
2026-05-13 01:37:34 +00:00
)
2026-05-13 19:58:32 +00:00
const rowsByKey = new Map(rows.map((row) => [`${row.id}:${row.interval}`, row]))
2026-05-13 16:05:28 +00:00
const result: Result = Object.fromEntries(
2026-05-13 19:58:32 +00:00
ids.map((id) => [
2026-05-13 16:05:28 +00:00
id,
2026-05-13 19:58:32 +00:00
intervals.map((interval) => {
const row = rowsByKey.get(`${id}:${interval}`)
return { interval, qualify: row?.qualify ?? 0, unqualify: row?.unqualify ?? 0 }
}),
2026-05-13 16:05:28 +00:00
]),
)
2026-05-13 03:19:23 +00:00
return Response.json(result)
},
2026-05-13 01:37:34 +00:00
}