Refactor code

This commit is contained in:
anugu-chegg 2018-04-03 18:51:14 +05:30 committed by muxator
parent 461ed413b7
commit b4068144c3
3 changed files with 43 additions and 35 deletions

View File

@ -1154,16 +1154,16 @@ function handleClientReady(client, message)
//Save the revision in sessioninfos, we take the revision from the info the client send to us
sessioninfos[client.id].rev = message.client_rev;
var changesetsNeeded = [];
//During the client reconnect, client might miss some revisions from other clients. By using client revision,
//this below code sends all the revisions missed during the client reconnect
var revisionsNeeded = [];
var changesets = {};
var changesetsAuthor = {};
var changesetsTimestamp = {};
var startNum = message.client_rev + 1;
var endNum = pad.getHeadRevisionNumber() + 1;
async.series([
//fetch all changesets we need
//push all the revision numbers needed into revisionsNeeded array
function(callback)
{
var headNum = pad.getHeadRevisionNumber();
@ -1171,67 +1171,69 @@ function handleClientReady(client, message)
endNum = headNum+1;
if (startNum < 0)
startNum = 0;
//create a array for all changesets, we will
//replace the values with the changeset later
for(var r=startNum;r<endNum;r++)
{
changesetsNeeded.push(r);
revisionsNeeded.push(r);
changesets[r] = {};
}
callback();
},
//get all changesets
//get changesets needed for pending revisions
function(callback)
{
async.eachSeries(changesetsNeeded, function(revNum, callback)
async.eachSeries(revisionsNeeded, function(revNum, callback)
{
pad.getRevisionChangeset(revNum, function(err, value)
{
if(ERR(err)) return;
changesets[revNum] = value;
changesets[revNum]['changeset'] = value;
callback();
});
}, callback);
},
//get author for each changeset
function(callback)
{
async.eachSeries(changesetsNeeded, function(revNum, callback)
async.eachSeries(revisionsNeeded, function(revNum, callback)
{
pad.getRevisionAuthor(revNum, function(err, value)
{
if(ERR(err)) return;
changesetsAuthor[revNum] = value;
changesets[revNum]['author'] = value;
callback();
});
}, callback);
},
//get timestamp for each changeset
function(callback)
{
async.eachSeries(changesetsNeeded, function(revNum, callback)
async.eachSeries(revisionsNeeded, function(revNum, callback)
{
pad.getRevisionDate(revNum, function(err, value)
{
if(ERR(err)) return;
changesetsTimestamp[revNum] = value;
changesets[revNum]['timestamp'] = value;
callback();
});
}, callback);
}
],
//return err and changeset
//return error and pending changesets
function(err)
{
if(ERR(err, callback)) return;
async.eachSeries(changesetsNeeded, function(r, callback)
async.eachSeries(revisionsNeeded, function(r, callback)
{
var forWire = Changeset.prepareForWire(changesets[r], pad.pool);
var forWire = Changeset.prepareForWire(changesets[r]['changeset'], pad.pool);
var wireMsg = {"type":"COLLABROOM",
"data":{type:"CLIENT_RECONNECT",
headRev:pad.getHeadRevisionNumber(),
newRev:r,
changeset:forWire.translated,
apool: forWire.pool,
author: changesetsAuthor[r],
currentTime: changesetsTimestamp[r]
author: changesets[r]['author'],
currentTime: changesets[r]['timestamp']
}};
client.json.send(wireMsg);
callback();

View File

@ -60,7 +60,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
var debugMessages = [];
var msgQueue = [];
var socketIOError = false;
var isPendingRevision = false;
tellAceAboutHistoricalAuthors(serverVars.historicalAuthorData);
tellAceActiveAuthorInfo(initialUserInfo);
@ -180,10 +180,15 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
editor.applyChangesToBase(changeset, author, apool);
}
}
if (isPendingRevision) {
setIsPendingRevision(false);
}
}
var sentMessage = false;
if (getSocket().realConnected && !socketIOError)
// Check if there are any pending revisions to be received from server.
// Allow only if there are no pending revisions to be received from server
if (!isPendingRevision)
{
var userChangesData = editor.prepareUserChangeset();
if (userChangesData.changeset)
@ -203,7 +208,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
}
else
{
// run again in a few seconds, to detect a reconnect
// run again in a few seconds, to check if there was a reconnection attempt
setTimeout(wrapRecordingErrors("setTimeout(handleUserChanges)", handleUserChanges), 3000);
}
@ -342,10 +347,12 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
}
else if (msg.type == 'CLIENT_RECONNECT')
{
// When client has reconnected but there are no pending changes from other clients
// Server sends a CLIENT_RECONNECT message when there is a client reconnect. Server also returns
// all pending revisions along with this CLIENT_RECONNECT message
if (msg.noChanges)
{
socketIOError = false;
// If no revisions are pending, just make everything normal
setIsPendingRevision(false);
return;
}
@ -359,7 +366,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
{
if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1))
{
window.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1));
window.console.warn("bad message revision on CLIENT_RECONNECT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1));
// setChannelState("DISCONNECTED", "badmessage_acceptcommit");
return;
}
@ -370,7 +377,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
if (newRev != (rev + 1))
{
window.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1));
window.console.warn("bad message revision on CLIENT_RECONNECT: " + newRev + " not " + (rev + 1));
// setChannelState("DISCONNECTED", "badmessage_acceptcommit");
return;
}
@ -397,8 +404,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
if (newRev == headRev)
{
rev = newRev;
socketIOError = false;
// Once we have applied all pending revisions, make everything normal
setIsPendingRevision(false);
}
}
else if (msg.type == "NO_COMMIT_PENDING")
@ -662,10 +669,11 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
schedulePerhapsCallIdleFuncs();
}
function setSocketIOError(value)
function setIsPendingRevision(value)
{
socketIOError = value;
isPendingRevision = value;
}
function callWhenNotCommitting(func)
{
idleFuncs.push(func);
@ -733,7 +741,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
addHistoricalAuthors: tellAceAboutHistoricalAuthors,
setChannelState: setChannelState,
setStateIdle: setStateIdle,
setSocketIOError: setSocketIOError
setIsPendingRevision: setIsPendingRevision
};
$(document).ready(setUpSocket);

View File

@ -207,14 +207,13 @@ function handshake()
});
socket.on('reconnect', function () {
socket.realConnected = true;
pad.collabClient.setChannelState("CONNECTED");
pad.sendClientReady(receivedClientVars);
});
socket.on('reconnecting', function() {
socket.realConnected = false;
pad.collabClient.setStateIdle();
pad.collabClient.setIsPendingRevision(true);
pad.collabClient.setChannelState("RECONNECTING");
});
@ -223,9 +222,8 @@ function handshake()
});
socket.on('error', function(error) {
socket.realConnected = false;
pad.collabClient.setStateIdle();
pad.collabClient.setSocketIOError(true);
pad.collabClient.setIsPendingRevision(true);
});
var initalized = false;