for {
    select {
        ... 
        case rd := <-rc.node.Ready():
            rc.wal.Save(rd.HardState, rd.Entries) # 1
            if !raft.IsEmptySnap(rd.Snapshot) {
                // loop where we're trying to get a snapshot
                for {
                    if err := rc.downloadSnapshotFromSideChannel(rd.Snapshot); err == nil { # 2
                        break
                    }
                }
                rc.saveSnap(rd.Snapshot) # 3
                rc.raftStorage.ApplySnapshot(rd.Snapshot)
                rc.publishSnapshot(rd.Snapshot)
            }
            rc.raftStorage.Append(rd.Entries)
            rc.transport.Send(rd.Messages)
            if ok := rc.publishEntries(rc.entriesToApply(rd.CommittedEntries)); !ok {
                rc.stop()
                return
            }
            rc.maybeTriggerSnapshot()
            rc.node.Advance()
    }
}