export function mockSessionize()

in packages/sqrl-redis-functions/src/lua/sessionizeLua.ts [68:118]


export function mockSessionize(
  redis: MockRedisDatabase,
  key: string,
  maxAmount: number,
  take: number,
  at: number,
  refillTime: number,
  refillAmount: number
) {
  const current = redis.db[key];
  let tokens;
  let lastRefill;
  let sessionStart;

  if (!current) {
    tokens = maxAmount;
    lastRefill = at;
  } else {
    [sessionStart, tokens, lastRefill] = JSON.parse(current);
  }

  if (take === 0) {
    throw new Error("Take must be non-zero for sessionize()");
  }

  if (tokens < take) {
    const refills = Math.floor((at - lastRefill) / refillTime);
    lastRefill = lastRefill + refills * refillTime;
    tokens = Math.min(maxAmount, tokens + refills * refillAmount);
  }

  if (tokens >= take) {
    sessionStart = at;
  }

  let returnedSession = null;
  if (tokens === 0) {
    lastRefill = at;
    returnedSession = sessionStart;
  } else {
    tokens = Math.max(0, tokens - take);
  }

  // @todo: expiry
  // let expiry = math.ceil((maxAmount - tokens) / refillAmount) * refillTime;

  const value = JSON.stringify([sessionStart, tokens, lastRefill]);
  redis.db[key] = value;

  return returnedSession;
}