Gracefully return when an op has already been submitted

It is not a fatal error if an op has already been submitted. We just
need to send an ack back to the client that submitted it and continue.
If we detect a duplicate op, set dup: true on the op and pass it back
to real-time for distributing. The dup: true flag will ensure it only
gets acknowledged to the submitting client, not everyone.
This commit is contained in:
James Allen 2015-11-19 10:54:28 +00:00
parent e73890bfc2
commit 2589e2d417

View file

@ -32,7 +32,14 @@ module.exports = ShareJsUpdateManager =
for update in updates for update in updates
do (update) => do (update) =>
jobs.push (callback) => jobs.push (callback) =>
model.applyOp doc_key, update, callback model.applyOp doc_key, update, (error) ->
if error == "Op already submitted"
logger.warn {project_id, doc_id, update}, "op has already been submitted"
update.dup = true
ShareJsUpdateManager._sendOp(project_id, doc_id, update)
callback()
else
callback(error)
async.series jobs, (error) => async.series jobs, (error) =>
logger.log project_id: project_id, doc_id: doc_id, error: error, "applied updates" logger.log project_id: project_id, doc_id: doc_id, error: error, "applied updates"
@ -49,11 +56,15 @@ module.exports = ShareJsUpdateManager =
_listenForOps: (model) -> _listenForOps: (model) ->
model.on "applyOp", (doc_key, opData) -> model.on "applyOp", (doc_key, opData) ->
[project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key) [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
data = JSON.stringify ShareJsUpdateManager._sendOp(project_id, doc_id, opData)
project_id: project_id
doc_id: doc_id _sendOp: (project_id, doc_id, opData) ->
op: opData data =
rclient.publish "applied-ops", data project_id: project_id
doc_id: doc_id
op: opData
data = JSON.stringify data
rclient.publish "applied-ops", data
_sendError: (project_id, doc_id, error) -> _sendError: (project_id, doc_id, error) ->
data = JSON.stringify data = JSON.stringify