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
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,
|
|
};
|
|
}
|
|
|