copilot-api / src /lib /rate-limit.ts
imseldrith's picture
Initial upload from Colab
9e27976 verified
import consola from "consola"
import type { State } from "./state"
import { HTTPError } from "./error"
import { sleep } from "./utils"
export async function checkRateLimit(state: State) {
if (state.rateLimitSeconds === undefined) return
const now = Date.now()
if (!state.lastRequestTimestamp) {
state.lastRequestTimestamp = now
return
}
const elapsedSeconds = (now - state.lastRequestTimestamp) / 1000
if (elapsedSeconds > state.rateLimitSeconds) {
state.lastRequestTimestamp = now
return
}
const waitTimeSeconds = Math.ceil(state.rateLimitSeconds - elapsedSeconds)
if (!state.rateLimitWait) {
consola.warn(
`Rate limit exceeded. Need to wait ${waitTimeSeconds} more seconds.`,
)
throw new HTTPError(
"Rate limit exceeded",
Response.json({ message: "Rate limit exceeded" }, { status: 429 }),
)
}
const waitTimeMs = waitTimeSeconds * 1000
consola.warn(
`Rate limit reached. Waiting ${waitTimeSeconds} seconds before proceeding...`,
)
await sleep(waitTimeMs)
// eslint-disable-next-line require-atomic-updates
state.lastRequestTimestamp = now
consola.info("Rate limit wait completed, proceeding with request")
return
}