/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/logbus@0.9.3/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
#!/usr/bin/env node
const USAGE="\nProcess logs from configured pipeline.\n\nUsage: COMMAND [options] <config>\n\nOptions:\n  -v, --verbosity LEVEL\n    trace, debug, info, warn, error, fatal [default: warn]\n  -c, --check\n    Validate pipeline\n  --timeout SECONDS\n    How long to give stages to stop on pipeline shutdown [default: 10]\n",EXITS={SUCCESS:0,CONFIG:1,TIMEOUT:2,START:21,EXCEPTION:42},EventEmitter=require("events"),util=require("util"),path=require("path"),_=require("lodash"),fs=require("fs/promises"),yaml=require("js-yaml"),unsafe=require("js-yaml-js-types").all,schema=yaml.DEFAULT_SCHEMA.extend(unsafe),newStage=require("./stage"),MODULES={"file-in":"./lib/plugins/input/file","file-out":"./lib/plugins/output/file","json-in":"./lib/plugins/parse/json","json-out":"./lib/plugins/serialize/json","tcp-in":"./lib/plugins/input/tcp",journal:"./lib/plugins/input/journal",tail:"./lib/plugins/input/tail","yaml-in":"./lib/plugins/parse/yaml","yaml-out":"./lib/plugins/serialize/yaml",agg:"./lib/plugins/agg",cast:"./lib/plugins/cast",drop:"./lib/plugins/drop-fields","elasticsearch-in":"./lib/plugins/input/elasticsearch","elasticsearch-log":"./lib/plugins/parse/elasticsearch","elasticsearch-out":"./lib/plugins/output/elasticsearch",elasticsearch:"./lib/plugins/output/elasticsearch","kafka-broker-log":"./lib/plugins/parse/kafka-broker","kafka-in":"./lib/plugins/input/kafka","kafka-out":"./lib/plugins/output/kafka",errors:"./lib/plugins/errors",gc:"./lib/plugins/gc",geoip:"./lib/plugins/geoip",geopop:"./lib/plugins/geopop",js:"./lib/plugins/js",keep:"./lib/plugins/keep-fields",lines:"./lib/plugins/parse/lines",log:"./lib/plugins/log",pass:"./lib/plugins/pass",rename:"./lib/plugins/rename-fields",sample:"./lib/plugins/sample",sql:"./lib/plugins/sql",stats:"./lib/plugins/stats",stdin:"./lib/plugins/input/stdin",stdout:"./lib/plugins/output/stdout"},flows=e=>{const t=function*(s){const i=e[s];if(!i)return yield[{reason:"UNDEFINED",name:s}];if(i.isInput)return yield[{reason:"INPUT",name:s}];const n=[];return i.inputs(e).forEach((e=>{const i=t(e);for(let e=i.next();!e.done;e=i.next())n.push(e.value.concat([{name:s}]))})),0===n.length?i.isErrors?yield[{reason:"ERRORS",name:s}]:i.isStats?yield[{reason:"STATS",name:s}]:yield[{reason:"DEADEND",name:s}]:yield*n},s=[];return _.each(e,((i,n)=>{if(0===i.outputs(e).length){const e=t(n);for(let t=e.next();!t.done;t=e.next())i.isOutput?t.value[t.value.length-1].reason="OUTPUT":t.value[t.value.length-1].reason="DEADEND",s.push(t.value)}})),s};async function main(){const e=require("bunyan"),t=require("docopt").docopt(USAGE),s=e.createLogger({name:process.argv[1].split("/").pop(),level:e[t["--verbosity"].toUpperCase()]}),i=yaml.load(await fs.readFile(t["<config>"]),{schema:schema}),n=path.resolve(path.dirname(t["<config>"])),a={},l={timeout:1e3*parseFloat(t["--timeout"]),graceful(){let e=!0;_.each(a,((t,i)=>{t.stopped()||(e=!1,s.info(i,"waiting on",Object.keys(t.waitingOn).join(",")||"SELF"))})),e&&(s.info("all stages shut down cleanly"),process.exit(EXITS.SUCCESS))},dirty(){s.error("timed out waiting for pipeline to shut down"),process.exit(EXITS.TIMEOUT)},start(e){s.info("shutting down",{reason:e}),_.each(a,(e=>{(e.isInput||e.isErrors||e.isStats)&&e.stop()})),setInterval(l.graceful,1e3),setTimeout(l.dirty,l.timeout)}};process.on("uncaughtException",(e=>{console.error(e,"uncaught exception"),l.start("EXCEPTION")})),process.on("SIGINT",(()=>l.start("SIGINT"))),process.on("SIGQUIT",(()=>l.start("SIGQUIT"))),process.on("SIGTERM",(()=>l.start("SIGTERM")));const o=new EventEmitter;o.setMaxListeners(999),o.on("SIGTERM",(e=>l.start(e))),i.plugins&&_.each(i.plugins,((e,t)=>{MODULES[t]=e.path,"/"!==MODULES[t][0]&&(MODULES[t]=path.join(n,MODULES[t]))}));const r={};if(i.templates)for(const e in i.templates){const t=i.templates[e];"/"!==t.path[0]&&(t.path=path.join(n,t.path)),r[e]=yaml.load(await fs.readFile(t.path),{schema:schema})}_.each(i.pipeline,((e,t)=>{if(e.template){const[t,s]=e.template.split(".");if(!r[t])throw new Error(`undefined stage template: ${e.template}`);e=_.merge({},r[t][s],e)}e.module||(e.module=t);try{const i={ready:!1,stage:t,log:s.child({stage:t}),pipeline:o},n=require(MODULES[e.module]||e.module)(e.config||{},i);e.outChannels=e.outChannels||n.outChannels||[t],i.event=s=>{s&&e.outChannels.forEach((e=>o.emit(e,s,t)))},i.stats=s=>{s.stage=t,o.emit(e.statsChannel||"stats",s)},i.error=s=>{s.stage=t,o.emit(e.errChannel||"errors",s)},a[t]=newStage(t,e,n,i)}catch(e){s.error(e,"failed to load stage: %s",t)}})),_.each(a,((e,t)=>{e.inputs(a).forEach((i=>{s.debug(util.format("%s waits on %s",t,i)),e.waitOn(i),o.once(i+".stopped",e.stop.bind(e,i))}))}));const p={};if(flows(a).forEach((e=>{const i=e.shift(),n=e.pop()||i;"DEADEND"===i.reason&&(p[i.name]="DEADEND"),"DEADEND"===n.reason&&(p[n.name]="DEADEND"),t["--check"]?(console.log(),console.log(i.reason,":",i.name),_.each(e,(e=>{console.log("  - %s",e.name)})),console.log(n.reason,":",n.name)):_.isEmpty(p)||(s.error(p,"invalid stages"),process.exit(EXITS.CONFIG))})),!t["--check"]){for(const e of _.filter(_.map(Object.values(a),"start")))try{const t=await e();s.info(t,"started")}catch(e){s.error(e,"failed to start pipeline"),process.exit(EXITS.START)}s.info("pipeline startup complete"),o.emit("READY")}}require.main===module&&main();
//# sourceMappingURL=/sm/5fbba1f07665f214f4393b4f190e5c90f808ea989898d4ee8e1ed841e19e5bd3.map