"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const nodemailer = require("nodemailer"); const log = require("./log"); const CallChain = require("./callchain"); const Processor = require("./processor"); const CHECK_PERIOD = 60; // seconds const SMTP_HOST = "localhost"; const SMTP_PORT = 25; const SMTP_SENDER = "dispatcher@hottis.de"; const SMTP_RECEIVER = "woho@hottis.de"; class ClientEntry { } class MissingEventProcessor extends Processor.AProcessor { constructor() { super("MissingEventProcessor"); this.clientMap = new Map(); this.smtp = nodemailer.createTransport({ host: SMTP_HOST, port: SMTP_PORT, secure: false }); this.timer = setInterval(() => { this.clientMap.forEach((value, key) => { let currentTime = new Date().getTime(); let elapsedTime = currentTime - value.lastEvent; log.info(`Checking ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`); if ((value.avgDelay != 0) && (elapsedTime > (value.avgDelay * 3))) { let mail = { from: SMTP_SENDER, to: SMTP_RECEIVER, subject: `Missing Event Detected for ${key}`, text: `Missing Event Detected: ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}` }; this.smtp.sendMail(mail) .then((v) => { log.info(`Missing event info mail sent, ${v.response}`); }) .catch((reason) => { log.error(`Failure when sending missing event info: ${reason}`); }); } }); }, CHECK_PERIOD * 1000); } process(message) { let client = message.metadata.client; log.info(`Event for client ${client}`); let currentTime = new Date().getTime(); if (this.clientMap.has(client)) { let clientEntry = this.clientMap.get(client); clientEntry.client = client; clientEntry.delay = currentTime - clientEntry.lastEvent; clientEntry.lastEvent = currentTime; clientEntry.count += 1; if (clientEntry.count >= 1) { clientEntry.delaySum += clientEntry.delay; clientEntry.avgDelay = clientEntry.delaySum / clientEntry.count; } this.clientMap.set(client, clientEntry); log.info(`Entry for ${client} updated`); } else { let clientEntry = new ClientEntry(); clientEntry.client = client; clientEntry.lastEvent = currentTime; clientEntry.delay = 0; clientEntry.count = -1; clientEntry.delaySum = 0; clientEntry.avgDelay = 0; this.clientMap.set(client, clientEntry); log.info(`Entry for ${client} inserted`); } } } class MissingEventDetector extends CallChain.ABaseChainItem { constructor() { super("MissingEventDetector"); this.missingEventProcessor = new MissingEventProcessor(); } func(message) { this.missingEventProcessor.in(message); return message; } } exports.MissingEventDetector = MissingEventDetector; //# sourceMappingURL=missingeventdetector.js.map