You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

42 lines
1.1 KiB

import { ref, computed } from "vue";
export interface RateLimitInfo {
sessionRemaining: number | null;
ipRemaining: number | null;
}
export function useAgentRateLimit() {
const sessionRemaining = ref<number | null>(null);
const ipRemaining = ref<number | null>(null);
const isBlocked = computed(
() =>
sessionRemaining.value !== null && sessionRemaining.value === 0,
);
const isIpBlocked = computed(
() => ipRemaining.value !== null && ipRemaining.value === 0,
);
const isLimited = computed(() => isBlocked.value || isIpBlocked.value);
function updateFromHeaders(headers: Headers) {
const sr = headers.get("X-RateLimit-Session-Remaining");
const ir = headers.get("X-RateLimit-Ip-Remaining");
if (sr !== null) sessionRemaining.value = Number(sr);
if (ir !== null) ipRemaining.value = Number(ir);
}
function reset() {
sessionRemaining.value = null;
ipRemaining.value = null;
}
return {
sessionRemaining,
ipRemaining,
isBlocked,
isIpBlocked,
isLimited,
updateFromHeaders,
reset,
};
}