Files
uptime-kuma/server/client.js
T

248 lines
6.8 KiB
JavaScript
Raw Normal View History

/*
* For Client Socket
*/
const { TimeLogger } = require("../src/util");
const { R } = require("redbean-node");
const { UptimeKumaServer } = require("./uptime-kuma-server");
2022-10-10 02:28:03 +08:00
const server = UptimeKumaServer.getInstance();
const io = server.io;
const { setting } = require("./util-server");
const checkVersion = require("./check-version");
2024-03-26 15:17:52 +08:00
const Database = require("./database");
2022-04-20 19:56:40 +01:00
/**
* Send list of notification providers to client
* @param {Socket} socket Socket.io socket instance
2023-08-11 09:46:41 +02:00
* @returns {Promise<Bean[]>} List of notifications
2022-04-20 19:56:40 +01:00
*/
async function sendNotificationList(socket) {
const timeLogger = new TimeLogger();
let result = [];
2026-07-15 22:16:37 +08:00
let list = await R.find("notification");
for (let bean of list) {
let notificationObject = bean.export();
notificationObject.isDefault = notificationObject.isDefault === 1;
notificationObject.active = notificationObject.active === 1;
result.push(notificationObject);
}
io.to(socket.userID).emit("notificationList", result);
timeLogger.print("Send Notification List");
return list;
}
/**
* Send Heartbeat History list to socket
2022-04-20 19:56:40 +01:00
* @param {Socket} socket Socket.io instance
* @param {number} monitorID ID of monitor to send heartbeat history
2023-08-11 09:46:41 +02:00
* @param {boolean} toUser True = send to all browsers with the same user id, False = send to the current browser only
* @param {boolean} overwrite Overwrite client-side's heartbeat list
2022-04-20 19:56:40 +01:00
* @returns {Promise<void>}
*/
async function sendHeartbeatList(socket, monitorID, toUser = false, overwrite = false) {
let list = await R.getAll(
`
2021-09-09 11:57:23 +08:00
SELECT * FROM heartbeat
WHERE monitor_id = ?
ORDER BY time DESC
LIMIT 100
`,
[monitorID]
);
2021-09-09 11:57:23 +08:00
let result = list.reverse();
if (toUser) {
io.to(socket.userID).emit("heartbeatList", monitorID, result, overwrite);
} else {
socket.emit("heartbeatList", monitorID, result, overwrite);
}
}
/**
* Important Heart beat list (aka event list)
2022-04-20 19:56:40 +01:00
* @param {Socket} socket Socket.io instance
* @param {number} monitorID ID of monitor to send heartbeat history
2023-08-11 09:46:41 +02:00
* @param {boolean} toUser True = send to all browsers with the same user id, False = send to the current browser only
* @param {boolean} overwrite Overwrite client-side's heartbeat list
2022-04-20 19:56:40 +01:00
* @returns {Promise<void>}
*/
async function sendImportantHeartbeatList(socket, monitorID, toUser = false, overwrite = false) {
const timeLogger = new TimeLogger();
let list = await R.find(
"heartbeat",
`
monitor_id = ?
AND important = 1
ORDER BY time DESC
LIMIT 500
`,
[monitorID]
);
timeLogger.print(`[Monitor: ${monitorID}] sendImportantHeartbeatList`);
const result = list.map((bean) => bean.toJSON());
if (toUser) {
io.to(socket.userID).emit("importantHeartbeatList", monitorID, result, overwrite);
} else {
socket.emit("importantHeartbeatList", monitorID, result, overwrite);
}
}
2022-04-20 19:56:40 +01:00
/**
* Emit proxy list to client
* @param {Socket} socket Socket.io socket instance
2023-08-11 09:46:41 +02:00
* @returns {Promise<Bean[]>} List of proxies
2021-10-30 20:37:15 +03:00
*/
async function sendProxyList(socket) {
const timeLogger = new TimeLogger();
2026-07-15 22:16:37 +08:00
const list = await R.find("proxy");
io.to(socket.userID).emit(
"proxyList",
list.map((bean) => bean.export())
);
2021-10-30 20:37:15 +03:00
timeLogger.print("Send Proxy List");
return list;
}
2023-02-14 19:49:04 +00:00
/**
* Emit API key list to client
* @param {Socket} socket Socket.io socket instance
* @returns {Promise<void>}
*/
async function sendAPIKeyList(socket) {
const timeLogger = new TimeLogger();
let result = [];
2026-07-15 22:16:37 +08:00
const list = await R.find("api_key");
2023-02-14 19:49:04 +00:00
for (let bean of list) {
result.push(bean.toPublicJSON());
}
io.to(socket.userID).emit("apiKeyList", result);
timeLogger.print("Sent API Key List");
return list;
}
2021-11-09 21:24:31 -08:00
/**
* Emits the version information to the client.
2022-04-20 19:56:40 +01:00
* @param {Socket} socket Socket.io socket instance
2023-08-11 09:46:41 +02:00
* @param {boolean} hideVersion Should we hide the version information in the response?
2022-04-20 19:56:40 +01:00
* @returns {Promise<void>}
*/
2023-07-14 18:02:49 +08:00
async function sendInfo(socket, hideVersion = false) {
const info = {
primaryBaseURL: await setting("primaryBaseURL"),
2022-10-10 02:28:03 +08:00
serverTimezone: await server.getTimezone(),
2022-10-11 18:23:17 +08:00
serverTimezoneOffset: server.getTimezoneOffset(),
};
if (!hideVersion) {
info.version = checkVersion.version;
info.latestVersion = checkVersion.latestVersion;
info.isContainer = process.env.UPTIME_KUMA_IS_CONTAINER === "1";
info.dbType = Database.dbConfig.type;
info.runtime = {
platform: process.platform, // linux or win32
arch: process.arch, // x86 or arm
};
}
socket.emit("info", info);
}
2022-07-22 15:57:40 +00:00
/**
* Send list of docker hosts to client
* @param {Socket} socket Socket.io socket instance
2023-08-11 09:46:41 +02:00
* @returns {Promise<Bean[]>} List of docker hosts
2022-07-22 15:57:40 +00:00
*/
async function sendDockerHostList(socket) {
const timeLogger = new TimeLogger();
let result = [];
2026-07-15 22:16:37 +08:00
let list = await R.find("docker_host");
for (let bean of list) {
2022-07-30 19:48:12 +08:00
result.push(bean.toJSON());
}
io.to(socket.userID).emit("dockerHostList", result);
timeLogger.print("Send Docker Host List");
return list;
}
2023-12-01 07:29:10 +00:00
/**
* Send list of docker hosts to client
* @param {Socket} socket Socket.io socket instance
* @returns {Promise<Bean[]>} List of docker hosts
*/
async function sendRemoteBrowserList(socket) {
const timeLogger = new TimeLogger();
let result = [];
2026-07-15 22:16:37 +08:00
let list = await R.find("remote_browser");
2023-12-01 07:29:10 +00:00
for (let bean of list) {
result.push(bean.toJSON());
}
io.to(socket.userID).emit("remoteBrowserList", result);
timeLogger.print("Send Remote Browser List");
return list;
}
2024-08-30 15:48:13 -04:00
/**
* Send list of monitor types to client
* @param {Socket} socket Socket.io socket instance
* @returns {Promise<void>}
*/
async function sendMonitorTypeList(socket) {
const result = Object.entries(UptimeKumaServer.monitorTypeList).map(([key, type]) => {
return [
key,
{
supportsConditions: type.supportsConditions,
conditionVariables: type.conditionVariables.map((v) => {
return {
id: v.id,
operators: v.operators.map((o) => {
return {
id: o.id,
caption: o.caption,
};
}),
};
}),
},
];
2024-08-30 15:48:13 -04:00
});
io.to(socket.userID).emit("monitorTypeList", Object.fromEntries(result));
}
module.exports = {
sendNotificationList,
sendImportantHeartbeatList,
sendHeartbeatList,
2021-10-30 20:37:15 +03:00
sendProxyList,
2023-02-14 19:49:04 +00:00
sendAPIKeyList,
2021-10-30 20:37:15 +03:00
sendInfo,
2023-12-01 07:29:10 +00:00
sendDockerHostList,
sendRemoteBrowserList,
2024-08-30 15:48:13 -04:00
sendMonitorTypeList,
};