mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 01:21:20 -04:00
43 lines
983 B
JavaScript
43 lines
983 B
JavaScript
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,
|
|
};
|