export function mockRateLimitFetch()

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