diff --git a/server/src/config/services.ts b/server/src/config/services.ts index 2a85c47c1..db6016b04 100644 --- a/server/src/config/services.ts +++ b/server/src/config/services.ts @@ -181,13 +181,13 @@ export const initializeServices = async ({ notificationMessageBuilder ); - const superSimpleQueueHelper = new SuperSimpleQueueHelper({ + const superSimpleQueueHelper = new SuperSimpleQueueHelper( logger, networkService, statusService, notificationsService, checkService, - buffer: bufferService, + bufferService, incidentService, maintenanceWindowsRepository, monitorsRepository, @@ -195,14 +195,10 @@ export const initializeServices = async ({ monitorStatsRepository, checksRepository, incidentsRepository, - geoChecksService, - }); + geoChecksService + ); - const superSimpleQueue = await SuperSimpleQueue.create({ - logger, - helper: superSimpleQueueHelper, - monitorsRepository, - }); + const superSimpleQueue = await SuperSimpleQueue.create(logger, superSimpleQueueHelper, monitorsRepository); // Business services const userService = new UserService({ diff --git a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueue.ts b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueue.ts index 4ad0bea4d..f8cb8cef0 100644 --- a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueue.ts +++ b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueue.ts @@ -1,5 +1,7 @@ import { IMonitorsRepository } from "@/repositories/index.js"; +import { ILogger } from "@/utils/logger.js"; import Scheduler from "super-simple-scheduler"; +import { ISuperSimpleQueueHelper } from "@/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.js"; const SERVICE_NAME = "JobQueue"; type QueueJobFailure = { @@ -54,22 +56,12 @@ export interface ISuperSimpleQueue { class SuperSimpleQueue implements ISuperSimpleQueue { static SERVICE_NAME = SERVICE_NAME; - private logger: any; - private helper: any; + private logger: ILogger; + private helper: ISuperSimpleQueueHelper; private monitorsRepository: IMonitorsRepository; private readonly scheduler: Scheduler; - constructor({ - logger, - helper, - monitorsRepository, - scheduler, - }: { - logger: any; - helper: any; - monitorsRepository: IMonitorsRepository; - scheduler: Scheduler; - }) { + constructor(logger: ILogger, helper: ISuperSimpleQueueHelper, monitorsRepository: IMonitorsRepository, scheduler: Scheduler) { this.logger = logger; this.helper = helper; this.monitorsRepository = monitorsRepository; @@ -80,14 +72,14 @@ class SuperSimpleQueue implements ISuperSimpleQueue { return SuperSimpleQueue.SERVICE_NAME; } - static async create({ logger, helper, monitorsRepository }: { logger: any; helper: any; monitorsRepository: IMonitorsRepository }) { + static async create(logger: ILogger, helper: ISuperSimpleQueueHelper, monitorsRepository: IMonitorsRepository) { const scheduler = new Scheduler({ // storeType: "mongo", // storeType: "redis", logLevel: "debug", // dbUri: envSettings.dbConnectionString, }); - const instance = new SuperSimpleQueue({ logger, helper, monitorsRepository, scheduler }); + const instance = new SuperSimpleQueue(logger, helper, monitorsRepository, scheduler); await instance.init(); return instance; } @@ -113,7 +105,7 @@ class SuperSimpleQueue implements ISuperSimpleQueue { this.scheduler.addJob({ id: "cleanup-orphaned", template: "cleanup-orphaned", active: true }); return true; - } catch (error) { + } catch (error: any) { this.logger.error({ message: "Failed to initialize SuperSimpleQueue", service: SERVICE_NAME, diff --git a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts index c2304de57..1c57bd59f 100644 --- a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts +++ b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts @@ -13,6 +13,16 @@ import { IChecksRepository, IIncidentsRepository, } from "@/repositories/index.js"; +import { ILogger } from "@/utils/logger.js"; +import { IBufferService } from "../bufferService.js"; + +export interface ISuperSimpleQueueHelper { + readonly serviceName: string; + getMonitorJob(): (monitor: Monitor) => Promise; + getCleanupOrphanedJob(): () => Promise; + getGeoCheckJob(): (monitor: Monitor) => Promise; + isInMaintenanceWindow(monitorId: string, teamId: string): Promise; +} export interface MonitorActionDecision { shouldCreateIncident: boolean; @@ -28,7 +38,7 @@ export interface MonitorActionDecision { }; } -class SuperSimpleQueueHelper { +class SuperSimpleQueueHelper implements ISuperSimpleQueueHelper { static SERVICE_NAME = SERVICE_NAME; private logger: any; @@ -36,7 +46,7 @@ class SuperSimpleQueueHelper { private statusService: IStatusService; private notificationsService: INotificationsService; private checkService: any; - private buffer: any; + private buffer: IBufferService; private incidentService: IncidentService; private maintenanceWindowsRepository: IMaintenanceWindowsRepository; private monitorsRepository: IMonitorsRepository; @@ -46,37 +56,22 @@ class SuperSimpleQueueHelper { private incidentsRepository: IIncidentsRepository; private geoChecksService: IGeoChecksService; - constructor({ - logger, - networkService, - statusService, - notificationsService, - checkService, - buffer, - incidentService, - maintenanceWindowsRepository, - monitorsRepository, - teamsRepository, - monitorStatsRepository, - checksRepository, - incidentsRepository, - geoChecksService, - }: { - logger: any; - networkService: INetworkService; - statusService: IStatusService; - notificationsService: INotificationsService; - checkService: any; - buffer: any; - incidentService: IncidentService; - maintenanceWindowsRepository: IMaintenanceWindowsRepository; - monitorsRepository: IMonitorsRepository; - teamsRepository: ITeamsRepository; - monitorStatsRepository: IMonitorStatsRepository; - checksRepository: IChecksRepository; - incidentsRepository: IIncidentsRepository; - geoChecksService: IGeoChecksService; - }) { + constructor( + logger: ILogger, + networkService: INetworkService, + statusService: IStatusService, + notificationsService: INotificationsService, + checkService: any, + buffer: IBufferService, + incidentService: IncidentService, + maintenanceWindowsRepository: IMaintenanceWindowsRepository, + monitorsRepository: IMonitorsRepository, + teamsRepository: ITeamsRepository, + monitorStatsRepository: IMonitorStatsRepository, + checksRepository: IChecksRepository, + incidentsRepository: IIncidentsRepository, + geoChecksService: IGeoChecksService + ) { this.logger = logger; this.networkService = networkService; this.statusService = statusService; diff --git a/server/src/service/infrastructure/networkService.ts b/server/src/service/infrastructure/networkService.ts index 914929bfb..958bbdfd8 100644 --- a/server/src/service/infrastructure/networkService.ts +++ b/server/src/service/infrastructure/networkService.ts @@ -1,6 +1,8 @@ import { HTTPError, RequestError } from "got"; import type { Got, Response } from "got"; import type { Monitor, MonitorStatusResponse } from "@/types/index.js"; +import type { AxiosStatic } from "axios"; +import type Docker from "dockerode"; import CacheableLookup from "cacheable-lookup"; import { ISettingsService } from "../system/settingsService.js"; @@ -48,16 +50,16 @@ class NetworkService implements INetworkService { private NETWORK_ERROR: number; private PING_ERROR: number; - private axios: any; + private axios: AxiosStatic; private got: Got; private https: any; private jmespath: any; private GameDig: any; private ping: any; - private logger: any; + private logger: ILogger; private Docker: any; private net: any; - private settingsService: any; + private settingsService: ISettingsService; private buildStatusResponse = ({ monitor, @@ -114,7 +116,7 @@ class NetworkService implements INetworkService { }; constructor( - axios: any, + axios: AxiosStatic, got: Got, https: any, jmespath: any, @@ -423,7 +425,6 @@ class NetworkService implements INetworkService { const docker = new this.Docker({ socketPath: "/var/run/docker.sock", - handleError: true, // Enable error handling }); const dockerResponse = this.buildStatusResponse({ @@ -519,6 +520,10 @@ class NetworkService implements INetworkService { private async requestPort(monitor: Monitor): Promise { try { const { url, port } = monitor; + if (!port) { + throw new Error("Port is required for port monitor"); + } + const { response, responseTime, error } = await this.timeRequest(async () => { return new Promise((resolve, reject) => { const socket = this.net.createConnection( @@ -585,9 +590,9 @@ class NetworkService implements INetworkService { }); const state = await this.GameDig.query({ - type: gameId, + type: gameId ?? "unknown", host: url, - port: port, + port: port ?? 0, }).catch((error: any) => { this.logger.warn({ message: error.message,