|
@@ -19,7 +19,7 @@ module.exports = ConcatManager =
|
|
|
for update in rawUpdates
|
|
for update in rawUpdates
|
|
|
lastCompressedUpdate = firstPass.pop()
|
|
lastCompressedUpdate = firstPass.pop()
|
|
|
if lastCompressedUpdate?
|
|
if lastCompressedUpdate?
|
|
|
- firstPass = firstPass.concat ConcatManager._concatTwoUpdatesOfTheSameType lastCompressedUpdate, update
|
|
|
|
|
|
|
+ firstPass = firstPass.concat ConcatManager._concatTwoUpdates lastCompressedUpdate, update, false
|
|
|
else
|
|
else
|
|
|
firstPass.push rawUpdate
|
|
firstPass.push rawUpdate
|
|
|
|
|
|
|
@@ -28,7 +28,7 @@ module.exports = ConcatManager =
|
|
|
for update in firstPass
|
|
for update in firstPass
|
|
|
lastCompressedUpdate = secondPass.pop()
|
|
lastCompressedUpdate = secondPass.pop()
|
|
|
if lastCompressedUpdate?
|
|
if lastCompressedUpdate?
|
|
|
- secondPass = secondPass.concat ConcatManager._cancelOppositeInsertsAndDeletes lastCompressedUpdate, update
|
|
|
|
|
|
|
+ secondPass = secondPass.concat ConcatManager._concatTwoUpdates lastCompressedUpdate, update, true
|
|
|
else
|
|
else
|
|
|
secondPass.push update
|
|
secondPass.push update
|
|
|
|
|
|
|
@@ -36,7 +36,7 @@ module.exports = ConcatManager =
|
|
|
|
|
|
|
|
MAX_TIME_BETWEEN_UPDATES: oneMinute = 60 * 1000
|
|
MAX_TIME_BETWEEN_UPDATES: oneMinute = 60 * 1000
|
|
|
|
|
|
|
|
- _concatTwoUpdatesOfTheSameType: (firstUpdate, secondUpdate) ->
|
|
|
|
|
|
|
+ _concatTwoUpdates: (firstUpdate, secondUpdate, mergeInsertsAndDeletes) ->
|
|
|
firstUpdate =
|
|
firstUpdate =
|
|
|
op: firstUpdate.op
|
|
op: firstUpdate.op
|
|
|
meta:
|
|
meta:
|
|
@@ -82,34 +82,8 @@ module.exports = ConcatManager =
|
|
|
d: strInject(secondOp.d, firstOp.p - secondOp.p, firstOp.d)
|
|
d: strInject(secondOp.d, firstOp.p - secondOp.p, firstOp.d)
|
|
|
]
|
|
]
|
|
|
]
|
|
]
|
|
|
- else
|
|
|
|
|
- return [firstUpdate, secondUpdate]
|
|
|
|
|
-
|
|
|
|
|
- _cancelOppositeInsertsAndDeletes: (firstUpdate, secondUpdate) ->
|
|
|
|
|
- firstUpdate =
|
|
|
|
|
- op: firstUpdate.op
|
|
|
|
|
- meta:
|
|
|
|
|
- user_id: firstUpdate.meta.user_id or null
|
|
|
|
|
- start_ts: firstUpdate.meta.start_ts or firstUpdate.meta.ts
|
|
|
|
|
- end_ts: firstUpdate.meta.end_ts or firstUpdate.meta.ts
|
|
|
|
|
- secondUpdate =
|
|
|
|
|
- op: secondUpdate.op
|
|
|
|
|
- meta:
|
|
|
|
|
- user_id: secondUpdate.meta.user_id or null
|
|
|
|
|
- start_ts: secondUpdate.meta.start_ts or secondUpdate.meta.ts
|
|
|
|
|
- end_ts: secondUpdate.meta.end_ts or secondUpdate.meta.ts
|
|
|
|
|
-
|
|
|
|
|
- if firstUpdate.meta.user_id != secondUpdate.meta.user_id
|
|
|
|
|
- return [firstUpdate, secondUpdate]
|
|
|
|
|
-
|
|
|
|
|
- if secondUpdate.meta.start_ts - firstUpdate.meta.end_ts > ConcatManager.MAX_TIME_BETWEEN_UPDATES
|
|
|
|
|
- return [firstUpdate, secondUpdate]
|
|
|
|
|
-
|
|
|
|
|
- firstOp = firstUpdate.op[0]
|
|
|
|
|
- secondOp = secondUpdate.op[0]
|
|
|
|
|
-
|
|
|
|
|
# An insert and then a delete
|
|
# An insert and then a delete
|
|
|
- if firstOp.i? and secondOp.d? and firstOp.p <= secondOp.p <= (firstOp.p + firstOp.i.length)
|
|
|
|
|
|
|
+ if mergeInsertsAndDeletes and firstOp.i? and secondOp.d? and firstOp.p <= secondOp.p <= (firstOp.p + firstOp.i.length)
|
|
|
offset = secondOp.p - firstOp.p
|
|
offset = secondOp.p - firstOp.p
|
|
|
insertedText = firstOp.i.slice(offset, offset + secondOp.d.length)
|
|
insertedText = firstOp.i.slice(offset, offset + secondOp.d.length)
|
|
|
if insertedText == secondOp.d
|
|
if insertedText == secondOp.d
|
|
@@ -128,7 +102,7 @@ module.exports = ConcatManager =
|
|
|
else
|
|
else
|
|
|
# This shouldn't be possible!
|
|
# This shouldn't be possible!
|
|
|
return [firstUpdate, secondUpdate]
|
|
return [firstUpdate, secondUpdate]
|
|
|
- else if firstOp.d? and secondOp.i? and firstOp.p == secondOp.p
|
|
|
|
|
|
|
+ else if mergeInsertsAndDeletes and firstOp.d? and secondOp.i? and firstOp.p == secondOp.p
|
|
|
offset = firstOp.d.indexOf(secondOp.i)
|
|
offset = firstOp.d.indexOf(secondOp.i)
|
|
|
if offset == -1
|
|
if offset == -1
|
|
|
return [firstUpdate, secondUpdate]
|
|
return [firstUpdate, secondUpdate]
|