Implement feature
This commit is contained in:
		
							
								
								
									
										4
									
								
								index.ts
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								index.ts
									
									
									
									
									
								
							@@ -1,3 +1,3 @@
 | 
				
			|||||||
console.log("Hello world");
 | 
					import { PushMonitor } from "./src/pushMonitor";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export {};
 | 
					export default PushMonitor.instance;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4040
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4040
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@astrogd/eu.astrogd.uptime-kuma-push-monitor",
 | 
					    "name": "@astrogd/eu.astrogd.uptime-kuma-push-monitor",
 | 
				
			||||||
    "version": "1.0.0-dev.1",
 | 
					    "version": "1.0.0-dev.2",
 | 
				
			||||||
    "description": "Handles uptime kuma push monitor uptime requests",
 | 
					    "description": "Handles uptime kuma push monitor uptime requests",
 | 
				
			||||||
    "main": "dist/index.js",
 | 
					    "main": "dist/index.js",
 | 
				
			||||||
    "types": "dist/types/",
 | 
					    "types": "dist/types/",
 | 
				
			||||||
@@ -34,5 +34,6 @@
 | 
				
			|||||||
        "typescript": "^5.1.6"
 | 
					        "typescript": "^5.1.6"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "dependencies": {
 | 
					    "dependencies": {
 | 
				
			||||||
 | 
					        "axios": "^1.5.0"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										139
									
								
								src/pushMonitor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/pushMonitor.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					import sendHeartbeat from "./requestHandler";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Defines an uptime kuma monitor
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					interface Monitor {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The url to push heartbeats to
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    url: string;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The interval in which to push heartbeats in seconds
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    heartbeatIntervall: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Defines a monitor store
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					interface MonitorStore {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The monitor
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    monitor: Monitor;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The last heartbeat
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    lastHeartbeat: Date;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The handler managing all monitors
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export class PushMonitor {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The private constructor
 | 
				
			||||||
 | 
					     * @private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private constructor() {
 | 
				
			||||||
 | 
					        this.initTimer();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The singleton instance of the PushMonitor
 | 
				
			||||||
 | 
					     * @private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static _instance = new PushMonitor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The monitors to manage
 | 
				
			||||||
 | 
					     * @private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private _monitors: MonitorStore[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The check interval
 | 
				
			||||||
 | 
					     * @private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private _checkInterval: NodeJS.Timer | undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Whether to log debug information
 | 
				
			||||||
 | 
					     * @private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private _debug: boolean = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the singleton instance of the PushMonitor
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static get instance(): PushMonitor {
 | 
				
			||||||
 | 
					        return PushMonitor._instance;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Starts the monitor
 | 
				
			||||||
 | 
					     * @returns This instance
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public start(): this {
 | 
				
			||||||
 | 
					        this.initTimer();
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Stops the monitor
 | 
				
			||||||
 | 
					     * @returns This instance
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public stop(): this {
 | 
				
			||||||
 | 
					        if (this._checkInterval) {
 | 
				
			||||||
 | 
					            clearInterval(this._checkInterval);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Registers a new monitor to be managed
 | 
				
			||||||
 | 
					     * @param url {string} The url to push heartbeats to
 | 
				
			||||||
 | 
					     * @param heartbeatIntervall {number} The interval in which to push heartbeats in seconds. Default is 58 seconds
 | 
				
			||||||
 | 
					     * @returns This instance
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public register(url: string, heartbeatIntervall: number = 58): this {
 | 
				
			||||||
 | 
					        this._monitors.push({
 | 
				
			||||||
 | 
					            monitor: {
 | 
				
			||||||
 | 
					                url,
 | 
				
			||||||
 | 
					                heartbeatIntervall,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            lastHeartbeat: new Date(0),
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Sets whether to log debug information
 | 
				
			||||||
 | 
					     * @param debug Whether to log debug information
 | 
				
			||||||
 | 
					     * @returns This instance
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public setDebug(debug: boolean): this {
 | 
				
			||||||
 | 
					        this._debug = debug;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Initializes the timer
 | 
				
			||||||
 | 
					     * @private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private initTimer() {
 | 
				
			||||||
 | 
					        if (this._checkInterval) {
 | 
				
			||||||
 | 
					            clearInterval(this._checkInterval);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this._checkInterval = setInterval(() => {
 | 
				
			||||||
 | 
					            this._monitors.forEach((monitor) => {
 | 
				
			||||||
 | 
					                if (new Date().getTime() - monitor.lastHeartbeat.getTime() > monitor.monitor.heartbeatIntervall * 1000) {
 | 
				
			||||||
 | 
					                    sendHeartbeat(monitor.monitor.url, this._debug);
 | 
				
			||||||
 | 
					                    monitor.lastHeartbeat = new Date();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }, 1000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								src/requestHandler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/requestHandler.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					import axios from "axios";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Sends a heartbeat to the provided URL
 | 
				
			||||||
 | 
					 * @param url The URL to send the heartbeat to
 | 
				
			||||||
 | 
					 * @param debug Whether to log debug information
 | 
				
			||||||
 | 
					 * @private
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export default async function sendHeartbeat(url: string, debug: boolean = false) {
 | 
				
			||||||
 | 
					    const useUrl = new URL(url);
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        const response = await axios.get(`${useUrl.origin}/${useUrl.pathname}?status=up&msg=OK`);
 | 
				
			||||||
 | 
					        if (debug)
 | 
				
			||||||
 | 
					            console.log(
 | 
				
			||||||
 | 
					                `[eu.astrogd.uptime-kuma-push-monitor] (${new Date().toISOString()}) <${url}>: ${response.status} ${response.statusText} - ${
 | 
				
			||||||
 | 
					                    response.data
 | 
				
			||||||
 | 
					                }`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					        console.error(`[eu.astrogd.uptime-kuma-push-monitor] (${new Date().toISOString()}) <${url}>: ${error}`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user