{"version":3,"sources":["jsdelivr-header.js","/npm/@1xtr/moleculer-universal-logger@1.0.2/src/cjs/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACUA,aAEA,MAAM,EAAI,QAAQ,UACZ,WAAa,QAAQ,aAAa,QAAQ,MAC1C,eAAE,gBAAmB,QAAQ,aAAa,QAC1C,SAAE,UAAa,QAAQ,MAEvB,WAAa,CAAC,QAAS,QAAS,OAAQ,OAAQ,QAAS,SAEzD,SAAY,GAAY,OAAN,GAA2B,iBAAN,KAAoB,aAAa,QAE9E,SAAS,eACP,MAAM,EAAU,IAAI,QACpB,MAAO,CAAC,EAAK,KACX,GAAqB,iBAAV,GAAgC,OAAV,EAAgB,CAC/C,GAAI,EAAQ,IAAI,GACd,OAEF,EAAQ,IAAI,EACd,CACA,OAAO,EAEX,CAEA,MAAO,cAAgB,QAAQ,SAAS,KAAK,MAAM,KAC/C,aAAe,IACjB,QAAQ,oBAWV,MAAM,wBAAwB,WAM5B,WAAA,CAAY,EAAO,CAAC,GAuBlB,GAtBA,MAAM,GAKN,KAAK,KAAO,EAAE,aAAa,KAAK,KAAM,CACpC,IAAK,QAAQ,IAAI,qBACjB,aAAc,CACZ,OAAQ,OACR,QAAS,CACP,eAAgB,qBAGpB,SAAU,WACV,cAAe,KACf,SAAU,IACV,eAAgB,KAGlB,KAAK,MAAQ,GACb,KAAK,MAAQ,MAER,KAAK,KAAK,IACb,MAAM,IAAI,eACR,mFAEN,CAMA,IAAA,CAAK,GACH,MAAM,KAAK,GAEX,KAAK,cAAgB,KAAK,KAAK,cAC3B,KAAK,KAAK,cACT,GAAQ,KAAK,UAAU,EAAK,gBAE7B,KAAK,KAAK,SAAW,IACvB,KAAK,MAAQ,aAAY,IAAM,KAAK,SAAS,KAAK,KAAK,UACvD,KAAK,MAAM,QAEf,CAMA,IAAA,GAKE,OAJI,KAAK,QACP,cAAc,KAAK,OACnB,KAAK,MAAQ,MAER,KAAK,OACd,CAMA,aAAA,CAAc,GACZ,IAAI,EAAQ,EAAW,KAAK,YAAY,EAAS,KAAO,KACxD,IAAK,EAAO,OAAO,KAEnB,MAAM,EAAQ,IAAI,IAEZ,EAAa,GACV,EAAK,KAAK,GACX,SAAS,IAAM,MAAM,QAAQ,GAAW,KAAK,cAAc,GACxD,IAGL,EAAW,WAAW,QAAQ,GAEpC,MAAO,CAAC,EAAM,KACZ,MAAM,EAAU,WAAW,QAAQ,GAC/B,EAAU,KAIZ,KAAK,KAAK,eAAe,SAAS,EAAS,MACxB,WAAjB,EAAS,KAAoB,GAAW,KAK5C,KAAK,MAAM,KAAK,CACd,GAAI,KAAK,MACT,MAAO,EACP,QAAS,EAAU,GAAM,KAAK,KAC9B,aAEF,EAAM,QACD,KAAK,KAAK,UAAU,KAAK,QAAM,CAExC,CAKA,KAAA,GACE,GAAI,KAAK,MAAM,OAAS,EAAG,CACzB,MAAM,EAAO,MAAM,KAAK,KAAK,OAC7B,KAAK,MAAM,OAAS,EAEpB,MAAM,EAAO,EAAK,KAAK,IACd,CACL,UAAW,EAAI,GACf,MAAO,EAAI,MACX,QAAS,EAAI,QACb,OAAQ,EAAI,SAAS,OACrB,UAAW,EAAI,SAAS,GACxB,QAAS,EAAI,SAAS,IACtB,OAAQ,EAAI,SAAS,IACrB,SAAU,KAAK,KAAK,SACpB,QAAS,EAAI,SAAS,KAAO,OAIjC,OAAO,MAAM,KAAK,KAAK,IAAK,IACvB,KAAK,KAAK,aACb,KAAM,KAAK,UAAU,KAEpB,MAAM,IACc,MAAf,EAAI,QACN,QAAQ,KAAK,wDAAyD,EACxE,IAED,OAAO,IACN,QAAQ,KAAK,4CAA4C,EAAI,UAAW,EAAG,GAEjF,CAEA,OAAO,KAAK,OAAO,QAAQ,SAC7B,EAGF,OAAO,QAAU","file":"/npm/@1xtr/moleculer-universal-logger@1.0.2/src/cjs/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@1xtr/moleculer-universal-logger@1.0.2/src/cjs/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","/*\n * moleculer\n * Copyright (c) 2023 MoleculerJS (https://github.com/moleculerjs/moleculer)\n * MIT Licensed\n */\n\n/**\n * @typedef {Object} UniversalLoggerOptions\n * @property {string} [url=\"\"] UniversalLogger logs endpoint\n * @property {RequestInit} [fetchOptions={method: \"POST\", headers: {\"Content-Type\": \"application/json\"}}] Fetch options\n * @property {string} [hostname='hostname'] Hostname, default is machine hostname 'os.hostname()'\n * @property {Function} [objectPrinter=null] Callback function for object printer, default is 'JSON.stringify'\n * @property {number} [interval=10000] Date uploading interval in milliseconds, default is 10000\n * @property {string[]} [excludeModules=[]] Exclude modules from logs, 'broker', 'registry' etc.\n */\n\n'use strict'\n\nconst _ = require('lodash')\nconst BaseLogger = require('moleculer').Loggers.Base\nconst { MoleculerError } = require('moleculer').Errors\nconst { hostname } = require('os')\n\nconst LOG_LEVELS = ['fatal', 'error', 'warn', 'info', 'debug', 'trace']\n\nconst isObject = (o) => o !== null && typeof o === 'object' && !(o instanceof String)\n\nfunction replacerFunc() {\n  const visited = new WeakSet()\n  return (key, value) => {\n    if (typeof value === 'object' && value !== null) {\n      if (visited.has(value)) {\n        return\n      }\n      visited.add(value)\n    }\n    return value\n  }\n}\n\nconst [NODE_VERSION] = process.versions.node.split('.')\nif (NODE_VERSION < 18) {\n  require('isomorphic-fetch')\n}\n\n/**\n * UniversalLogger logger for Moleculer\n *\n * @constructor\n * @class UniversalLogger\n * @property {import('moleculer').ServiceBroker} broker - Moleculer broker\n * @extends {BaseLogger}\n */\nclass UniversalLogger extends BaseLogger {\n  /**\n   * Creates an instance of UniversalLogger.\n   * @param {UniversalLoggerOptions} opts\n   * @memberof UniversalLogger\n   */\n  constructor(opts = {}) {\n    super(opts)\n\n    /**\n     * @type {UniversalLoggerOptions}\n     */\n    this.opts = _.defaultsDeep(this.opts, {\n      url: process.env.UNIVERSAL_LOGGER_URL,\n      fetchOptions: {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n      },\n      hostname: hostname(),\n      objectPrinter: null,\n      interval: 10 * 1000,\n      excludeModules: [],\n    })\n\n    this.queue = []\n    this.timer = null\n\n    if (!this.opts.url)\n      throw new MoleculerError(\n        'URL is missing. Set url in options or UNIVERSAL_LOGGER_URL environment variable.'\n      )\n  }\n\n  /**\n   * Initialize logger.\n   * @param {import('moleculer').LoggerFactory} loggerFactory\n   */\n  init(loggerFactory) {\n    super.init(loggerFactory)\n\n    this.objectPrinter = this.opts.objectPrinter\n      ? this.opts.objectPrinter\n      : (obj) => JSON.stringify(obj, replacerFunc())\n\n    if (this.opts.interval > 0) {\n      this.timer = setInterval(() => this.flush(), this.opts.interval)\n      this.timer.unref()\n    }\n  }\n\n  /**\n   * Stopping logger\n   * @return {Promise<void>|*}\n   */\n  stop() {\n    if (this.timer) {\n      clearInterval(this.timer)\n      this.timer = null\n    }\n    return this.flush()\n  }\n\n  /**\n   * Generate a new log handler.\n   * @param {object} bindings\n   */\n  getLogHandler(bindings) {\n    let level = bindings ? this.getLogLevel(bindings.mod) : null\n    if (!level) return null\n\n    const extra = new Map()\n\n    const printArgs = (args) => {\n      return args.map((p) => {\n        if (isObject(p) || Array.isArray(p)) return this.objectPrinter(p)\n        return p\n      })\n    }\n    const levelIdx = LOG_LEVELS.indexOf(level)\n\n    return (type, args) => {\n      const typeIdx = LOG_LEVELS.indexOf(type)\n      if (typeIdx > levelIdx) return\n\n      // If broker in exclude array, allow only `error` and `fatal` from it\n      if (\n        this.opts.excludeModules.includes(bindings.mod) &&\n        !(bindings.mod === 'broker' && typeIdx <= 1)\n      ) {\n        return\n      }\n\n      this.queue.push({\n        ts: Date.now(),\n        level: type,\n        message: printArgs(args).join(' '),\n        bindings,\n      })\n      extra.clear()\n      if (!this.opts.interval) this.flush()\n    }\n  }\n\n  /**\n   * Flush queued log entries to UniversalLogger.\n   */\n  flush() {\n    if (this.queue.length > 0) {\n      const rows = Array.from(this.queue)\n      this.queue.length = 0\n\n      const data = rows.map((row) => {\n        return {\n          timestamp: row.ts,\n          level: row.level,\n          message: row.message,\n          nodeID: row.bindings.nodeID,\n          namespace: row.bindings.ns,\n          service: row.bindings.svc,\n          source: row.bindings.mod,\n          hostname: this.opts.hostname,\n          version: row.bindings.ver ?? '',\n        }\n      })\n\n      return fetch(this.opts.url, {\n        ...this.opts.fetchOptions,\n        body: JSON.stringify(data),\n      })\n        .then((res) => {\n          if (res.status !== 202) {\n            console.info('Logs are uploaded to UniversalLogger without success.', res)\n          }\n        })\n        .catch((err) => {\n          console.warn(`Unable to upload logs to service. Error: ${err.message}`, err)\n        })\n    }\n\n    return this.broker.Promise.resolve()\n  }\n}\n\nmodule.exports = UniversalLogger\n"]}