mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-15 17:12:59 -04:00
46 lines
1.2 KiB
JavaScript
46 lines
1.2 KiB
JavaScript
// replay Service
|
|
// Purpose: Defines the replay Service module and the helpers/state used by this service unit.
|
|
// Scope: Keeps runtime behavior unchanged while isolating responsibilities into a clear module boundary.
|
|
const EventEmitter = require('events');
|
|
|
|
const COOLDOWN_MS = 10 * 1000;
|
|
|
|
const events = new EventEmitter();
|
|
let lastTriggeredAt = null;
|
|
let lastTriggeredBy = null;
|
|
|
|
function getRemainingMs(now = Date.now()) {
|
|
if (!lastTriggeredAt) return 0;
|
|
const elapsed = now - lastTriggeredAt;
|
|
return Math.max(0, COOLDOWN_MS - elapsed);
|
|
}
|
|
|
|
function getState() {
|
|
const remainingMs = getRemainingMs();
|
|
return {
|
|
cooldownMs: COOLDOWN_MS,
|
|
lastTriggeredAt,
|
|
lastTriggeredBy,
|
|
remainingMs,
|
|
available: remainingMs === 0,
|
|
};
|
|
}
|
|
|
|
function tryTrigger(by = null) {
|
|
const remainingMs = getRemainingMs();
|
|
if (remainingMs > 0) {
|
|
return { ok: false, remainingMs, state: getState() };
|
|
}
|
|
lastTriggeredAt = Date.now();
|
|
lastTriggeredBy = by || null;
|
|
const state = getState();
|
|
events.emit('update', { state, by: lastTriggeredBy });
|
|
return { ok: true, state };
|
|
}
|
|
|
|
module.exports = {
|
|
tryTriggerReplay: tryTrigger,
|
|
getReplayState: getState,
|
|
replayEvents: events,
|
|
};
|