in rd-kt/rd-text/src/main/kotlin/com/jetbrains/rd/rdtext/impl/RdTextBuffer.kt [72:121]
protected open fun receiveChange(textBufferChange: RdTextBufferChange) {
val newVersion = textBufferChange.version
val remoteOrigin = textBufferChange.origin
val change = textBufferChange.change
require(remoteOrigin != localOrigin)
val activeSession = activeTypingSession
if (activeSession != null && activeSession.tryPushRemoteChange(textBufferChange)) {
return
}
if (change.kind == RdTextChangeKind.Reset) {
changesToConfirmOrRollback.clear()
} else if (change.kind == RdTextChangeKind.PromoteVersion) {
require(!isMaster) { "!IsMaster" }
changesToConfirmOrRollback.clear()
bufferVersion = newVersion
_historyChanged.fire(change)
return
} else {
if (isMaster) {
if (newVersion.master != bufferVersion.master) {
logReceived.warn { "Rejecting the change '$change'" }
// reject the change. we've already sent overriding change
return
}
} else {
if (newVersion.slave != bufferVersion.slave) {
// rollback the changes and notify external subscribers
for (ch in changesToConfirmOrRollback.reversed()) {
if (ch.version.slave <= newVersion.slave)
break
val reversedChange = ch.change.reverse()
_historyChanged.fire(reversedChange)
textChanged.set(reversedChange)
}
changesToConfirmOrRollback.clear()
} else {
// confirm the changes queue
changesToConfirmOrRollback.clear()
}
}
}
// apply
bufferVersion = newVersion
_historyChanged.fire(change)
if (activeSession == null || !activeSession.isCommitting)
textChanged.set(change)
}