mirror of
https://github.com/samsonjs/DeferredVis-server.git
synced 2026-03-25 09:15:49 +00:00
129 lines
3 KiB
JavaScript
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()
|