protected open fun receiveChange()

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)
    }