Skip to content

Commit df099be

Browse files
committed
feat: chart view via browser
1 parent eee8df7 commit df099be

File tree

6 files changed

+86
-14
lines changed

6 files changed

+86
-14
lines changed

app.js

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const express = require('express'),
55
axios = require('axios'),
66
covid19 = require('./lib/cli'),
77
covid19GFX = require('./lib/cli/gfx'),
8+
EventEmitter = require('events'),
89
pkg = require('./package.json'), // package.json info
910
apiBaseURL = "https://corona.lmao.ninja", // NovelCOVID API
1011
port = process.env.port || 7070; // set port
@@ -129,7 +130,6 @@ app.get('/history/:country/:chartType(cases|deaths)?', async (req, res, next) =>
129130
return next();
130131
});
131132

132-
133133
// historical chart by country
134134
app.get('/history/charts/:country', async (req, res, next) => {
135135
const userAgent = req.headers['user-agent'],
@@ -139,23 +139,49 @@ app.get('/history/charts/:country', async (req, res, next) => {
139139
history = await axios.get(`${apiBaseURL}/v2/historical/${summary.data.country}?lastdays=all`),
140140
s = summary.data,
141141
h = history.data;
142+
terminator = '\r\n'+'\033[?25h',
143+
xtermHTMLTemplate = require('./lib/cli/gfx/terminal-template'),
144+
bufferEmitter = new EventEmitter();
145+
146+
let customHttpResponse = {
147+
send: (data) => {
148+
bufferEmitter.emit('screenBuffer', data)
149+
this.data = data
150+
return this;
151+
},
152+
get: () => {
153+
return this.data
154+
}
155+
};
142156

143-
if (util.isCommandline(userAgent)) {
144-
covid19GFX.historyCountryTracker(
145-
req, res,
157+
covid19GFX.historyCountryTracker(
158+
req, customHttpResponse,
146159
s.country, s.cases, s.todayCases,
147160
s.deaths, s.todayDeaths, s.recovered,
148161
s.active, s.critical, s.casesPerOneMillion,
149162
s.updated, h, chartType, s.countryInfo
150-
)
151-
return null;
152-
}
153-
return next();
154-
});
163+
);
164+
165+
let screenOutput = (await new Promise((resolve, reject) => {
166+
bufferEmitter.on('screenBuffer', (screen) => {
167+
resolve(screen)
168+
})
169+
setTimeout(() => {
170+
resolve('')
171+
},5000)
172+
}))
173+
174+
if(!screenOutput.length || !h) res.send('Unable to load the chart.Please refresh the page')
175+
176+
return util.isCommandline(userAgent) ? res.send(screenOutput+terminator) : res.send(xtermHTMLTemplate(screenOutput))
177+
})
178+
179+
app.use('/xterm', express.static(__dirname + '/node_modules/xterm'));
180+
app.use('/xterm/addons', express.static(__dirname + '/node_modules/xterm-addon-fit'));
155181

156182
app.get('*', (req, res) => res.send(`
157183
Welcome to COVID-19 Tracker CLI v${pkg.version} by Waren Gonzaga\n
158184
Please visit: https://warengonza.ga/covid19-tracker-cli
159185
\n`));
160186

161-
app.listen(port, () => console.log(`COVID-19 Tracker v${pkg.version} is listening on port ${port}!`));
187+
app.listen(port, () => console.log(`COVID-19 Tracker v${pkg.version} is listening on port ${port}!`));

lib/cli/gfx/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ exports.historyCountryTracker = (req, res, n, c, tC, d, tD, r, a, cl, cPOM, u, h
7676
defaultHeader,
7777
footer,
7878
}, (screen) => {
79-
res.send(screen+'\r\n'+'\033[?25h')
79+
res.send(screen)
8080
})
8181

8282
};

lib/cli/gfx/template.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ exports.load = (grid, data) => {
8484
]
8585
});
8686

87-
let line = grid.set(5, 0, 4, 9, contrib.line,
87+
let line = grid.set(5, 0, 5, 9, contrib.line,
8888
{ style:
8989
{ line: "yellow"
9090
, text: "green"
@@ -128,7 +128,7 @@ exports.load = (grid, data) => {
128128
screen.append(line) //must append before setting data
129129
line.setData([series1, series2, series3])
130130

131-
let markdownFooter = grid.set(8, 0, 2, 9, contrib.markdown,{
131+
let markdownFooter = grid.set(9, 0, 2, 9, contrib.markdown,{
132132
style: {
133133
border: {
134134
fg: 'black'

lib/cli/gfx/terminal-template.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
const html = (data) => {
3+
return (`<!doctype html>
4+
<html>
5+
<head>
6+
<script src="/xterm/lib/xterm.js"></script>
7+
<script src='/xterm/addons/lib/xterm-addon-fit.js'></script>
8+
</head>
9+
<body>
10+
<div id="terminal" style='width: 105%;height: 100vh;padding-left: 2px;'></div>
11+
</body>
12+
<script>
13+
var term = new Terminal();
14+
var fitAddon = new FitAddon.FitAddon()
15+
term.loadAddon(fitAddon);
16+
term.open(document.getElementById('terminal'));
17+
fitAddon.fit();
18+
term.write('${data}')
19+
</script>
20+
<style>
21+
body{
22+
background: #000;
23+
margin:0;padding:0;
24+
overflow:hidden;
25+
}
26+
textarea, .xterm-char-measure-element, .xterm-scroll-area{
27+
display: none;
28+
}
29+
</style>
30+
</html>`)
31+
}
32+
33+
module.exports = html
34+

package-lock.json

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
"express": "^4.17.1",
4040
"figlet": "^1.3.0",
4141
"ora": "^4.0.3",
42+
"xterm": "^4.5.0",
43+
"xterm-addon-fit": "^0.3.0",
4244
"yargs": "^15.3.1"
4345
},
4446
"devDependencies": {

0 commit comments

Comments
 (0)