A websocket per datasource avoids Socket.io re-connect issues.

pull/3/head
Hugo Sequeira 2014-07-09 14:31:39 +02:00
parent 20e5a67152
commit e976bb4525
1 changed files with 7 additions and 50 deletions

View File

@ -10,37 +10,13 @@
(function() { (function() {
var connectionCounter = 0;
var nodeJSDatasource = function(settings, updateCallback) { var nodeJSDatasource = function(settings, updateCallback) {
var self = this, var self = this,
connectionId = 0,
currentSettings = settings, currentSettings = settings,
url, url,
socket, socket,
newMessageCallback; newMessageCallback;
function setConnectionDead() {
if (self.socket && self.socket.connectionsAlive) {
if (self.socket.connectionsAlive.indexOf(self.connectionId)>-1){
self.socket.connectionsAlive.splice(self.socket.connectionsAlive.indexOf(self.connectionId), 1);
}
}
}
function setConnectionAlive() {
if (self.socket) {
// Initialization
if (!self.socket.connectionsAlive) {
self.socket.connectionsAlive = [];
}
// Check if alive connection have been saved
if (!_.contains(self.socket.connectionsAlive, self.connectionId)) {
self.socket.connectionsAlive.push(self.connectionId);
}
}
}
function onNewMessageHandler(message) { function onNewMessageHandler(message) {
var objdata = JSON.parse(message); var objdata = JSON.parse(message);
@ -49,7 +25,6 @@
} else { } else {
updateCallback(data); updateCallback(data);
} }
setConnectionAlive();
} }
function joinRoom(roomName, roomEvent) { function joinRoom(roomName, roomEvent) {
@ -59,30 +34,17 @@
console.info("Joining room '%s' with event '%s'", roomName, roomEvent); console.info("Joining room '%s' with event '%s'", roomName, roomEvent);
} }
function checkDiscardSocket() { function discardSocket() {
// Disconnect not active socket // Disconnect datasource websocket
if (self.socket) { if (self.socket) {
// Discard socket if no other connection are using it self.socket.disconnect();
if (self.socket.connectionsAlive.length==0 && self.socket.connected) {
self.socket.disconnect();
console.info("Disconnected from Node.js server at: %s", self.url);
}
} }
} }
function connectToServer(url, rooms) { function connectToServer(url, rooms) {
// Establish connection with server // Establish connection with server
self.url = url; self.url = url;
self.socket = io.connect(self.url); self.socket = io.connect(self.url,{'forceNew':true});
// Re-connect old disconnect socket
if (self.socket) {
if (self.socket.connectionsAlive) {
if (self.socket.disconnected) {
self.socket = io.connect(self.url,{'forceNew':true});
}
}
}
// Join the rooms // Join the rooms
self.socket.on('connect', function() { self.socket.on('connect', function() {
@ -110,8 +72,7 @@
self.socket.on('reconnect_failed', function(object) { self.socket.on('reconnect_failed', function(object) {
console.error("Re-connection to Node.js failed at: %s", self.url); console.error("Re-connection to Node.js failed at: %s", self.url);
setConnectionDead(); discardSocket();
checkDiscardSocket();
}); });
} }
@ -119,7 +80,7 @@
function initializeDataSource() { function initializeDataSource() {
// Reset connection to server // Reset connection to server
checkDiscardSocket(); discardSocket();
connectToServer(currentSettings.url, currentSettings.rooms); connectToServer(currentSettings.url, currentSettings.rooms);
// Subscribe to the events // Subscribe to the events
@ -144,9 +105,7 @@
self.newMessageCallback = function(message) { self.newMessageCallback = function(message) {
return; return;
}; };
// Set connection has dead discardSocket();
setConnectionDead();
checkDiscardSocket();
}; };
this.onSettingsChanged = function(newSettings) { this.onSettingsChanged = function(newSettings) {
@ -154,8 +113,6 @@
initializeDataSource(); initializeDataSource();
}; };
// Main
self.connectionId = connectionCounter++;
initializeDataSource(); initializeDataSource();
}; };