@juspay/neurolink
Version:
The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002
44 lines (43 loc) • 1.52 kB
JavaScript
function getHeader(headers, headerName) {
if ("get" in headers && typeof headers.get === "function") {
return headers.get(headerName);
}
const normalizedHeaderName = headerName.toLowerCase();
for (const [name, value] of Object.entries(headers)) {
if (name.toLowerCase() === normalizedHeaderName) {
return value;
}
}
return null;
}
/**
* Parse standard and commonly used rate-limit response headers.
*
* @returns The requested delay in milliseconds, or undefined when the
* response does not provide a usable rate-limit delay.
*/
export function parseRetryAfterMs(headers) {
const retryAfter = getHeader(headers, "Retry-After");
if (retryAfter) {
const seconds = parseInt(retryAfter, 10);
if (!Number.isNaN(seconds)) {
return Math.max(0, seconds * 1000);
}
const retryDate = new Date(retryAfter);
if (!Number.isNaN(retryDate.getTime())) {
return Math.max(0, retryDate.getTime() - Date.now());
}
}
const rateLimitReset = getHeader(headers, "X-RateLimit-Reset");
if (rateLimitReset) {
const resetTimestamp = parseInt(rateLimitReset, 10);
if (!Number.isNaN(resetTimestamp)) {
const resetTime = resetTimestamp > 1e12 ? resetTimestamp : resetTimestamp * 1000;
return Math.max(0, resetTime - Date.now());
}
}
if (getHeader(headers, "X-RateLimit-Remaining") === "0") {
return 1000;
}
return undefined;
}