← back to Dw Daily Catchup 20260909

lib/activation-allowance.js

31 lines

'use strict';

function assertDailyCatchup(date, authorization, now = new Date()) {
  if (!/^\d{4}-\d{2}-\d{2}$/.test(date || '') || date !== now.toISOString().slice(0, 10) ||
      authorization?.schema_version !== 1 || authorization.ticket !== 'TK-11326' ||
      authorization.date !== date || authorization.approved_by !== 'Steve' ||
      authorization.authorization !== 'start loading for the day now' ||
      authorization.starting_daily_used !== 37 || authorization.max_additional !== 462 || authorization.max_daily !== 500)
    throw new Error('Daily catch-up authorization is invalid or expired');
}

function activationAllowance({ dailyUsed, hourlyUsed, requested = null, dailyCap = 500, hourlyCap = 21,
  catchupDate = null, authorization = null, now = new Date() }) {
  if (![dailyUsed, hourlyUsed].every(n => Number.isSafeInteger(n) && n >= 0) ||
      !Number.isSafeInteger(dailyCap) || dailyCap < 1 || dailyCap > 500 ||
      !Number.isSafeInteger(hourlyCap) || hourlyCap < 1 || hourlyCap > 21 ||
      (requested !== null && (!Number.isSafeInteger(requested) || requested < 1)))
    throw new Error('Invalid activation limits; refusing an unbounded run');
  const dailyRemaining = Math.max(0, dailyCap - dailyUsed);
  const hourlyRemaining = Math.max(0, hourlyCap - hourlyUsed);
  if (catchupDate !== null) {
    assertDailyCatchup(catchupDate, authorization, now);
    if (dailyUsed < authorization.starting_daily_used) throw new Error('Daily ledger is below approved catch-up baseline');
    const authorizedRemaining = Math.max(0, authorization.starting_daily_used + authorization.max_additional - dailyUsed);
    return { cap: Math.min(requested ?? dailyRemaining, dailyRemaining, authorizedRemaining), mode: 'daily-catchup', dailyRemaining, hourlyRemaining };
  }
  return { cap: Math.min(requested ?? dailyRemaining, dailyRemaining, hourlyRemaining), mode: 'hourly', dailyRemaining, hourlyRemaining };
}

module.exports = { activationAllowance, assertDailyCatchup };