tracman-server/server.js

235 lines
5.9 KiB
JavaScript
Raw Normal View History

2016-05-31 21:54:21 -06:00
/* IMPORTS */ { var
2016-05-01 22:59:47 -06:00
express = require('express'),
2016-03-21 18:03:37 -06:00
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
2016-09-09 20:55:33 -06:00
cookieSession = require('cookie-session'),
2016-03-21 18:03:37 -06:00
mongoose = require('mongoose'),
nunjucks = require('nunjucks'),
passport = require('passport'),
flash = require('connect-flash'),
secret = require('./config/secrets.js'),
User = require('./config/models/user.js'),
app = express(),
http = require('http').Server(app),
2016-05-31 21:54:21 -06:00
io = require('socket.io')(http);
}
2016-03-31 20:38:45 -06:00
2016-05-31 21:54:21 -06:00
/* SETUP */ {
/* Database */ mongoose.connect(secret.mongoSetup, {
2016-05-01 22:59:47 -06:00
server:{socketOptions:{
keepAlive:1, connectTimeoutMS:30000 }},
replset:{socketOptions:{
keepAlive:1, connectTimeoutMS:30000 }}
});
2016-05-31 21:54:21 -06:00
/* Templates */ nunjucks.configure(__dirname+'/views', {
autoescape: true,
express: app
2016-05-01 22:59:47 -06:00
});
2016-05-31 21:54:21 -06:00
/* Session */ {
2016-09-09 20:55:33 -06:00
app.use(cookieParser(secret.cookie));
// app.use(expressSession({
app.use(cookieSession({
cookie: {maxAge:60000},
2016-05-31 21:54:21 -06:00
secret: secret.session,
saveUninitialized: true,
resave: true
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(flash());
}
/* Auth */ {
app.use(passport.initialize());
app.use(passport.session());
require('./config/auth.js');
passport.serializeUser(function(user,done) {
done(null, user.id);
});
passport.deserializeUser(function(id,done) {
User.findById(id, function(err, user) {
if(!err) done(null, user);
else done(err, null);
});
});
}
/* Routes */ {
2017-03-06 02:54:32 -07:00
app.get('/favicon.ico', function(req,res){
2017-03-06 02:53:18 -07:00
res.redirect('/static/img/icon/by/16-32-48.ico');
});
2016-05-31 21:54:21 -06:00
app.use('/',
require('./config/routes/index.js'),
require('./config/routes/auth.js'),
require('./config/routes/misc.js')
);
2016-06-12 18:56:37 -06:00
app.use(['/map','/trac'], require('./config/routes/map.js'));
2016-05-31 21:54:21 -06:00
app.use('/admin', require('./config/routes/admin.js'));
app.use('/static', express.static(__dirname+'/static'));
2016-06-30 14:40:21 -06:00
}
/* Errors */ {
// Catch-all for 404s
2016-05-31 21:54:21 -06:00
app.use(function(req,res,next) {
if (!res.headersSent) {
var err = new Error('404: Not found: '+req.url);
err.status = 404;
next(err);
}
});
2016-06-30 14:40:21 -06:00
// Handlers
2016-05-31 21:54:21 -06:00
if (secret.env=='production') {
2016-05-01 22:59:47 -06:00
app.use(function(err,req,res,next) {
if (res.headersSent) { return next(err); }
res.status(err.status||500);
res.render('error.html', {
2016-05-31 21:54:21 -06:00
code: err.status
2016-05-01 22:59:47 -06:00
});
});
2016-06-30 14:40:21 -06:00
}
else /* Development */{
2016-05-01 22:59:47 -06:00
app.use(function(err,req,res,next) {
2016-05-31 21:54:21 -06:00
console.log(err);
2016-05-01 22:59:47 -06:00
if (res.headersSent) { return next(err); }
res.status(err.status||500);
res.render('error.html', {
2016-05-31 21:54:21 -06:00
code: err.status,
message: err.message,
error: err
2016-05-01 22:59:47 -06:00
});
});
}
2016-03-21 18:03:37 -06:00
}
2016-05-01 22:59:47 -06:00
2016-03-21 18:03:37 -06:00
}
2016-05-31 21:54:21 -06:00
/* RUNTIME */ {
2016-06-12 18:18:34 -06:00
// Check for tracking clients
function checkForUsers(user) {
console.log(`Checking for clients receiving updates for ${user}`);
// Checks if any sockets are getting updates for this user
//TODO: Use Object.values() after upgrading to node v7
if (Object.keys(io.sockets.connected).map( function(id){
return io.sockets.connected[id];
}).some( function(socket){
return socket.gets==user;
})) {
console.log(`Activating updates for ${user}.`);
io.to(user).emit('activate','true');
2016-05-01 22:59:47 -06:00
} else {
console.log(`Deactivating updates for ${user}.`);
io.to(user).emit('activate', 'false');
2016-05-01 22:59:47 -06:00
}
2016-05-01 22:59:47 -06:00
}
2016-03-21 18:03:37 -06:00
// Sockets
io.on('connection', function(socket) {
console.log(`${socket.id} connected.`);
2016-05-01 22:59:47 -06:00
// This socket can set location (app)
socket.on('can-set', function(userId){
console.log(`${socket.id} can set updates for ${userId}.`);
socket.join(userId, function(){
console.log(`${socket.id} joined ${userId}`);
});
checkForUsers(userId);
2016-05-01 22:59:47 -06:00
});
// This socket can receive location (map)
socket.on('can-get', function(userId){
socket.gets = userId;
console.log(`${socket.id} can get updates for ${userId}.`);
socket.join(userId, function(){
console.log(`${socket.id} joined ${userId}`);
socket.to(userId).emit('activate', 'true');
});
});
// Set location
socket.on('set', function(loc){
// console.log(`${socket.id} set location for ${loc.usr}`);
2016-05-01 22:59:47 -06:00
loc.time = Date.now();
2016-06-12 18:18:34 -06:00
// Check for sk32 token
if (!loc.tok) { console.log('!loc.tok for loc:',loc) }
else {
2016-06-12 18:18:34 -06:00
// Get loc.usr
User.findById(loc.usr, function(err, user) {
if (err) { console.log('Error finding user:',err); }
if (!user) { console.log('User not found for loc:',loc); }
2016-06-12 18:18:34 -06:00
else {
2016-06-12 18:18:34 -06:00
// Confirm sk32 token
if (loc.tok!=user.sk32) { console.log('loc.tok!=user.sk32 || ',loc.tok,'!=',user.sk32); }
else {
// Broadcast location
io.to(loc.usr).emit('get', loc);
// console.log(`Broadcasting ${loc.lat}, ${loc.lon} to ${loc.usr}`);
2016-06-12 18:18:34 -06:00
// Save in db as last seen
user.last = {
lat: parseFloat(loc.lat),
lon: parseFloat(loc.lon),
dir: parseFloat(loc.dir||0),
spd: parseFloat(loc.spd||0),
time: loc.time
};
user.save(function(err) {
if (err) { console.log('Error saving user last location:'+loc.user+'\n'+err); }
});
2016-06-12 18:18:34 -06:00
}
}
});
}
2016-05-01 22:59:47 -06:00
});
2016-06-12 18:18:34 -06:00
// Shutdown (check for remaining clients)
socket.on('disconnect', function(reason){
console.log(`${socket.id} disconnected because of a ${reason}.`);
// Check if client was receiving updates
if (socket.gets){
console.log(`${socket.id} left ${socket.gets}`);
checkForUsers(socket.gets);
}
});
// Log errors
socket.on('error', function(err){
console.log('Socket error! ',err);
});
2016-03-21 18:03:37 -06:00
});
2016-05-01 22:59:47 -06:00
// Listen
http.listen(secret.port, function(){
2016-06-30 14:40:21 -06:00
console.log(
'==========================================\n'+
'Listening at '+secret.url+
'\n=========================================='
);
// Check for clients for each user
User.find({}, function(err, users){
if (err) { console.log(`DB error finding all users: ${err.message}`); }
users.forEach( function(user){
checkForUsers(user.id);
});
});
2016-03-21 18:03:37 -06:00
});
2016-05-01 22:59:47 -06:00
}
2016-03-21 18:03:37 -06:00
module.exports = app;