Skip to content

Commit a100ecf

Browse files
committed
fix: block presences deserialization
1 parent 47084e0 commit a100ecf

File tree

3 files changed

+113
-20
lines changed

3 files changed

+113
-20
lines changed

src/types/message/index.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ class BitswapMessage {
2929
if (wantType == null) {
3030
wantType = BitswapMessage.WantType.Block
3131
}
32-
const cidStr = cid.toString('base58btc')
3332

33+
const cidStr = cid.toString('base58btc')
3434
const entry = this.wantlist.get(cidStr)
35-
3635
if (entry) {
3736
// Only change priority if want is of the same type
3837
if (entry.wantType === wantType) {
@@ -121,10 +120,13 @@ class BitswapMessage {
121120
return {
122121
block: entry.cid.buffer, // cid
123122
priority: Number(entry.priority),
124-
cancel: Boolean(entry.cancel)
123+
wantType: entry.wantType,
124+
cancel: Boolean(entry.cancel),
125+
sendDontHave: Boolean(entry.sendDontHave)
125126
}
126127
})
127128
},
129+
blockPresences: [],
128130
payload: []
129131
}
130132

@@ -187,6 +189,17 @@ BitswapMessage.deserialize = async (raw) => {
187189
})
188190
}
189191

192+
if (decoded.blockPresences) {
193+
decoded.blockPresences.forEach((blockPresence) => {
194+
const cid = new CID(blockPresence.cid)
195+
if (blockPresence.type === BitswapMessage.BlockPresenceType.Have) {
196+
msg.addHave(cid)
197+
} else {
198+
msg.addDontHave(cid)
199+
}
200+
})
201+
}
202+
190203
// Bitswap 1.0.0
191204
// decoded.blocks are just the byte arrays
192205
if (decoded.blocks.length > 0) {

test/types/message.spec.js

Lines changed: 94 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,72 @@ describe('BitswapMessage', () => {
2222
let cids
2323

2424
before(async () => {
25-
blocks = await makeBlock(3)
25+
blocks = await makeBlock(4)
2626
cids = blocks.map((b) => b.cid)
2727
})
2828

29-
it('.addEntry - want block', () => {
30-
const cid = cids[1]
31-
const msg = new BitswapMessage(true)
32-
msg.addEntry(cid, 1)
33-
const serialized = msg.serializeToBitswap100()
29+
describe('.addEntry', () => {
30+
it('want type defaults to want block', () => {
31+
const cid = cids[1]
32+
const msg = new BitswapMessage(true)
33+
msg.addEntry(cid, 1)
34+
const serialized = msg.serializeToBitswap100()
35+
36+
expect(pbm.Message.decode(serialized).wantlist.entries[0]).to.be.eql({
37+
block: cid.buffer,
38+
priority: 1,
39+
cancel: false,
40+
sendDontHave: false,
41+
wantType: pbm.Message.Wantlist.WantType.Block
42+
})
43+
})
44+
45+
it('updates priority only if same want type', () => {
46+
const msg = new BitswapMessage(true)
47+
48+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Block, false, false)
49+
50+
msg.addEntry(cids[0], 2, BitswapMessage.WantType.Have, true, false)
51+
expect(msg.wantlist.get(cids[0].toString('base58btc')).priority).to.eql(1)
3452

35-
expect(pbm.Message.decode(serialized).wantlist.entries[0]).to.be.eql({
36-
block: cid.buffer,
37-
priority: 1,
38-
cancel: false,
39-
sendDontHave: false,
40-
wantType: pbm.Message.Wantlist.WantType.Block
53+
msg.addEntry(cids[0], 2, BitswapMessage.WantType.Block, true, false)
54+
expect(msg.wantlist.get(cids[0].toString('base58btc')).priority).to.eql(2)
55+
})
56+
57+
it('only changes from dont cancel to do cancel', () => {
58+
const msg = new BitswapMessage(true)
59+
60+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Block, true, false)
61+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Block, false, false)
62+
expect(msg.wantlist.get(cids[0].toString('base58btc')).cancel).to.eql(true)
63+
64+
msg.addEntry(cids[1], 1, BitswapMessage.WantType.Block, false, false)
65+
msg.addEntry(cids[1], 1, BitswapMessage.WantType.Block, true, false)
66+
expect(msg.wantlist.get(cids[1].toString('base58btc')).cancel).to.eql(true)
67+
})
68+
69+
it('only changes from dont send to do send DONT_HAVE', () => {
70+
const msg = new BitswapMessage(true)
71+
72+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Block, false, false)
73+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Block, false, true)
74+
expect(msg.wantlist.get(cids[0].toString('base58btc')).sendDontHave).to.eql(true)
75+
76+
msg.addEntry(cids[1], 1, BitswapMessage.WantType.Block, false, true)
77+
msg.addEntry(cids[1], 1, BitswapMessage.WantType.Block, false, false)
78+
expect(msg.wantlist.get(cids[1].toString('base58btc')).sendDontHave).to.eql(true)
79+
})
80+
81+
it('only override want-have with want-block (not vice versa)', () => {
82+
const msg = new BitswapMessage(true)
83+
84+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Block, false, false)
85+
msg.addEntry(cids[0], 1, BitswapMessage.WantType.Have, false, false)
86+
expect(msg.wantlist.get(cids[0].toString('base58btc')).wantType).to.eql(BitswapMessage.WantType.Block)
87+
88+
msg.addEntry(cids[1], 1, BitswapMessage.WantType.Have, false, false)
89+
msg.addEntry(cids[1], 1, BitswapMessage.WantType.Block, false, false)
90+
expect(msg.wantlist.get(cids[1].toString('base58btc')).wantType).to.eql(BitswapMessage.WantType.Block)
4191
})
4292
})
4393

@@ -54,12 +104,27 @@ describe('BitswapMessage', () => {
54104
const msg = new BitswapMessage(true)
55105
msg.addBlock(block)
56106
msg.setPendingBytes(10)
107+
msg.addEntry(cids[0], 10, BitswapMessage.WantType.Have, false, true)
108+
msg.addHave(cids[1])
109+
msg.addDontHave(cids[2])
57110

58111
const serialized = msg.serializeToBitswap110()
59112
const decoded = pbm.Message.decode(serialized)
60-
61113
expect(decoded.payload[0].data).to.eql(block.data)
62114
expect(decoded.pendingBytes).to.eql(10)
115+
expect(decoded.wantlist.entries.length).to.eql(1)
116+
expect(decoded.wantlist.entries[0].priority).to.eql(10)
117+
expect(decoded.wantlist.entries[0].wantType).to.eql(BitswapMessage.WantType.Have)
118+
expect(decoded.wantlist.entries[0].cancel).to.eql(false)
119+
expect(decoded.wantlist.entries[0].sendDontHave).to.eql(true)
120+
expect(decoded.blockPresences.length).to.eql(2)
121+
for (const bp of decoded.blockPresences) {
122+
if (bp.type === BitswapMessage.BlockPresenceType.Have) {
123+
expect(bp.cid.equals(cids[1].buffer)).to.eql(true)
124+
} else {
125+
expect(bp.cid.equals(cids[2].buffer)).to.eql(true)
126+
}
127+
}
63128
})
64129

65130
it('.deserialize a Bitswap100 Message', async () => {
@@ -104,6 +169,7 @@ describe('BitswapMessage', () => {
104169
const cid0 = cids[0]
105170
const cid1 = cids[1]
106171
const cid2 = cids[2]
172+
const cid3 = cids[3]
107173

108174
const b1 = blocks[1]
109175
const b2 = blocks[2]
@@ -112,7 +178,9 @@ describe('BitswapMessage', () => {
112178
wantlist: {
113179
entries: [{
114180
block: cid0.buffer,
115-
cancel: false
181+
cancel: false,
182+
wantType: BitswapMessage.WantType.Block,
183+
sendDontHave: true
116184
}],
117185
full: true
118186
},
@@ -123,6 +191,10 @@ describe('BitswapMessage', () => {
123191
data: b2.data,
124192
prefix: cid2.prefix
125193
}],
194+
blockPresences: [{
195+
cid: cid3.buffer,
196+
type: BitswapMessage.BlockPresenceType.Have
197+
}],
126198
pendingBytes: 10
127199
})
128200

@@ -131,7 +203,7 @@ describe('BitswapMessage', () => {
131203
expect(Array.from(msg.wantlist))
132204
.to.eql([[
133205
cid0.toString('base58btc'),
134-
new BitswapMessage.Entry(cid0, 0, BitswapMessage.WantType.Block, false)
206+
new BitswapMessage.Entry(cid0, 0, BitswapMessage.WantType.Block, false, true)
135207
]])
136208

137209
expect(
@@ -140,6 +212,13 @@ describe('BitswapMessage', () => {
140212
[cid1.toString('base58btc'), b1.data],
141213
[cid2.toString('base58btc'), b2.data]
142214
])
215+
216+
expect(Array.from(msg.blockPresences))
217+
.to.eql([[
218+
cid3.toString('base58btc'),
219+
BitswapMessage.BlockPresenceType.Have
220+
]])
221+
143222
expect(msg.pendingBytes).to.equal(10)
144223
})
145224

test/types/wantlist.spec.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const CID = require('cids')
88
const multihashing = require('multihashing-async')
99

1010
const Wantlist = require('../../src/types/wantlist')
11+
const Message = require('../../src/types/message')
1112
const makeBlock = require('../utils/make-block')
1213

1314
describe('Wantlist', () => {
@@ -76,12 +77,12 @@ describe('Wantlist', () => {
7677
it('entries', () => {
7778
const b = blocks[0]
7879

79-
wm.add(b.cid, 2)
80+
wm.add(b.cid, 2, Message.WantType.Have)
8081
expect(
8182
Array.from(wm.entries())
8283
).to.be.eql([[
8384
b.cid.toString('base58btc'),
84-
new Wantlist.Entry(b.cid, 2)
85+
new Wantlist.Entry(b.cid, 2, Message.WantType.Have)
8586
]])
8687
})
8788

0 commit comments

Comments
 (0)