| const axios = require("axios"); |
| const db = require("../storage/db"); |
| const cache = require("../storage/cache"); |
|
|
| const MAX_HISTORY = 100; |
|
|
| function getPingers() { |
| let data = cache.get("pingers"); |
| if (!data) { |
| data = db.read("pingers.json"); |
| cache.set("pingers", data); |
| } |
| return data; |
| } |
|
|
| function savePingers(data) { |
| db.write("pingers.json", data); |
| cache.set("pingers", data); |
| } |
|
|
| function getLogs() { |
| let data = cache.get("logs"); |
| if (!data) { |
| data = db.read("logs.json"); |
| cache.set("logs", data); |
| } |
| return data; |
| } |
|
|
| function saveLogs(data) { |
| db.write("logs.json", data); |
| cache.set("logs", data); |
| } |
|
|
| async function ping(pinger) { |
| const start = Date.now(); |
| let status = "DOWN"; |
| let latency = 0; |
|
|
| try { |
| const res = await axios({ |
| url: pinger.url, |
| method: pinger.method, |
| timeout: pinger.timeout * 1000, |
| headers: pinger.headers, |
| data: pinger.body |
| }); |
|
|
| latency = Date.now() - start; |
| status = res.status < 400 ? "UP" : "DOWN"; |
|
|
| } catch (err) { |
| latency = Date.now() - start; |
| status = "DOWN"; |
| } |
|
|
| updateLogs(pinger, status, latency); |
| } |
|
|
| function updateLogs(pinger, status, latency) { |
| const logs = getLogs(); |
|
|
| if (!logs[pinger.id]) logs[pinger.id] = []; |
|
|
| logs[pinger.id].push({ |
| time: new Date().toISOString(), |
| status, |
| latency |
| }); |
|
|
| if (logs[pinger.id].length > MAX_HISTORY) { |
| logs[pinger.id].shift(); |
| } |
|
|
| saveLogs(logs); |
|
|
| |
| const pingers = getPingers(); |
| const index = pingers.findIndex(p => p.id === pinger.id); |
|
|
| if (index !== -1) { |
| pingers[index].status = status; |
| pingers[index].latency = latency; |
| pingers[index].lastUpdated = new Date().toISOString(); |
| savePingers(pingers); |
| } |
| } |
|
|
| module.exports = { |
| getPingers, |
| savePingers, |
| getLogs, |
| saveLogs, |
| ping |
| }; |