From 65622ac96110927b42053f34511aa42d068f17d6 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Thu, 27 Apr 2023 15:51:31 +0300 Subject: [PATCH] Tangle.precedes(a,b) API --- lib/feed-v1/tangle.js | 17 +++++++++++++++++ lib/index.js | 1 + test/getTangle.test.js | 22 ++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/lib/feed-v1/tangle.js b/lib/feed-v1/tangle.js index 9e7f1e4..5c48023 100644 --- a/lib/feed-v1/tangle.js +++ b/lib/feed-v1/tangle.js @@ -222,6 +222,23 @@ class Tangle { 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() { return this.#depth.size } diff --git a/lib/index.js b/lib/index.js index 9f21b38..b7e25d3 100644 --- a/lib/index.js +++ b/lib/index.js @@ -191,6 +191,7 @@ exports.init = function initDB(peer, config) { const msgHash = FeedV1.getMsgHash(msg) // 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 if ((rec = getRecord(msgHash))) return cb(null, rec) diff --git a/test/getTangle.test.js b/test/getTangle.test.js index d33cde7..507dd6c 100644 --- a/test/getTangle.test.js +++ b/test/getTangle.test.js @@ -125,6 +125,28 @@ test('Tangle.topoSort', (t) => { 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) => { const tips = tangle.getTips()