in backend/sync.js [246:306]
function getChangesToSend(backend, have, need) {
if (have.length === 0) {
return need.map(hash => Backend.getChangeByHash(backend, hash)).filter(change => change !== undefined)
}
let lastSyncHashes = {}, bloomFilters = []
for (let h of have) {
for (let hash of h.lastSync) lastSyncHashes[hash] = true
bloomFilters.push(new BloomFilter(h.bloom))
}
// Get all changes that were added since the last sync
const changes = Backend.getChanges(backend, Object.keys(lastSyncHashes))
.map(change => decodeChangeMeta(change, true))
let changeHashes = {}, dependents = {}, hashesToSend = {}
for (let change of changes) {
changeHashes[change.hash] = true
// For each change, make a list of changes that depend on it
for (let dep of change.deps) {
if (!dependents[dep]) dependents[dep] = []
dependents[dep].push(change.hash)
}
// Exclude any change hashes contained in one or more Bloom filters
if (bloomFilters.every(bloom => !bloom.containsHash(change.hash))) {
hashesToSend[change.hash] = true
}
}
// Include any changes that depend on a Bloom-negative change
let stack = Object.keys(hashesToSend)
while (stack.length > 0) {
const hash = stack.pop()
if (dependents[hash]) {
for (let dep of dependents[hash]) {
if (!hashesToSend[dep]) {
hashesToSend[dep] = true
stack.push(dep)
}
}
}
}
// Include any explicitly requested changes
let changesToSend = []
for (let hash of need) {
hashesToSend[hash] = true
if (!changeHashes[hash]) { // Change is not among those returned by getMissingChanges()?
const change = Backend.getChangeByHash(backend, hash)
if (change) changesToSend.push(change)
}
}
// Return changes in the order they were returned by getMissingChanges()
for (let change of changes) {
if (hashesToSend[change.hash]) changesToSend.push(change.change)
}
return changesToSend
}