Files
Checkmate/server/src/worker/worker.interface.ts
T

88 lines
2.7 KiB
TypeScript
Raw Normal View History

2026-06-09 12:34:15 -07:00
import { Monitor } from "@/domain/monitors/monitor.types.js";
2026-06-10 13:12:51 -07:00
import { Check } from "@/domain/checks/check.type.js";
2026-06-19 10:25:59 -07:00
import { JobType } from "@/domain/jobs/job.type.js";
2026-06-10 13:12:51 -07:00
import { MonitorPayloadMap, MonitorStatusResponse, StatusChangeResult } from "@/types/network.js";
import { MonitorActionDecision } from "@/worker/worker.helper.js";
import { QueueWorker } from "@/domain/queue-workers/queue-worker.type.js";
import type { QueueMode } from "@/domain/app-settings/app-settings.type.js";
2026-06-10 13:12:51 -07:00
export type MonitorEvaluation = {
monitor: Monitor;
status: MonitorStatusResponse<MonitorPayloadMap[keyof MonitorPayloadMap]>; // raw result from networkService.requestStatus
check: Check;
statusChange: StatusChangeResult; // from statusService.updateMonitorStatus
decision: MonitorActionDecision; // from MonitorStatusPolicy
};
2026-06-10 09:30:14 -07:00
export type WorkerJobFailure = {
monitorId: string | number;
monitorUrl: string | null;
monitorType: string | null;
failedAt: number | null;
failCount: number;
failReason: string | null;
};
2026-06-10 09:30:14 -07:00
export type WorkerMetrics = {
jobs: number;
activeJobs: number;
failingJobs: number;
2026-06-10 09:30:14 -07:00
jobsWithFailures: WorkerJobFailure[];
totalRuns: number;
totalFailures: number;
2026-06-02 09:47:00 -07:00
workers: QueueWorker[];
};
2026-06-10 09:30:14 -07:00
export type WorkerJobSummary = {
monitorId: string | number;
monitorType: string | null;
monitorInterval: number | null;
monitorActive: boolean | null;
2026-06-02 09:47:00 -07:00
lockedBy: string | null;
lockedUntil: number | null;
2026-06-22 09:53:50 -07:00
nextScheduledAt: number;
runCount: number;
failCount: number;
failReason: string | null;
lastFinishedAt: number | null;
};
2026-06-10 09:30:14 -07:00
export type WorkerJobsPagination = {
page?: number;
rowsPerPage?: number;
};
2026-06-10 09:30:14 -07:00
export type WorkerJobsPage = {
jobs: WorkerJobSummary[];
count: number;
};
export type WorkerHealth = {
workerId: string;
mode: QueueMode;
dbConnected: boolean; // mongoose connection readyState === 1
initComplete: boolean; // init() finished, loops armed
draining: boolean; // SIGTERM received, no longer claiming
lastTickAt: number | null; // newest tick across all loops (epoch ms)
inFlight: number; // total in-flight jobs across types
};
2026-06-23 11:22:37 -07:00
export interface IJobScheduler {
readonly serviceName: string;
addJob(monitorId: string, monitor: Monitor): Promise<void>;
deleteJob(monitor: Monitor): Promise<void>;
pauseJob(monitor: Monitor): Promise<void>;
resumeJob(monitor: Monitor): Promise<void>;
updateJob(monitor: Monitor): Promise<void>;
2026-06-19 10:25:59 -07:00
wake(type: JobType): void;
2026-06-10 09:30:14 -07:00
getMetrics(): Promise<WorkerMetrics>;
getJobs(pagination: WorkerJobsPagination): Promise<WorkerJobsPage>;
flushQueues(): Promise<{ success: boolean }>;
drain(): Promise<void>;
2026-06-23 11:22:37 -07:00
shutdown(): Promise<void>;
}
export interface IQueueWorker extends IJobScheduler {
readonly serviceName: string;
init(): Promise<boolean>;
getHealth(): WorkerHealth;
}