1 | #!/usr/bin/env node
|
2 |
|
3 | const program = require('commander'),
|
4 | EventEmitter = require('events'),
|
5 | fetchAuthData = require('./lib/settings').fetchSettings,
|
6 | notifier = require('node-notifier'),
|
7 | logger = require('./lib/logger'),
|
8 | Gateway = require('./lib/proxy'),
|
9 | validate = require('./lib/validators');
|
10 |
|
11 | class LogStream extends EventEmitter {
|
12 | constructor(authData) {
|
13 | super();
|
14 | this.authData = authData;
|
15 | this.gateway = new Gateway(authData);
|
16 | }
|
17 |
|
18 | start() {
|
19 | const t = this;
|
20 | setInterval(() => t.fetchData(), process.env.INTERVAL);
|
21 | logger.Info('Live logging is starting. \n');
|
22 | }
|
23 |
|
24 | fetchData() {
|
25 | this.gateway.logs({ lastId: storage.lastId }).then(({ logs }) => {
|
26 | for (let k in logs) {
|
27 | let row = logs[k];
|
28 |
|
29 | if (!storage.exists(row.id)) {
|
30 | storage.add(row);
|
31 | this.emit('message', row);
|
32 | }
|
33 | }
|
34 | });
|
35 | }
|
36 | }
|
37 |
|
38 | const storage = {
|
39 | logs: {},
|
40 | lastId: 0,
|
41 | add: item => {
|
42 | storage.logs[item.id] = item;
|
43 | storage.lastId = item.id;
|
44 | },
|
45 | exists: key => storage.logs.hasOwnProperty(key)
|
46 | };
|
47 |
|
48 | const isError = msg => msg.error_type.match(/error/gi);
|
49 |
|
50 | program
|
51 | .arguments('[environment]', 'name of environment. Example: staging')
|
52 | .option('-c --config-file <config-file>', 'config file path', '.marketplace-kit')
|
53 | .option('--interval <interval>', 'time to wait between updates in ms', 3000)
|
54 | .action((environment, params) => {
|
55 | process.env.CONFIG_FILE_PATH = params.configFile;
|
56 | process.env.INTERVAL = program.interval;
|
57 |
|
58 | const authData = fetchAuthData(environment, program);
|
59 | const stream = new LogStream(authData);
|
60 |
|
61 | stream.on('message', msg => {
|
62 | if (!msg.message) {
|
63 | return false;
|
64 | }
|
65 |
|
66 | const options = { exit: false, hideTimestamp: true };
|
67 | const text = `[${msg.created_at.replace('T', ' ')}] - ${msg.error_type}: ${msg.message.replace(/\n$/, '')}`;
|
68 |
|
69 | isError(msg) ? logger.Error(text, options) : logger.Info(text, options);
|
70 | });
|
71 |
|
72 | stream.on('message', msg => {
|
73 | if (!msg.message) {
|
74 | return false;
|
75 | }
|
76 |
|
77 | if (isError(msg)) {
|
78 | notifier.notify({ title: msg.error_type, message: msg.message });
|
79 | }
|
80 | });
|
81 |
|
82 | stream.start();
|
83 | });
|
84 |
|
85 | program.parse(process.argv);
|