mirror of https://codeberg.org/pzp/pzp-db.git
Tangle can be built from randomly ordered msgs
This commit is contained in:
parent
c31580a961
commit
cbeabab904
|
@ -93,6 +93,7 @@ class Tangle {
|
||||||
* @param {Msg} msg
|
* @param {Msg} msg
|
||||||
*/
|
*/
|
||||||
add(msgID, msg) {
|
add(msgID, msg) {
|
||||||
|
// Add the root msg
|
||||||
if (msgID === this.#rootID && !this.#rootMsg) {
|
if (msgID === this.#rootID && !this.#rootMsg) {
|
||||||
this.#tips.add(msgID)
|
this.#tips.add(msgID)
|
||||||
this.#perDepth.set(0, [msgID])
|
this.#perDepth.set(0, [msgID])
|
||||||
|
@ -101,10 +102,20 @@ class Tangle {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add affix msg
|
||||||
const tangles = msg.metadata.tangles
|
const tangles = msg.metadata.tangles
|
||||||
if (msgID !== this.#rootID && tangles[this.#rootID]) {
|
if (msgID !== this.#rootID && tangles[this.#rootID]) {
|
||||||
if (this.#depth.has(msgID)) return
|
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
|
const prev = tangles[this.#rootID].prev
|
||||||
for (const p of prev) {
|
for (const p of prev) {
|
||||||
this.#tips.delete(p)
|
this.#tips.delete(p)
|
||||||
|
|
|
@ -192,3 +192,49 @@ test('MsgV4.Tangle lipmaa in multi-author tangle', (t) => {
|
||||||
'A:msg4 points to A:msg1,B:msg3'
|
'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')
|
||||||
|
})
|
Loading…
Reference in New Issue