diff --git a/app.js b/app.js index 89016bd..7e7bdfe 100644 --- a/app.js +++ b/app.js @@ -5,6 +5,7 @@ const express = require('express'), axios = require('axios'), covid19 = require('./lib/cli'), covid19GFX = require('./lib/cli/gfx'), + EventEmitter = require('events'), pkg = require('./package.json'), // package.json info apiBaseURL = "https://corona.lmao.ninja/v2", // NovelCOVID API port = process.env.port || 7070; // set port @@ -153,6 +154,59 @@ app.get('/history/charts/:country/:chartSize(sm|md|lg)?', async (req, res, next) return next(); }); + +// historical chart by country +app.get('/history/web/charts/:country?/:chartSize(sm|md|lg)?', async (req, res, next) => { + const userAgent = req.headers['user-agent'], + countryData = req.params.country || 'ph', + chartType = req.params.chartType || 'cases', + chartSize = req.params.chartSize || 'sm', + summary = await axios.get(`${apiBaseURL}/countries/${countryData}`), + history = await axios.get(`${apiBaseURL}/historical/${summary.data.country}?lastdays=all`), + s = summary.data, + h = history.data, + terminator = `\r\n`+'\033[?25h', + xtermHTMLTemplate = require('./lib/cli/gfx/terminal-html-template'), + bufferEmitter = new EventEmitter(); + + let customHttpResponse = { + send: (data) => { + bufferEmitter.emit('screenBuffer', data) + this.data = data + return this; + }, + get: () => { + return this.data + } + }; + + covid19GFX.historyCountryTracker( + req, customHttpResponse, + s.country, s.cases, s.todayCases, + s.deaths, s.todayDeaths, s.recovered, + s.active, s.critical, s.casesPerOneMillion, + s.updated, h, chartType, s.countryInfo, chartSize + ); + + let screenOutput = (await new Promise((resolve, reject) => { + bufferEmitter.on('screenBuffer', (screen) => { + resolve(screen) + }) + setTimeout(() => { + resolve('') + },5000) + })); + + + if(!screenOutput.length || !h) res.send('Unable to load the chart.Please refresh the page') + + return util.isCommandline(userAgent) ? res.send(screenOutput+terminator) : res.send(xtermHTMLTemplate(screenOutput.replace(terminator, ''))) + +}); + +app.use('/xterm', express.static(__dirname + '/node_modules/xterm')); +app.use('/xterm/addons', express.static(__dirname + '/node_modules/xterm-addon-fit')); + // route for web browser clients app.get('*', (req, res) => res.send(` Welcome to COVID-19 Tracker CLI v${pkg.version} by Waren Gonzaga\n diff --git a/lib/cli/gfx/template.js b/lib/cli/gfx/template.js index 1e0d53c..52ef819 100644 --- a/lib/cli/gfx/template.js +++ b/lib/cli/gfx/template.js @@ -36,7 +36,7 @@ exports.load = (grid, data, chartStyle) => { [ ['',data.cases, data.deaths, data.recovered, data.active, data.casesPerOneMillion], ['','Today Cases', 'Today Deaths', 'Critical', 'Mortality %', 'Recovery %'], - ['',data.todayCases, data.todayDeaths, data.critical, data.mortalityPercentage, data.recoveredPercentage] + ['',data.todayCases, data.todayDeaths, data.critical, parseFloat(data.mortalityPercentage).toFixed(2), parseFloat(data.recoveredPercentage).toFixed(2)] ] }) diff --git a/lib/cli/gfx/terminal-html-template.js b/lib/cli/gfx/terminal-html-template.js new file mode 100644 index 0000000..12f2552 --- /dev/null +++ b/lib/cli/gfx/terminal-html-template.js @@ -0,0 +1,33 @@ + +const html = (data) => { + return (` + + + + + + +
+ + + + `) +} + +module.exports = html diff --git a/package-lock.json b/package-lock.json index 99bb891..eba1302 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "covid19-tracker-cli", - "version": "3.8.5", + "name": "covid19trackercli", + "version": "3.8.9", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -442,7 +442,7 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "^5.1.1", + "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", @@ -1982,6 +1982,16 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xterm": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.9.0.tgz", + "integrity": "sha512-wGfqufmioctKr8VkbRuZbVDfjlXWGZZ1PWHy1yqqpGT3Nm6yaJx8lxDbSEBANtgaiVPTcKSp97sxOy5IlpqYfw==" + }, + "xterm-addon-fit": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.3.0.tgz", + "integrity": "sha512-kvkiqHVrnMXgyCH9Xn0BOBJ7XaWC/4BgpSWQy3SueqximgW630t/QOankgqkvk11iTOCwWdAY9DTyQBXUMN3lw==" + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", diff --git a/package.json b/package.json index 72320a1..524ae15 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,8 @@ "express": "^4.17.1", "figlet": "^1.3.0", "ora": "^4.0.3", + "xterm": "^4.9.0", + "xterm-addon-fit": "^0.3.0", "yargs": "^15.3.1" }, "devDependencies": {