mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-18 02:20:47 -04:00
44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
JavaScript
// 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,
|
|
};
|