BillTracker/services/statusRuntime.js

90 lines
2.1 KiB
JavaScript
Raw Permalink Normal View History

2026-05-03 19:51:57 -05:00
const MAX_RECENT_ERRORS = 10;
const state = {
worker: {
enabled: false,
running: false,
started_at: null,
last_run_at: null,
next_run_at: null,
last_error: null,
},
notifications: {
last_test_at: null,
last_error: null,
},
recentErrors: [],
};
function toMessage(error) {
if (!error) return null;
if (typeof error === 'string') return error;
return error.message || String(error);
}
function recordError(source, error) {
const message = toMessage(error);
if (!message) return;
state.recentErrors.unshift({
timestamp: new Date().toISOString(),
source,
message,
});
state.recentErrors = state.recentErrors.slice(0, MAX_RECENT_ERRORS);
}
function markWorkerStarted(nextRunAt = null) {
state.worker.enabled = true;
state.worker.running = true;
state.worker.started_at = state.worker.started_at || new Date().toISOString();
state.worker.next_run_at = nextRunAt;
}
function markWorkerSuccess(nextRunAt = null) {
state.worker.last_run_at = new Date().toISOString();
state.worker.last_error = null;
if (nextRunAt !== undefined) state.worker.next_run_at = nextRunAt;
}
function markWorkerError(error, nextRunAt = null) {
state.worker.last_run_at = new Date().toISOString();
state.worker.last_error = toMessage(error);
if (nextRunAt !== undefined) state.worker.next_run_at = nextRunAt;
recordError('Daily Worker', error);
}
function markNotificationTestSuccess() {
state.notifications.last_test_at = new Date().toISOString();
state.notifications.last_error = null;
}
function markNotificationError(error) {
state.notifications.last_error = toMessage(error);
recordError('Notifications', error);
}
function markNotificationSuccess() {
state.notifications.last_error = null;
}
function getStatusRuntime() {
return {
worker: { ...state.worker },
notifications: { ...state.notifications },
recentErrors: [...state.recentErrors],
};
}
module.exports = {
getStatusRuntime,
markNotificationError,
markNotificationSuccess,
markNotificationTestSuccess,
markWorkerError,
markWorkerStarted,
markWorkerSuccess,
recordError,
};