DeferredVis-server/server.js
2011-07-03 14:07:11 -07:00

129 lines
3 KiB
JavaScript

var fs = require('fs')
, net = require('net')
, express = require('express')
, RedisStore = require('connect-redis')(express)
, socketIO = require('socket.io')
, config = require('./config')
, tools = require('./tools')
// tcp server, communicates w/ Deferred host
, server
// express and socket.io app
, app
, io
// Event log
, events = []
exports.start = function() {
startEventListener()
startWebServer()
}
function parseEvents(s) {
var eventStrings = s.trim().split('\r\n')
eventStrings.forEach(function(s) {
var i = s.indexOf(' ')
, j = s.indexOf(' ', i + 1)
, ev = {}
if (j === -1) j = s.length
ev.name = s.slice(0, i)
ev.id = s.slice(i + 1, j)
ev.payload = s.slice(j + 1) || null
events.push(ev)
io.sockets.emit('event', ev)
})
}
function startEventListener() {
server = net.createServer(function(conn) {
var buf = ''
console.log(conn.fd + ' CONNECT')
conn.on('data', function(d) {
buf += d
if (buf[buf.length - 1] === '\n') {
parseEvents(buf)
buf = ''
}
})
conn.on('end', function() {
console.log(conn.fd + ' END')
})
})
server.on('error', function(e) {
console.log(e)
console.log(e.stack)
})
server.listen(config.port, config.host)
}
// A custom static file handler
var FileTypes =
{ css: 'text/css'
, html: 'text/html'
, js: 'application/javascript'
}
function staticFileHandler(file, type) {
var path = file.charAt(0) === '/' ? file : (__dirname + '/public/' + file)
, data = fs.readFileSync(path)
, dev = config.env === 'development'
, ext
if (!type) {
ext = (file || '').toLowerCase().split('.').pop()
type = '' + (FileTypes[ext] || 'application/octet-stream')
}
return function(req, res) {
// Always reload in development
if (dev) data = fs.readFileSync(path, 'binary')
res.send(data, { 'content-type': type })
}
}
function startWebServer() {
app = express.createServer(
express.logger({ format: config.loggerFormat })
, express.bodyParser()
, express.methodOverride()
, express.cookieParser()
, express.session({ secret: config.sessionSecret, store: new RedisStore() })
)
app.configure('development', function() {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }))
})
app.configure('production', function() {
app.use(express.errorHandler())
})
app.get('/', staticFileHandler('index.html'))
app.get('/js/main.js', staticFileHandler('js/main.js'))
app.get('/js/arbor.js', staticFileHandler('js/arbor.js'))
app.get('/js/arbor-tween.js', staticFileHandler('js/arbor-tween.js'))
app.get('/css/style.css', staticFileHandler('css/style.css'))
socketize(app)
app.listen(config.webPort, config.webHost)
}
function socketize(app) {
io = socketIO.listen(app)
io.sockets.on('connection', function(socket) {
// New clients get the backlog of events
events.forEach(function(ev) {
socket.emit('event', ev)
})
})
}
if (require.main === module) exports.start()