stat.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { and, Database, inArray } from "@opencode-ai/console-core/drizzle/index.js"
  2. import { ModelTpsRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js"
  3. type Result = Record<string, { interval: number; qualify: number; unqualify: number }[]>
  4. export default {
  5. async fetch(request: Request) {
  6. if (request.method !== "POST") return new Response("Method Not Allowed", { status: 405 })
  7. const body = (await request.json()) as { ids: string[] }
  8. const ids = body.ids
  9. if (ids.length === 0) return Response.json({} satisfies Result)
  10. const toInterval = (date: Date) =>
  11. parseInt(
  12. date
  13. .toISOString()
  14. .replace(/[^0-9]/g, "")
  15. .substring(0, 12),
  16. )
  17. const now = Date.now()
  18. const intervals = Array.from({ length: 30 }, (_, i) => toInterval(new Date(now - i * 60 * 1000)))
  19. const rows = await Database.use((tx) =>
  20. tx
  21. .select()
  22. .from(ModelTpsRateLimitTable)
  23. .where(and(inArray(ModelTpsRateLimitTable.id, ids), inArray(ModelTpsRateLimitTable.interval, intervals))),
  24. )
  25. const rowsByKey = new Map(rows.map((row) => [`${row.id}:${row.interval}`, row]))
  26. const result: Result = Object.fromEntries(
  27. ids.map((id) => [
  28. id,
  29. intervals.map((interval) => {
  30. const row = rowsByKey.get(`${id}:${interval}`)
  31. return { interval, qualify: row?.qualify ?? 0, unqualify: row?.unqualify ?? 0 }
  32. }),
  33. ]),
  34. )
  35. return Response.json(result)
  36. },
  37. }