← back to Dw Rotation Activator
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 };