Tangle can be built from randomly ordered msgs

This commit is contained in:
Andre Staltz 2024-02-28 13:53:31 +02:00
parent c31580a961
commit cbeabab904
No known key found for this signature in database
GPG Key ID: 9EDE23EA7E8A4890
2 changed files with 58 additions and 1 deletions

View File

@ -93,6 +93,7 @@ class Tangle {
* @param {Msg} msg
*/
add(msgID, msg) {
// Add the root msg
if (msgID === this.#rootID && !this.#rootMsg) {
this.#tips.add(msgID)
this.#perDepth.set(0, [msgID])
@ -101,10 +102,20 @@ class Tangle {
return
}
// Add affix msg
const tangles = msg.metadata.tangles
if (msgID !== this.#rootID && tangles[this.#rootID]) {
if (this.#depth.has(msgID)) return
this.#tips.add(msgID)
let hasSuccessor = false
for (const prevs of this.#prev.values()) {
if (prevs.includes(msgID)) {
hasSuccessor = true
break
}
}
if (!hasSuccessor) {
this.#tips.add(msgID)
}
const prev = tangles[this.#rootID].prev
for (const p of prev) {
this.#tips.delete(p)

View File

@ -192,3 +192,49 @@ test('MsgV4.Tangle lipmaa in multi-author tangle', (t) => {
'A:msg4 points to A:msg1,B:msg3'
)
})
test('MsgV4.Tangle can add msgs in random order', (t) => {
const keypairA = Keypair.generate('ed25519', 'alice')
const accountA = MsgV4.getMsgID(
MsgV4.createAccount(keypairA, 'person', 'alice')
)
const mootA = MsgV4.createMoot(accountA, 'post', keypairA)
const mootAID = MsgV4.getMsgID(mootA)
const tangleBuilder = new MsgV4.Tangle(mootAID)
tangleBuilder.add(mootAID, mootA)
const msg1 = MsgV4.create({
account: accountA,
accountTips: [accountA],
domain: 'post',
data: { text: 'Hello world!' },
tangles: {
[mootAID]: tangleBuilder,
},
keypair: keypairA,
})
const msgID1 = MsgV4.getMsgID(msg1)
tangleBuilder.add(msgID1, msg1)
const msg2 = MsgV4.create({
account: accountA,
accountTips: [accountA],
domain: 'post',
data: { text: 'Hello world!' },
tangles: {
[mootAID]: tangleBuilder,
},
keypair: keypairA,
})
const msgID2 = MsgV4.getMsgID(msg2)
tangleBuilder.add(msgID1, msg1)
const tangle = new MsgV4.Tangle(mootAID)
tangle.add(mootAID, mootA)
tangle.add(msgID2, msg2)
tangle.add(msgID1, msg1)
assert.deepEqual(tangle.topoSort(), [mootAID, msgID1, msgID2]);
assert.deepEqual([...tangle.tips], [msgID2], 'tangle tips')
})