facilmap/server/lib/server.js

123 wiersze
3.0 KiB
JavaScript
Czysty Zwykły widok Historia

2014-04-07 00:33:49 +00:00
var http = require("http");
var socketIo = require("socket.io");
var config = require("../config");
var listeners = require("./listeners");
var database = require("./database");
2014-04-09 23:58:14 +00:00
var domain = require("domain");
var utils = require("./utils");
var routing = require("./routing");
2014-04-07 00:33:49 +00:00
2014-04-18 18:11:50 +00:00
database.connect(function(err) {
if(err)
throw err;
var app = http.createServer();
app.listen(config.port, config.host);
var io = socketIo.listen(app);
io.sockets.on("connection", function(socket) {
var d = domain.create();
d.add(socket);
var handlers = {
error : function(err) {
console.error("Error! Disconnecting client.");
console.error(err.stack);
socket.disconnect();
},
setPadId : function(padId) {
if(socket.padId != null) {
return;
}
socket.padId = padId;
listeners.addPadListener(socket);
database.getPadData(socket.padId, _sendData.bind(null, socket, "padData"));
_sendStreamData(socket, "view", database.getViews(socket.padId));
},
updateBbox : function(bbox) {
socket.bbox = bbox;
// TODO: Only get objects for difference to last bbox
_sendStreamData(socket, "marker", database.getPadMarkers(socket.padId, socket.bbox));
_sendStreamData(socket, "line", utils.filterStream(database.getPadLines(socket.padId, socket.bbox), function(line) {
var strippedLine = routing.prepareLineForBoundingBox(line, bbox);
if(strippedLine.actualPoints.length < 2)
return null;
return strippedLine;
}));
},
disconnect : function() {
if(socket.padId)
listeners.removePadListener(socket);
},
editPad : function(data, callback) {
database.updatePadData(socket.padId, data, callback);
},
addMarker : function(data, callback) {
database.createMarker(socket.padId, data, callback);
},
editMarker : function(data, callback) {
database.updateMarker(data.id, data, callback);
},
deleteMarker : function(data, callback) {
database.deleteMarker(data.id, callback);
},
addLine : function(data, callback) {
database.createLine(socket.padId, data, callback);
},
editLine : function(data, callback) {
database.updateLine(data.id, data, callback);
},
deleteLine : function(data, callback) {
database.deleteLine(data.id, callback);
},
addView : function(data, callback) {
database.createView(socket.padId, data, callback);
},
editView : function(data, callback) {
database.updateView(data.id, data, callback);
},
deleteView : function(data, callback) {
database.deleteView(data.id, callback);
2014-04-13 23:34:05 +00:00
}
2014-04-18 18:11:50 +00:00
};
2014-04-13 23:34:05 +00:00
2014-04-18 18:11:50 +00:00
for(var i in handlers)
socket.on(i, handlers[i]);
});
2014-04-07 00:33:49 +00:00
});
function _sendData(socket, eventName, err, data) {
2014-04-18 17:15:26 +00:00
if(err) {
console.warn(err, err.stack);
2014-04-07 00:33:49 +00:00
return socket.emit("error", err);
2014-04-18 17:15:26 +00:00
}
2014-04-07 00:33:49 +00:00
2014-04-13 23:34:05 +00:00
socket.emit(eventName, data);
2014-04-07 00:33:49 +00:00
}
function _sendStreamData(socket, eventName, stream) {
stream.on("data", function(data) {
if(data != null)
socket.emit(eventName, data);
2014-04-07 00:33:49 +00:00
}).on("error", function(err) {
2014-04-18 17:15:26 +00:00
console.warn(err, err.stack);
2014-04-07 00:33:49 +00:00
socket.emit("error", err);
})
}