mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-20 23:46:14 -04:00
Refactor code
This commit is contained in:
parent
461ed413b7
commit
b4068144c3
3 changed files with 43 additions and 35 deletions
|
@ -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
|
//Save the revision in sessioninfos, we take the revision from the info the client send to us
|
||||||
sessioninfos[client.id].rev = message.client_rev;
|
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 changesets = {};
|
||||||
var changesetsAuthor = {};
|
|
||||||
var changesetsTimestamp = {};
|
|
||||||
|
|
||||||
var startNum = message.client_rev + 1;
|
var startNum = message.client_rev + 1;
|
||||||
var endNum = pad.getHeadRevisionNumber() + 1;
|
var endNum = pad.getHeadRevisionNumber() + 1;
|
||||||
|
|
||||||
async.series([
|
async.series([
|
||||||
//fetch all changesets we need
|
//push all the revision numbers needed into revisionsNeeded array
|
||||||
function(callback)
|
function(callback)
|
||||||
{
|
{
|
||||||
var headNum = pad.getHeadRevisionNumber();
|
var headNum = pad.getHeadRevisionNumber();
|
||||||
|
@ -1171,67 +1171,69 @@ function handleClientReady(client, message)
|
||||||
endNum = headNum+1;
|
endNum = headNum+1;
|
||||||
if (startNum < 0)
|
if (startNum < 0)
|
||||||
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++)
|
for(var r=startNum;r<endNum;r++)
|
||||||
{
|
{
|
||||||
changesetsNeeded.push(r);
|
revisionsNeeded.push(r);
|
||||||
|
changesets[r] = {};
|
||||||
}
|
}
|
||||||
callback();
|
callback();
|
||||||
},
|
},
|
||||||
//get all changesets
|
//get changesets needed for pending revisions
|
||||||
function(callback)
|
function(callback)
|
||||||
{
|
{
|
||||||
async.eachSeries(changesetsNeeded, function(revNum, callback)
|
async.eachSeries(revisionsNeeded, function(revNum, callback)
|
||||||
{
|
{
|
||||||
pad.getRevisionChangeset(revNum, function(err, value)
|
pad.getRevisionChangeset(revNum, function(err, value)
|
||||||
{
|
{
|
||||||
if(ERR(err)) return;
|
if(ERR(err)) return;
|
||||||
changesets[revNum] = value;
|
changesets[revNum]['changeset'] = value;
|
||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
}, callback);
|
}, callback);
|
||||||
},
|
},
|
||||||
|
//get author for each changeset
|
||||||
function(callback)
|
function(callback)
|
||||||
{
|
{
|
||||||
async.eachSeries(changesetsNeeded, function(revNum, callback)
|
async.eachSeries(revisionsNeeded, function(revNum, callback)
|
||||||
{
|
{
|
||||||
pad.getRevisionAuthor(revNum, function(err, value)
|
pad.getRevisionAuthor(revNum, function(err, value)
|
||||||
{
|
{
|
||||||
if(ERR(err)) return;
|
if(ERR(err)) return;
|
||||||
changesetsAuthor[revNum] = value;
|
changesets[revNum]['author'] = value;
|
||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
}, callback);
|
}, callback);
|
||||||
},
|
},
|
||||||
|
//get timestamp for each changeset
|
||||||
function(callback)
|
function(callback)
|
||||||
{
|
{
|
||||||
async.eachSeries(changesetsNeeded, function(revNum, callback)
|
async.eachSeries(revisionsNeeded, function(revNum, callback)
|
||||||
{
|
{
|
||||||
pad.getRevisionDate(revNum, function(err, value)
|
pad.getRevisionDate(revNum, function(err, value)
|
||||||
{
|
{
|
||||||
if(ERR(err)) return;
|
if(ERR(err)) return;
|
||||||
changesetsTimestamp[revNum] = value;
|
changesets[revNum]['timestamp'] = value;
|
||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
}, callback);
|
}, callback);
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
//return err and changeset
|
//return error and pending changesets
|
||||||
function(err)
|
function(err)
|
||||||
{
|
{
|
||||||
if(ERR(err, callback)) return;
|
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",
|
var wireMsg = {"type":"COLLABROOM",
|
||||||
"data":{type:"CLIENT_RECONNECT",
|
"data":{type:"CLIENT_RECONNECT",
|
||||||
headRev:pad.getHeadRevisionNumber(),
|
headRev:pad.getHeadRevisionNumber(),
|
||||||
newRev:r,
|
newRev:r,
|
||||||
changeset:forWire.translated,
|
changeset:forWire.translated,
|
||||||
apool: forWire.pool,
|
apool: forWire.pool,
|
||||||
author: changesetsAuthor[r],
|
author: changesets[r]['author'],
|
||||||
currentTime: changesetsTimestamp[r]
|
currentTime: changesets[r]['timestamp']
|
||||||
}};
|
}};
|
||||||
client.json.send(wireMsg);
|
client.json.send(wireMsg);
|
||||||
callback();
|
callback();
|
||||||
|
|
|
@ -60,7 +60,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
var debugMessages = [];
|
var debugMessages = [];
|
||||||
var msgQueue = [];
|
var msgQueue = [];
|
||||||
|
|
||||||
var socketIOError = false;
|
var isPendingRevision = false;
|
||||||
|
|
||||||
tellAceAboutHistoricalAuthors(serverVars.historicalAuthorData);
|
tellAceAboutHistoricalAuthors(serverVars.historicalAuthorData);
|
||||||
tellAceActiveAuthorInfo(initialUserInfo);
|
tellAceActiveAuthorInfo(initialUserInfo);
|
||||||
|
@ -180,10 +180,15 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
editor.applyChangesToBase(changeset, author, apool);
|
editor.applyChangesToBase(changeset, author, apool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (isPendingRevision) {
|
||||||
|
setIsPendingRevision(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sentMessage = 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();
|
var userChangesData = editor.prepareUserChangeset();
|
||||||
if (userChangesData.changeset)
|
if (userChangesData.changeset)
|
||||||
|
@ -203,7 +208,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
}
|
}
|
||||||
else
|
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);
|
setTimeout(wrapRecordingErrors("setTimeout(handleUserChanges)", handleUserChanges), 3000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,10 +347,12 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
}
|
}
|
||||||
else if (msg.type == 'CLIENT_RECONNECT')
|
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)
|
if (msg.noChanges)
|
||||||
{
|
{
|
||||||
socketIOError = false;
|
// If no revisions are pending, just make everything normal
|
||||||
|
setIsPendingRevision(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,7 +366,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
{
|
{
|
||||||
if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1))
|
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");
|
// setChannelState("DISCONNECTED", "badmessage_acceptcommit");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -370,7 +377,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
|
|
||||||
if (newRev != (rev + 1))
|
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");
|
// setChannelState("DISCONNECTED", "badmessage_acceptcommit");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -397,8 +404,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
|
|
||||||
if (newRev == headRev)
|
if (newRev == headRev)
|
||||||
{
|
{
|
||||||
rev = newRev;
|
// Once we have applied all pending revisions, make everything normal
|
||||||
socketIOError = false;
|
setIsPendingRevision(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (msg.type == "NO_COMMIT_PENDING")
|
else if (msg.type == "NO_COMMIT_PENDING")
|
||||||
|
@ -662,10 +669,11 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
schedulePerhapsCallIdleFuncs();
|
schedulePerhapsCallIdleFuncs();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setSocketIOError(value)
|
function setIsPendingRevision(value)
|
||||||
{
|
{
|
||||||
socketIOError = value;
|
isPendingRevision = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function callWhenNotCommitting(func)
|
function callWhenNotCommitting(func)
|
||||||
{
|
{
|
||||||
idleFuncs.push(func);
|
idleFuncs.push(func);
|
||||||
|
@ -733,7 +741,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
|
||||||
addHistoricalAuthors: tellAceAboutHistoricalAuthors,
|
addHistoricalAuthors: tellAceAboutHistoricalAuthors,
|
||||||
setChannelState: setChannelState,
|
setChannelState: setChannelState,
|
||||||
setStateIdle: setStateIdle,
|
setStateIdle: setStateIdle,
|
||||||
setSocketIOError: setSocketIOError
|
setIsPendingRevision: setIsPendingRevision
|
||||||
};
|
};
|
||||||
|
|
||||||
$(document).ready(setUpSocket);
|
$(document).ready(setUpSocket);
|
||||||
|
|
|
@ -207,14 +207,13 @@ function handshake()
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('reconnect', function () {
|
socket.on('reconnect', function () {
|
||||||
socket.realConnected = true;
|
|
||||||
pad.collabClient.setChannelState("CONNECTED");
|
pad.collabClient.setChannelState("CONNECTED");
|
||||||
pad.sendClientReady(receivedClientVars);
|
pad.sendClientReady(receivedClientVars);
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('reconnecting', function() {
|
socket.on('reconnecting', function() {
|
||||||
socket.realConnected = false;
|
|
||||||
pad.collabClient.setStateIdle();
|
pad.collabClient.setStateIdle();
|
||||||
|
pad.collabClient.setIsPendingRevision(true);
|
||||||
pad.collabClient.setChannelState("RECONNECTING");
|
pad.collabClient.setChannelState("RECONNECTING");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -223,9 +222,8 @@ function handshake()
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('error', function(error) {
|
socket.on('error', function(error) {
|
||||||
socket.realConnected = false;
|
|
||||||
pad.collabClient.setStateIdle();
|
pad.collabClient.setStateIdle();
|
||||||
pad.collabClient.setSocketIOError(true);
|
pad.collabClient.setIsPendingRevision(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
var initalized = false;
|
var initalized = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue