tracman-server/server.js

156 lines
3.9 KiB
JavaScript
Raw Normal View History

2016-03-31 20:38:45 -06:00
/* IMPORTS */
2016-03-30 20:13:04 -06:00
var express = require('express'),
2016-03-21 18:03:37 -06:00
crash = require('express-crash'),
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
session = require('express-session'),
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),
io = require('socket.io')(http);
2016-03-31 20:38:45 -06:00
/* SETUP */
// Templates
2016-03-21 18:03:37 -06:00
nunjucks.configure(__dirname+'/views', {
autoescape: true,
express: app
});
2016-03-31 20:38:45 -06:00
// Session
2016-03-21 18:03:37 -06:00
app.use(session({
secret: secret.session,
saveUninitialized: true,
resave: true
}));
2016-03-26 17:04:56 -06:00
app.use(bodyParser.json());
2016-03-21 18:03:37 -06:00
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser(secret.cookie));
app.use(flash());
2016-03-31 20:38:45 -06:00
// Auth
2016-03-21 18:03:37 -06:00
app.use(passport.initialize());
app.use(passport.session());
2016-03-31 15:01:27 -06:00
require('./config/auth.js');
2016-03-31 20:38:45 -06:00
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);
});
});
// Database
2016-03-21 18:03:37 -06:00
mongoose.connect(secret.mongoSetup, {
2016-03-30 20:13:04 -06:00
server:{socketOptions:{
keepAlive:1, connectTimeoutMS:30000 }},
replset:{socketOptions:{
keepAlive:1, connectTimeoutMS:30000 }}
2016-03-21 18:03:37 -06:00
});
2016-03-31 20:38:45 -06:00
// Routes
2016-03-31 15:57:34 -06:00
app.use(
require('./config/routes/index.js'),
require('./config/routes/auth.js'),
require('./config/routes/feedback.js'),
require('./config/routes/misc.js')
);
app.use('/trac', require('./config/routes/trac.js'));
app.use('/invited', require('./config/routes/invite.js'));
app.use('/dashboard', require('./config/routes/dashboard.js'));
app.use('/admin', require('./config/routes/admin.js'));
app.use('/static', express.static(__dirname+'/static'));
2016-03-21 18:03:37 -06:00
// Handle errors
2016-04-27 21:32:44 -06:00
// if (secret.url=='https://tracman.org') {
2016-04-27 22:02:13 -06:00
var handle404 = function(err,req,res,next) {
if (err) { console.log('404 handling error: '+err); }
res.render('error.html', {code:404});
};
var handle500 = function(err,req,res,next) {
if (err) { console.log('500 handling error: '+err); }
res.render('error.html', {code:500});
};
app.use(crash.handle404(handle404));
app.use(crash.handle500(handle500));
crash.trapRoute(app);
crash.handle(app, handle404, handle500);
2016-04-27 21:32:44 -06:00
// }
2016-03-21 18:03:37 -06:00
2016-03-31 20:38:45 -06:00
/* RUNTIME */
2016-03-21 18:03:37 -06:00
// Check for tracking users
function checkForUsers(room) {
if (room) {
io.to('app-'+room).emit('activate',
(io.of("/").adapter.rooms[room])?'true':'false'
);
} else {
User.find({}, function(err, users){
2016-04-27 15:40:28 -06:00
if (err) { console.log('Sockets error finding all users in all rooms: '+err); }
2016-03-21 18:03:37 -06:00
users.forEach( function(user){
checkForUsers(user.id);
});
});
}
}
2016-03-31 20:38:45 -06:00
// Websockets
2016-03-21 18:03:37 -06:00
io.on('connection', function(socket) {
socket.on('room', function(room) {
socket.join(room);
if (room.slice(0,4)!='app-'){
User.findById({_id:room}, function(err, user) {
2016-04-27 20:24:47 -06:00
if (err) { console.log('Sockets error finding tracked user of room '+room+'\n'+err); }
2016-03-30 20:13:04 -06:00
if (user) {
io.to('app-'+room).emit('activate','true'); }
2016-03-21 18:03:37 -06:00
});
} else {
checkForUsers(room.slice(4));
}
});
socket.on('app', function(loc){
loc.time = Date.now();
io.to(loc.usr).emit('trac', loc);
User.findByIdAndUpdate(loc.usr, {last:{
lat: parseFloat(loc.lat),
lon: parseFloat(loc.lon),
dir: parseFloat(loc.dir||0),
spd: parseFloat(loc.spd||0),
time: Date.now()
}}, function(err, user) {
2016-04-27 15:40:28 -06:00
if (err) { console.log('Could not update last location of user '+loc.user+'\n'+err); }
2016-03-21 18:03:37 -06:00
if (!user) { console.log("No user found: "+loc.user); }
});
});
socket.onclose = function(reason){
2016-03-30 20:13:04 -06:00
var closedroom = Object.keys(
socket.adapter.sids[socket.id]).slice(1)[0];
2016-03-21 18:03:37 -06:00
setTimeout(function() {
checkForUsers(closedroom);
}, 3000);
Object.getPrototypeOf(this).onclose.call(this,reason);
}
});
2016-03-31 20:38:45 -06:00
// Listen
2016-03-30 20:13:04 -06:00
http.listen(secret.port, function(){
2016-03-31 19:34:08 -06:00
console.log('Listening at '+secret.url+':'+secret.port);
2016-03-21 18:03:37 -06:00
checkForUsers();
});
2016-03-31 20:38:45 -06:00
module.exports = app;