Tangle.precedes(a,b) API

This commit is contained in:
Andre Staltz 2023-04-27 15:51:31 +03:00
parent ba0a78b277
commit 65622ac961
No known key found for this signature in database
GPG Key ID: 9EDE23EA7E8A4890
3 changed files with 40 additions and 0 deletions

View File

@ -222,6 +222,23 @@ class Tangle {
return path return path
} }
precedes(a, b) {
if (!this.#rootMsg) {
console.warn('Tangle is missing root message')
return false
}
if (a === b) return false
if (b === this.#rootHash) return false
let toCheck = [b]
while (toCheck.length > 0) {
const prev = this.#prev.get(toCheck.shift())
if (!prev) continue
if (prev.includes(a)) return true
toCheck.push(...prev)
}
return false
}
size() { size() {
return this.#depth.size return this.#depth.size
} }

View File

@ -191,6 +191,7 @@ exports.init = function initDB(peer, config) {
const msgHash = FeedV1.getMsgHash(msg) const msgHash = FeedV1.getMsgHash(msg)
// TODO: optimize this. Perhaps have a Map() of msgHash -> record // TODO: optimize this. Perhaps have a Map() of msgHash -> record
// Or even better, a bloom filter. If you just want to answer no/perhaps.
let rec let rec
if ((rec = getRecord(msgHash))) return cb(null, rec) if ((rec = getRecord(msgHash))) return cb(null, rec)

View File

@ -125,6 +125,28 @@ test('Tangle.topoSort', (t) => {
t.end() t.end()
}) })
test('Tangle.precedes', (t) => {
t.true(tangle.precedes(rootPost, reply1Lo), 'rootPost precedes reply1Lo')
t.true(tangle.precedes(rootPost, reply1Hi), 'rootPost precedes reply1Hi')
t.false(
tangle.precedes(reply1Hi, rootPost),
'reply1Hi doesnt precede rootPost'
)
t.false(
tangle.precedes(reply1Lo, reply1Hi),
'reply1Lo doesnt precede reply1Hi'
)
t.false(tangle.precedes(reply1Lo, reply1Lo), 'reply1Lo doesnt precede itself')
t.true(tangle.precedes(reply1Lo, reply3Hi), 'reply1Lo precedes reply3Hi')
t.true(tangle.precedes(reply1Hi, reply2A), 'reply1Hi precedes reply2A')
t.false(
tangle.precedes(reply3Lo, reply1Hi),
'reply3Lo doesnt precede reply1Hi'
)
t.end()
})
test('Tangle.getTips', (t) => { test('Tangle.getTips', (t) => {
const tips = tangle.getTips() const tips = tangle.getTips()