summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWu Cheng-Han2015-07-16 22:46:06 +0800
committerWu Cheng-Han2015-07-16 22:46:06 +0800
commitd14c5bdc9cabf632262067466ef02374cee496cd (patch)
tree63baaaa8c0205f55cb30f7e353e0727f14543851
parent57253d28a7ad2037ba4d5da69d69f653e651c49b (diff)
Added document max length limit, enforceMaxLength on change and show modal when reach the limit.
-rw-r--r--config.js1
-rwxr-xr-xlib/ot/editor-socketio-server.js1
-rw-r--r--lib/ot/server.js7
-rw-r--r--lib/realtime.js17
-rw-r--r--public/js/index.js23
-rw-r--r--public/views/body.ejs19
6 files changed, 59 insertions, 9 deletions
diff --git a/config.js b/config.js
index 54a8ae36..cfd9f20d 100644
--- a/config.js
+++ b/config.js
@@ -46,6 +46,7 @@ var config = {
sessiontouch: 1 * 3600, //1 hour
heartbeatinterval: 5000,
heartbeattimeout: 10000,
+ documentmaxlength: 100000,
//auth
facebook: {
clientID: 'change this',
diff --git a/lib/ot/editor-socketio-server.js b/lib/ot/editor-socketio-server.js
index ade8fc52..67920cbf 100755
--- a/lib/ot/editor-socketio-server.js
+++ b/lib/ot/editor-socketio-server.js
@@ -95,6 +95,7 @@ EditorSocketIOServer.prototype.onOperation = function (socket, revision, operati
try {
var clientId = socket.id;
var wrappedPrime = this.receiveOperation(revision, wrapped);
+ if(!wrappedPrime) return;
//console.log("new operation: " + JSON.stringify(wrapped));
this.getClient(clientId).selection = wrappedPrime.meta;
revision = this.operations.length;
diff --git a/lib/ot/server.js b/lib/ot/server.js
index 608d434b..fec3b6f0 100644
--- a/lib/ot/server.js
+++ b/lib/ot/server.js
@@ -1,3 +1,5 @@
+var config = require('../../config');
+
if (typeof ot === 'undefined') {
var ot = {};
}
@@ -28,7 +30,10 @@ ot.Server = (function (global) {
}
// ... and apply that on the document.
- this.document = operation.apply(this.document);
+ var newDocument = operation.apply(this.document);
+ // ignore if exceed the max length of document
+ if(newDocument.length > config.documentmaxlength) return;
+ this.document = newDocument;
// Store operation in history.
this.operations.push(operation);
diff --git a/lib/realtime.js b/lib/realtime.js
index 3e367158..0b5a46b2 100644
--- a/lib/realtime.js
+++ b/lib/realtime.js
@@ -207,6 +207,7 @@ function emitRefresh(socket) {
if (!notename || !notes[notename]) return;
var note = notes[notename];
socket.emit('refresh', {
+ docmaxlength: config.documentmaxlength,
owner: note.owner,
permission: note.permission,
updatetime: note.updatetime
@@ -218,13 +219,12 @@ var connectionSocketQueue = [];
var isDisconnectBusy = false;
var disconnectSocketQueue = [];
-function finishConnection(socket, notename) {
- var note = notes[notename];
- note.users[socket.id] = users[socket.id];
+function finishConnection(socket, note, user) {
+ note.users[socket.id] = user;
note.socks.push(socket);
note.server.addClient(socket);
- note.server.setName(socket, users[socket.id].name);
- note.server.setColor(socket, users[socket.id].color);
+ note.server.setName(socket, user.name);
+ note.server.setColor(socket, user.color);
emitOnlineUsers(socket);
emitRefresh(socket);
@@ -240,8 +240,9 @@ function finishConnection(socket, notename) {
startConnection(connectionSocketQueue[0]);
if (config.debug) {
+ var notename = getNotenameFromSocket(socket);
logger.info('SERVER connected a client to [' + notename + ']:');
- logger.info(JSON.stringify(users[socket.id]));
+ logger.info(JSON.stringify(user));
//logger.info(notes);
getStatus(function (data) {
logger.info(JSON.stringify(data));
@@ -293,11 +294,11 @@ function startConnection(socket) {
updatetime: moment(updatetime).valueOf(),
server: server
};
- finishConnection(socket, notename);
+ finishConnection(socket, notes[notename], users[socket.id]);
});
});
} else {
- finishConnection(socket, notename);
+ finishConnection(socket, notes[notename], users[socket.id]);
}
}
diff --git a/public/js/index.js b/public/js/index.js
index c90255e4..4068d59b 100644
--- a/public/js/index.js
+++ b/public/js/index.js
@@ -909,10 +909,13 @@ socket.on('permission', function (data) {
permission = data.permission;
checkPermission();
});
+var docmaxlength = null;
var otk = null;
var owner = null;
var permission = null;
socket.on('refresh', function (data) {
+ docmaxlength = data.docmaxlength;
+ editor.setOption("maxLength", docmaxlength);
otk = data.otk;
owner = data.owner;
permission = data.permission;
@@ -1435,10 +1438,30 @@ function buildCursor(user) {
}
//editor actions
+function enforceMaxLength(cm, change) {
+ var maxLength = cm.getOption("maxLength");
+ if (maxLength && change.update) {
+ var str = change.text.join("\n");
+ var delta = str.length - (cm.indexFromPos(change.to) - cm.indexFromPos(change.from));
+ if (delta <= 0) {
+ return false;
+ }
+ delta = cm.getValue().length + delta - maxLength;
+ if (delta > 0) {
+ str = str.substr(0, str.length - delta);
+ change.update(change.from, change.to, str.split("\n"));
+ return true;
+ }
+ }
+ return false;
+}
var ignoreEmitEvents = ['setValue', 'ignoreHistory'];
editor.on('beforeChange', function (cm, change) {
if (debug)
console.debug(change);
+ if (enforceMaxLength(cm, change)) {
+ $('.limit-modal').modal('show');
+ }
var isIgnoreEmitEvent = (ignoreEmitEvents.indexOf(change.origin) != -1);
if (!isIgnoreEmitEvent) {
switch (permission) {
diff --git a/public/views/body.ejs b/public/views/body.ejs
index 1367d9f9..d67267bb 100644
--- a/public/views/body.ejs
+++ b/public/views/body.ejs
@@ -110,4 +110,23 @@
</div>
</div>
</div>
+</div>
+<!-- limit modal -->
+<div class="modal fade limit-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog modal-sm">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
+ </button>
+ <h4 class="modal-title" id="myModalLabel"><i class="fa fa-exclamation-triangle"></i> Reach the limit</h4>
+ </div>
+ <div class="modal-body" style="color:black;">
+ <h5>Sorry, you've reached the max length this note can be.</h5>
+ <strong>Please reduce the content or divided it to more notes, thank you!</strong>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-warning" data-dismiss="modal">OK</button>
+ </div>
+ </div>
+ </div>
</div> \ No newline at end of file