Skip to content
This repository was archived by the owner on Aug 2, 2025. It is now read-only.

Commit 10c0422

Browse files
committed
feat(handlers): Needs testing / fixing
1 parent 4e643d7 commit 10c0422

File tree

9 files changed

+865
-855
lines changed

9 files changed

+865
-855
lines changed

src/core/docker/client.ts

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
import Docker from "dockerode";
22
import { logger } from "~/core/utils/logger";
3-
import type { DockerHost } from "~/typings/docker";
3+
import type { DockerHost } from "../../../typings/docker";
44

55
export const getDockerClient = (host: DockerHost): Docker => {
6-
try {
7-
const inputUrl = host.hostAddress.includes("://")
8-
? host.hostAddress
9-
: `${host.secure ? "https" : "http"}://${host.hostAddress}`;
10-
const parsedUrl = new URL(inputUrl);
11-
const hostAddress = parsedUrl.hostname;
12-
const port = parsedUrl.port
13-
? Number.parseInt(parsedUrl.port)
14-
: host.secure
15-
? 2376
16-
: 2375;
6+
try {
7+
logger.info(`Setting up host: ${JSON.stringify(host)}`);
178

18-
if (Number.isNaN(port) || port < 1 || port > 65535) {
19-
throw new Error("Invalid port number in Docker host URL");
20-
}
9+
const inputUrl = host.hostAddress.includes("://")
10+
? host.hostAddress
11+
: `${host.secure ? "https" : "http"}://${host.hostAddress}`;
12+
const parsedUrl = new URL(inputUrl);
13+
const hostAddress = parsedUrl.hostname;
14+
const port = parsedUrl.port
15+
? Number.parseInt(parsedUrl.port)
16+
: host.secure
17+
? 2376
18+
: 2375;
2119

22-
return new Docker({
23-
protocol: host.secure ? "https" : "http",
24-
host: hostAddress,
25-
port,
26-
version: "v1.41",
27-
// TODO: Add TLS configuration if needed
28-
});
29-
} catch (error) {
30-
logger.error("Invalid Docker host URL configuration:", error);
31-
throw new Error("Invalid Docker host configuration");
32-
}
20+
if (Number.isNaN(port) || port < 1 || port > 65535) {
21+
throw new Error("Invalid port number in Docker host URL");
22+
}
23+
24+
return new Docker({
25+
protocol: host.secure ? "https" : "http",
26+
host: hostAddress,
27+
port,
28+
version: "v1.41",
29+
// TODO: Add TLS configuration if needed
30+
});
31+
} catch (error) {
32+
logger.error("Invalid Docker host URL configuration:", error);
33+
throw new Error("Invalid Docker host configuration");
34+
}
3335
};

src/core/docker/scheduler.ts

Lines changed: 104 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -2,122 +2,123 @@ import { dbFunctions } from "~/core/database";
22
import storeContainerData from "~/core/docker/store-container-stats";
33
import storeHostData from "~/core/docker/store-host-stats";
44
import { logger } from "~/core/utils/logger";
5-
import type { config } from "~/typings/database";
5+
import type { config } from "../../../typings/database";
66

77
function convertFromMinToMs(minutes: number): number {
8-
return minutes * 60 * 1000;
8+
return minutes * 60 * 1000;
99
}
1010

1111
async function initialRun(
12-
scheduleName: string,
13-
scheduleFunction: Promise<void> | void,
14-
isAsync: boolean,
12+
scheduleName: string,
13+
scheduleFunction: Promise<void> | void,
14+
isAsync: boolean
1515
) {
16-
try {
17-
if (isAsync) {
18-
await scheduleFunction;
19-
} else {
20-
scheduleFunction;
21-
}
22-
logger.info(`Startup run success for: ${scheduleName}`);
23-
} catch (error) {
24-
logger.error(`Startup run failed for ${scheduleName}, ${error as string}`);
25-
}
16+
try {
17+
if (isAsync) {
18+
await scheduleFunction;
19+
} else {
20+
scheduleFunction;
21+
}
22+
logger.info(`Startup run success for: ${scheduleName}`);
23+
} catch (error) {
24+
logger.error(`Startup run failed for ${scheduleName}, ${error as string}`);
25+
}
2626
}
2727

2828
async function scheduledJob(
29-
name: string,
30-
jobFn: () => Promise<void>,
31-
intervalMs: number,
29+
name: string,
30+
jobFn: () => Promise<void>,
31+
intervalMs: number
3232
) {
33-
while (true) {
34-
const start = Date.now();
35-
logger.info(`Task Start: ${name}`);
36-
try {
37-
await jobFn();
38-
logger.info(`Task End: ${name} succeeded.`);
39-
} catch (e) {
40-
logger.error(`Task End: ${name} failed:`, e);
41-
}
42-
const elapsed = Date.now() - start;
43-
const delay = Math.max(0, intervalMs - elapsed);
44-
await new Promise((r) => setTimeout(r, delay));
45-
}
33+
while (true) {
34+
const start = Date.now();
35+
logger.info(`Task Start: ${name}`);
36+
try {
37+
await jobFn();
38+
logger.info(`Task End: ${name} succeeded.`);
39+
} catch (e) {
40+
logger.error(`Task End: ${name} failed:`, e);
41+
}
42+
const elapsed = Date.now() - start;
43+
const delay = Math.max(0, intervalMs - elapsed);
44+
await new Promise((r) => setTimeout(r, delay));
45+
}
4646
}
4747

4848
async function setSchedules() {
49-
try {
50-
const rawConfigData: unknown[] = dbFunctions.getConfig();
51-
const configData = rawConfigData[0];
52-
53-
if (
54-
!configData ||
55-
typeof (configData as config).keep_data_for !== "number" ||
56-
typeof (configData as config).fetching_interval !== "number"
57-
) {
58-
logger.error("Invalid configuration data:", configData);
59-
throw new Error("Invalid configuration data");
60-
}
61-
62-
const { keep_data_for, fetching_interval } = configData as config;
63-
64-
if (keep_data_for === undefined) {
65-
const errMsg = "keep_data_for is undefined";
66-
logger.error(errMsg);
67-
throw new Error(errMsg);
68-
}
69-
70-
if (fetching_interval === undefined) {
71-
const errMsg = "fetching_interval is undefined";
72-
logger.error(errMsg);
73-
throw new Error(errMsg);
74-
}
75-
76-
logger.info(
77-
`Scheduling: Fetching container statistics every ${fetching_interval} minutes`,
78-
);
79-
80-
logger.info(
81-
`Scheduling: Updating host statistics every ${fetching_interval} minutes`,
82-
);
83-
84-
logger.info(
85-
`Scheduling: Cleaning up Database every hour and deleting data older then ${keep_data_for} days`,
86-
);
87-
88-
// Schedule container data fetching
89-
await initialRun("storeContainerData", storeContainerData(), true);
90-
scheduledJob(
91-
"storeContainerData",
92-
storeContainerData,
93-
convertFromMinToMs(fetching_interval),
94-
);
95-
96-
// Schedule Host statistics updates
97-
await initialRun("storeHostData", storeHostData(), true);
98-
scheduledJob(
99-
"storeHostData",
100-
storeHostData,
101-
convertFromMinToMs(fetching_interval),
102-
);
103-
104-
// Schedule database cleanup
105-
await initialRun(
106-
"dbFunctions.deleteOldData",
107-
dbFunctions.deleteOldData(keep_data_for),
108-
false,
109-
);
110-
scheduledJob(
111-
"cleanupOldData",
112-
() => Promise.resolve(dbFunctions.deleteOldData(keep_data_for)),
113-
convertFromMinToMs(60),
114-
);
115-
116-
logger.info("Schedules have been set successfully.");
117-
} catch (error) {
118-
logger.error("Error setting schedules:", error);
119-
throw error;
120-
}
49+
logger.info("Starting DockStatAPI");
50+
try {
51+
const rawConfigData: unknown[] = dbFunctions.getConfig();
52+
const configData = rawConfigData[0];
53+
54+
if (
55+
!configData ||
56+
typeof (configData as config).keep_data_for !== "number" ||
57+
typeof (configData as config).fetching_interval !== "number"
58+
) {
59+
logger.error("Invalid configuration data:", configData);
60+
throw new Error("Invalid configuration data");
61+
}
62+
63+
const { keep_data_for, fetching_interval } = configData as config;
64+
65+
if (keep_data_for === undefined) {
66+
const errMsg = "keep_data_for is undefined";
67+
logger.error(errMsg);
68+
throw new Error(errMsg);
69+
}
70+
71+
if (fetching_interval === undefined) {
72+
const errMsg = "fetching_interval is undefined";
73+
logger.error(errMsg);
74+
throw new Error(errMsg);
75+
}
76+
77+
logger.info(
78+
`Scheduling: Fetching container statistics every ${fetching_interval} minutes`
79+
);
80+
81+
logger.info(
82+
`Scheduling: Updating host statistics every ${fetching_interval} minutes`
83+
);
84+
85+
logger.info(
86+
`Scheduling: Cleaning up Database every hour and deleting data older then ${keep_data_for} days`
87+
);
88+
89+
// Schedule container data fetching
90+
await initialRun("storeContainerData", storeContainerData(), true);
91+
scheduledJob(
92+
"storeContainerData",
93+
storeContainerData,
94+
convertFromMinToMs(fetching_interval)
95+
);
96+
97+
// Schedule Host statistics updates
98+
await initialRun("storeHostData", storeHostData(), true);
99+
scheduledJob(
100+
"storeHostData",
101+
storeHostData,
102+
convertFromMinToMs(fetching_interval)
103+
);
104+
105+
// Schedule database cleanup
106+
await initialRun(
107+
"dbFunctions.deleteOldData",
108+
dbFunctions.deleteOldData(keep_data_for),
109+
false
110+
);
111+
scheduledJob(
112+
"cleanupOldData",
113+
() => Promise.resolve(dbFunctions.deleteOldData(keep_data_for)),
114+
convertFromMinToMs(60)
115+
);
116+
117+
logger.info("Schedules have been set successfully.");
118+
} catch (error) {
119+
logger.error("Error setting schedules:", error);
120+
throw error;
121+
}
121122
}
122123

123124
export { setSchedules };

0 commit comments

Comments
 (0)