in packages/sqrl-redis-functions/src/lua/rateLimitFetchLua.ts [68:118]
export function mockRateLimitFetch(
redis: MockRedisDatabase,
key: string,
maxAmount: number,
take: number,
at: number,
refillTime: number,
refillAmount: number,
strict: boolean
) {
const current = redis.db[key];
let tokens: number;
let lastRefill: number;
if (!current) {
tokens = maxAmount;
lastRefill = at;
} else {
[tokens, lastRefill] = JSON.parse(current);
}
if (take === 0) {
return tokens;
}
if (tokens < take) {
const refills = Math.floor((at - lastRefill) / refillTime);
lastRefill = lastRefill + refills * refillTime;
tokens = Math.min(maxAmount, tokens + refills * refillAmount);
}
const beforeTake = tokens;
if (tokens === 0) {
if (strict) {
lastRefill = at;
} else {
return 0;
}
} else {
tokens = Math.max(0, tokens - take);
}
// @todo: No expiry in mock
// const expiry = Math.ceil((maxAmount - tokens) / refillAmount) * refillTime
const value = JSON.stringify([tokens, lastRefill]);
redis.db[key] = value;
return beforeTake;
}