{"version":3,"sources":["jsdelivr-header.js","/npm/koa2-monitor@0.1.2/index.js"],"names":[],"mappings":"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","file":"/npm/koa2-monitor@0.1.2/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/koa2-monitor@0.1.2/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\n\nconst fs = require('mz/fs')\nconst path = require('path')\nconst os = require('os')\nconst pidusage = require('pidusage')\nconst handlebars = require('handlebars')\nlet io\nlet appName\ntry {\n  appName = require('../../package.json').name\n} catch (err) {}\n\nconst defaultConfig = {\n  path: '/status',\n  port: 3003,\n  title: appName,\n  spans: [{\n    interval: 1,\n    retention: 60\n  }, {\n    interval: 5,\n    retention: 60\n  }, {\n    interval: 15,\n    retention: 60\n  }]\n}\n\nconst last = function (arr) {\n  return arr[arr.length - 1]\n}\n\nconst gatherOsMetrics = (io, span) => {\n  const defaultResponse = {\n    '2': 0,\n    '3': 0,\n    '4': 0,\n    '5': 0,\n    count: 0,\n    mean: 0,\n    timestamp: Date.now()\n  }\n\n  const sendMetrics = (span) => {\n    io.emit('stats', {\n      os: span.os[span.os.length - 2],\n      responses: span.responses[span.responses.length - 2],\n      interval: span.interval,\n      retention: span.retention\n    })\n  }\n\n  pidusage.stat(process.pid, (err, stat) => {\n    if (err) {\n      console.error(err)\n      return\n    }\n    stat.memory = stat.memory / 1024 / 1024 // Convert from B to MB\n    stat.load = os.loadavg()\n    stat.timestamp = Date.now()\n\n    span.os.push(stat)\n    if (!span.responses[0] || last(span.responses).timestamp + (span.interval * 1000) < Date.now()) span.responses.push(defaultResponse)\n\n    if (span.os.length >= span.retention) span.os.shift()\n    if (span.responses[0] && span.responses.length > span.retention) span.responses.shift()\n\n    sendMetrics(span)\n  })\n}\n\nconst encoding = {encoding: 'utf8'}\n\nconst middlewareWrapper = (config) => {\n  io = require('socket.io')(config.port)\n  Object.assign(defaultConfig, config)\n  config = defaultConfig\n  const htmlFilePath = path.join(__dirname, 'index.html')\n  const indexHtml = fs.readFileSync(htmlFilePath, encoding)\n  const template = handlebars.compile(indexHtml)\n\n  io.on('connection', (socket) => {\n    socket.emit('start', config.spans)\n    socket.on('change', function () {\n      socket.emit('start', config.spans)\n    })\n  })\n\n  config.spans.forEach((span) => {\n    span.os = []\n    span.responses = []\n    const interval = setInterval(() => gatherOsMetrics(io, span), span.interval * 1000)\n    interval.unref()\n  })\n  // console.log(config)\n\n  return function*(next) {\n    const startTime = process.hrtime()\n\n    if (this.path === config.path) {\n      this.body = template(config)\n    } else if (this.url === `${config.path}/koa-monitor-frontend.js`) {\n      const pathToJs = path.join(__dirname, 'koa-monitor-frontend.js')\n      this.body = (yield fs.readFile(pathToJs, encoding)).replace('\"SOCKET_PORT\"', config.port)\n    } else {\n      let timer\n      if (config.requestTimeout) {\n        timer = setTimeout(() => {\n          record.call(this, true)\n        }, config.requestTimeout)\n      }\n\n      yield next\n\n      timer && clearTimeout(timer)\n      record.call(this)\n    }\n\n    function record (timeout) {\n      const diff = process.hrtime(startTime)\n      const responseTime = diff[0] * 1e3 + diff[1] * 1e-6\n      // if timeout, set response code to 5xx.\n      const category = timeout ? 5 : Math.floor(this.statusCode / 100)\n\n      config.spans.forEach((span) => {\n        const lastResponse = last(span.responses)\n        if (lastResponse && lastResponse.timestamp / 1000 + span.interval > Date.now() / 1000) {\n          lastResponse[category]++\n          lastResponse.count++\n          lastResponse.mean = lastResponse.mean + ((responseTime - lastResponse.mean) / lastResponse.count)\n        } else {\n          span.responses.push({\n            '2': category === 2 ? 1 : 0,\n            '3': category === 3 ? 1 : 0,\n            '4': category === 4 ? 1 : 0,\n            '5': category === 5 ? 1 : 0,\n            count: 1,\n            mean: responseTime,\n            timestamp: Date.now()\n          })\n        }\n      })\n    }\n  }\n}\n\nmodule.exports = middlewareWrapper\n"]}