Created
October 16, 2017 13:10
-
-
Save mateobur/edd01320f7e6faf88d7a0ed16f5a5861 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var express = require('express'), | |
async = require('async'), | |
pg = require("pg"), | |
cookieParser = require('cookie-parser'), | |
bodyParser = require('body-parser'), | |
methodOverride = require('method-override'), | |
app = express(), | |
server = require('http').Server(app), | |
io = require('socket.io')(server); | |
const prom = require('prom-client') | |
prom.collectDefaultMetrics(); | |
const prom_gc = require('prometheus-gc-stats') | |
prom_gc(); | |
const result_votes_count = new prom.Counter({name: 'result_votes_count', help: 'Total number of votes processed in the results app' }); | |
io.set('transports', ['polling']); | |
var port = process.env.PORT || 4000; | |
io.sockets.on('connection', function (socket) { | |
socket.emit('message', { text : 'Welcome!' }); | |
socket.on('subscribe', function (data) { | |
socket.join(data.channel); | |
}); | |
}); | |
async.retry( | |
{times: 1000, interval: 1000}, | |
function(callback) { | |
pg.connect('postgres://postgres@db/postgres', function(err, client, done) { | |
if (err) { | |
console.error("Waiting for db"); | |
} | |
callback(err, client); | |
}); | |
}, | |
function(err, client) { | |
if (err) { | |
return console.err("Giving up"); | |
} | |
console.log("Connected to db"); | |
getVotes(client); | |
} | |
); | |
function getVotes(client) { | |
client.query('SELECT vote, COUNT(id) AS count FROM votes GROUP BY vote', [], function(err, result) { | |
if (err) { | |
console.error("Error performing query: " + err); | |
} else { | |
var votes = collectVotesFromResult(result); | |
io.sockets.emit("scores", JSON.stringify(votes)); | |
} | |
setTimeout(function() {getVotes(client) }, 1000); | |
}); | |
} | |
function collectVotesFromResult(result) { | |
var votes = {a: 0, b: 0}; | |
result.rows.forEach(function (row) { | |
votes[row.vote] = parseInt(row.count); | |
result_votes_count.inc(votes[row.vote]); | |
}); | |
return votes; | |
} | |
app.use(cookieParser()); | |
app.use(bodyParser()); | |
app.use(methodOverride('X-HTTP-Method-Override')); | |
app.use(function(req, res, next) { | |
res.header("Access-Control-Allow-Origin", "*"); | |
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); | |
res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS"); | |
next(); | |
}); | |
app.use(express.static(__dirname + '/views')); | |
app.get('/', function (req, res) { | |
res.sendFile(path.resolve(__dirname + '/views/index.html')); | |
}); | |
app.get('/metrics', function (req, res) { | |
res.set('Content-Type', prom.register.contentType); | |
res.end(prom.register.metrics()); | |
}); | |
server.listen(port, function () { | |
var port = server.address().port; | |
console.log('App running on port ' + port); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment