This commit is contained in:
legop3
2026-04-29 13:21:44 -04:00
parent e2bd29e2c2
commit bc6770f407
17 changed files with 913 additions and 1162 deletions
@@ -0,0 +1,43 @@
// Replay Cooldown State
// Purpose: Tracks replay trigger cooldown state and emits updates for consumers.
// Scope: Encapsulates replay cooldown timing and trigger bookkeeping.
const EventEmitter = require('events');
const COOLDOWN_MS = 10 * 1000;
const replayEvents = new EventEmitter();
let lastTriggeredAt = null;
let lastTriggeredBy = null;
function getRemainingMs(now = Date.now()) {
if (!lastTriggeredAt) return 0;
return Math.max(0, COOLDOWN_MS - (now - lastTriggeredAt));
}
function getReplayState() {
const remainingMs = getRemainingMs();
return {
cooldownMs: COOLDOWN_MS,
lastTriggeredAt,
lastTriggeredBy,
remainingMs,
available: remainingMs === 0,
};
}
function tryTriggerReplay(by = null) {
const remainingMs = getRemainingMs();
if (remainingMs > 0) {
return { ok: false, remainingMs, state: getReplayState() };
}
lastTriggeredAt = Date.now();
lastTriggeredBy = by || null;
const state = getReplayState();
replayEvents.emit('update', { state, by: lastTriggeredBy });
return { ok: true, state };
}
module.exports = {
tryTriggerReplay,
getReplayState,
replayEvents,
};