@helia/bitswap 1.0.1 → 1.1.0-9fa2427
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/src/network.d.ts +5 -3
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +8 -18
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-want-lists/index.d.ts +2 -1
- package/dist/src/peer-want-lists/index.d.ts.map +1 -1
- package/dist/src/peer-want-lists/index.js +1 -1
- package/dist/src/peer-want-lists/index.js.map +1 -1
- package/dist/src/peer-want-lists/ledger.d.ts.map +1 -1
- package/dist/src/peer-want-lists/ledger.js +41 -40
- package/dist/src/peer-want-lists/ledger.js.map +1 -1
- package/dist/src/stats.d.ts +2 -1
- package/dist/src/stats.d.ts.map +1 -1
- package/dist/src/stats.js +4 -4
- package/dist/src/stats.js.map +1 -1
- package/dist/src/utils/bitswap-message.d.ts +19 -0
- package/dist/src/utils/bitswap-message.d.ts.map +1 -0
- package/dist/src/utils/bitswap-message.js +33 -0
- package/dist/src/utils/bitswap-message.js.map +1 -0
- package/dist/src/utils/merge-messages.d.ts +2 -2
- package/dist/src/utils/merge-messages.d.ts.map +1 -1
- package/dist/src/utils/merge-messages.js +12 -34
- package/dist/src/utils/merge-messages.js.map +1 -1
- package/dist/src/utils/split-message.d.ts +2 -2
- package/dist/src/utils/split-message.d.ts.map +1 -1
- package/dist/src/utils/split-message.js +5 -5
- package/dist/src/utils/split-message.js.map +1 -1
- package/dist/src/want-list.d.ts +2 -1
- package/dist/src/want-list.d.ts.map +1 -1
- package/dist/src/want-list.js +51 -67
- package/dist/src/want-list.js.map +1 -1
- package/package.json +4 -5
- package/src/network.ts +12 -21
- package/src/peer-want-lists/index.ts +3 -2
- package/src/peer-want-lists/ledger.ts +40 -42
- package/src/stats.ts +6 -5
- package/src/utils/bitswap-message.ts +39 -0
- package/src/utils/merge-messages.ts +12 -45
- package/src/utils/split-message.ts +6 -5
- package/src/want-list.ts +59 -80
- package/dist/typedoc-urls.json +0 -20
package/dist/src/want-list.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
|
|
2
2
|
import { trackedPeerMap } from '@libp2p/peer-collections';
|
|
3
3
|
import { trackedMap } from '@libp2p/utils/tracked-map';
|
|
4
|
-
import all from 'it-all';
|
|
5
|
-
import filter from 'it-filter';
|
|
6
|
-
import map from 'it-map';
|
|
7
|
-
import { pipe } from 'it-pipe';
|
|
8
4
|
import { CID } from 'multiformats/cid';
|
|
9
5
|
import { sha256 } from 'multiformats/hashes/sha2';
|
|
10
6
|
import pDefer from 'p-defer';
|
|
@@ -13,6 +9,7 @@ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
|
13
9
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
14
10
|
import { DEFAULT_MESSAGE_SEND_DELAY } from './constants.js';
|
|
15
11
|
import { BlockPresenceType, WantType } from './pb/message.js';
|
|
12
|
+
import { QueuedBitswapMessage } from './utils/bitswap-message.js';
|
|
16
13
|
import vd from './utils/varint-decoder.js';
|
|
17
14
|
export class WantList extends TypedEventEmitter {
|
|
18
15
|
/**
|
|
@@ -31,11 +28,11 @@ export class WantList extends TypedEventEmitter {
|
|
|
31
28
|
setMaxListeners(Infinity, this);
|
|
32
29
|
this.peers = trackedPeerMap({
|
|
33
30
|
name: 'helia_bitswap_peers',
|
|
34
|
-
metrics: components.
|
|
31
|
+
metrics: components.metrics
|
|
35
32
|
});
|
|
36
33
|
this.wants = trackedMap({
|
|
37
34
|
name: 'helia_bitswap_wantlist',
|
|
38
|
-
metrics: components.
|
|
35
|
+
metrics: components.metrics
|
|
39
36
|
});
|
|
40
37
|
this.network = components.network;
|
|
41
38
|
this.sendMessagesDelay = init.sendMessagesDelay ?? DEFAULT_MESSAGE_SEND_DELAY;
|
|
@@ -119,30 +116,24 @@ export class WantList extends TypedEventEmitter {
|
|
|
119
116
|
this.sendingMessages = pDefer();
|
|
120
117
|
await Promise.all([...this.peers.entries()].map(async ([peerId, sentWants]) => {
|
|
121
118
|
const sent = new Set();
|
|
122
|
-
const message =
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return sentPreviously;
|
|
130
|
-
}
|
|
131
|
-
// only send if we've not sent it to them before
|
|
132
|
-
return !sentPreviously;
|
|
133
|
-
}), (source) => map(source, ([key, entry]) => {
|
|
134
|
-
sent.add(key);
|
|
135
|
-
return {
|
|
136
|
-
cid: entry.cid.bytes,
|
|
137
|
-
priority: entry.priority,
|
|
138
|
-
wantType: entry.wantType,
|
|
139
|
-
cancel: entry.cancel,
|
|
140
|
-
sendDontHave: entry.sendDontHave
|
|
141
|
-
};
|
|
142
|
-
}), (source) => all(source))
|
|
119
|
+
const message = new QueuedBitswapMessage();
|
|
120
|
+
for (const [key, entry] of this.wants.entries()) {
|
|
121
|
+
const sentPreviously = sentWants.has(key);
|
|
122
|
+
// only send if either we've not sent it before, or we haven't sent it
|
|
123
|
+
// but we're also cancelling the want.
|
|
124
|
+
if (sentPreviously || entry.cancel) {
|
|
125
|
+
continue;
|
|
143
126
|
}
|
|
144
|
-
|
|
145
|
-
|
|
127
|
+
sent.add(key);
|
|
128
|
+
message.addWantlistEntry(entry.cid, {
|
|
129
|
+
cid: entry.cid.bytes,
|
|
130
|
+
priority: entry.priority,
|
|
131
|
+
wantType: entry.wantType,
|
|
132
|
+
cancel: entry.cancel,
|
|
133
|
+
sendDontHave: entry.sendDontHave
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (message.wantlist.size === 0) {
|
|
146
137
|
return;
|
|
147
138
|
}
|
|
148
139
|
// add message to send queue
|
|
@@ -179,18 +170,15 @@ export class WantList extends TypedEventEmitter {
|
|
|
179
170
|
* Add a CID to the wantlist
|
|
180
171
|
*/
|
|
181
172
|
async wantSessionPresence(cid, peerId, options = {}) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
sendDontHave: true,
|
|
189
|
-
wantType: WantType.WantHave,
|
|
190
|
-
priority: 1
|
|
191
|
-
}]
|
|
192
|
-
}
|
|
173
|
+
const message = new QueuedBitswapMessage();
|
|
174
|
+
message.addWantlistEntry(cid, {
|
|
175
|
+
cid: cid.bytes,
|
|
176
|
+
sendDontHave: true,
|
|
177
|
+
wantType: WantType.WantHave,
|
|
178
|
+
priority: 1
|
|
193
179
|
});
|
|
180
|
+
// sending WantHave directly to peer
|
|
181
|
+
await this.network.sendMessage(peerId, message);
|
|
194
182
|
// wait for peer response
|
|
195
183
|
const event = await raceEvent(this, 'presence', options.signal, {
|
|
196
184
|
filter: (event) => {
|
|
@@ -212,18 +200,15 @@ export class WantList extends TypedEventEmitter {
|
|
|
212
200
|
* Add a CID to the wantlist
|
|
213
201
|
*/
|
|
214
202
|
async wantSessionBlock(cid, peerId, options = {}) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
sendDontHave: true,
|
|
222
|
-
wantType: WantType.WantBlock,
|
|
223
|
-
priority: 1
|
|
224
|
-
}]
|
|
225
|
-
}
|
|
203
|
+
const message = new QueuedBitswapMessage();
|
|
204
|
+
message.addWantlistEntry(cid, {
|
|
205
|
+
cid: cid.bytes,
|
|
206
|
+
sendDontHave: true,
|
|
207
|
+
wantType: WantType.WantBlock,
|
|
208
|
+
priority: 1
|
|
226
209
|
});
|
|
210
|
+
// sending WantBlockResult directly to peer
|
|
211
|
+
await this.network.sendMessage(peerId, message);
|
|
227
212
|
// wait for peer response
|
|
228
213
|
const event = await raceEvent(this, 'presence', options.signal, {
|
|
229
214
|
filter: (event) => {
|
|
@@ -248,7 +233,7 @@ export class WantList extends TypedEventEmitter {
|
|
|
248
233
|
* Invoked when a message is received from a bitswap peer
|
|
249
234
|
*/
|
|
250
235
|
async receiveMessage(sender, message) {
|
|
251
|
-
this.log('received message
|
|
236
|
+
this.log('received message from %p with %d blocks', sender, message.blocks.length);
|
|
252
237
|
let blocksCancelled = false;
|
|
253
238
|
// process blocks
|
|
254
239
|
for (const block of message.blocks) {
|
|
@@ -318,24 +303,23 @@ export class WantList extends TypedEventEmitter {
|
|
|
318
303
|
*/
|
|
319
304
|
async peerConnected(peerId) {
|
|
320
305
|
const sentWants = new Set();
|
|
306
|
+
const message = new QueuedBitswapMessage(true);
|
|
321
307
|
// new peer, give them the full wantlist
|
|
322
|
-
const
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
entries: pipe(this.wants.entries(), (source) => filter(source, ([key, entry]) => !entry.cancel), (source) => map(source, ([key, entry]) => {
|
|
326
|
-
sentWants.add(key);
|
|
327
|
-
return {
|
|
328
|
-
cid: entry.cid.bytes,
|
|
329
|
-
priority: 1,
|
|
330
|
-
wantType: WantType.WantBlock,
|
|
331
|
-
cancel: false,
|
|
332
|
-
sendDontHave: false
|
|
333
|
-
};
|
|
334
|
-
}), (source) => all(source))
|
|
308
|
+
for (const [key, entry] of this.wants.entries()) {
|
|
309
|
+
if (entry.cancel) {
|
|
310
|
+
continue;
|
|
335
311
|
}
|
|
336
|
-
|
|
312
|
+
sentWants.add(key);
|
|
313
|
+
message.addWantlistEntry(entry.cid, {
|
|
314
|
+
cid: entry.cid.bytes,
|
|
315
|
+
priority: 1,
|
|
316
|
+
wantType: WantType.WantBlock,
|
|
317
|
+
cancel: false,
|
|
318
|
+
sendDontHave: false
|
|
319
|
+
});
|
|
320
|
+
}
|
|
337
321
|
// only send the wantlist if we have something to send
|
|
338
|
-
if (message.wantlist
|
|
322
|
+
if (message.wantlist.size === 0) {
|
|
339
323
|
this.peers.set(peerId, sentWants);
|
|
340
324
|
return;
|
|
341
325
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"want-list.js","sourceRoot":"","sources":["../../src/want-list.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"want-list.js","sourceRoot":"","sources":["../../src/want-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAmF1C,MAAM,OAAO,QAAS,SAAQ,iBAAiC;IAC7D;;OAEG;IACa,KAAK,CAAsB;IAC3B,KAAK,CAA4B;IAChC,OAAO,CAAS;IAChB,GAAG,CAAQ;IACX,iBAAiB,CAAQ;IAClC,mBAAmB,CAAgC;IAC1C,UAAU,CAAwB;IAC3C,eAAe,CAAwB;IAE/C,YAAa,UAA8B,EAAE,OAAqB,EAAE;QAClE,KAAK,EAAE,CAAA;QAEP,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC;YAC1B,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;QACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,0BAA0B,CAAA;QAC7E,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAA;QACnE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAEjC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE;YACvD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;iBACrD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACjF,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE;YACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;iBAC3B,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACrF,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE;YACvD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC;IAIO,KAAK,CAAC,QAAQ,CAAE,GAAQ,EAAE,OAA6C;QAC7E,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAChE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAElC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,KAAK,GAAG;gBACN,GAAG;gBACH,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;gBAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS;gBAChD,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,IAAI;aACnB,CAAA;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC/B,CAAC;QAED,yEAAyE;QACzE,+BAA+B;QAC/B,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpF,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAA;QACrC,CAAC;QAED,oBAAoB;QACpB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAElC,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,MAAM,SAAS,CAA+B,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;oBAC1F,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;wBAChB,OAAO,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;oBAClF,CAAC;oBACD,YAAY,EAAE,kBAAkB;iBACjC,CAAC,CAAA;gBAEF,OAAO,KAAK,CAAC,MAAM,CAAA;YACrB,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAkC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE;gBAChG,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,OAAO,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;gBAClF,CAAC;gBACD,YAAY,EAAE,kBAAkB;aACjC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAC,MAAM,CAAA;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,GAAG,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAA;gBACzD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;gBACnB,oBAAoB;gBACpB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,MAAM,IAAI,CAAC,eAAe,EAAE,OAAO,CAAA;QAEnC,oBAAoB;QACpB,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QACtC,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,KAAK,IAAI,CAAC,YAAY,EAAE;iBACrB,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAA;YAClD,CAAC,CAAC,CAAA;QACN,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC5B,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,eAAe,GAAG,MAAM,EAAE,CAAA;QAE/B,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE;YAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;YAC9B,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAA;YAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAEzC,sEAAsE;gBACtE,sCAAsC;gBACtC,IAAI,cAAc,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACnC,SAAQ;gBACV,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAEb,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE;oBAClC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;oBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAM;YACR,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAE/C,yCAAyC;gBACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAA;YAChE,CAAC;QACH,CAAC,CAAC,CACH,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,0EAA0E;QAC1E,QAAQ;QACR,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAEtB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC5C,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAA;IAChC,CAAC;IAED,GAAG,CAAE,GAAQ;QACX,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAChE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAE,GAAQ,EAAE,MAAc,EAAE,UAAuB,EAAE;QAC5E,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAC1C,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE;YAC5B,GAAG,EAAE,GAAG,CAAC,KAAK;YACd,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAA;QAEF,oCAAoC;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAE/C,yBAAyB;QACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAmD,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;YAChH,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACxH,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,MAAM,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAE,GAAQ,EAAE,UAAuB,EAAE;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACxB,GAAG,OAAO;YACV,QAAQ,EAAE,QAAQ,CAAC,SAAS;SAC7B,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAE,GAAQ,EAAE,MAAc,EAAE,UAAuB,EAAE;QACzE,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAC1C,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE;YAC5B,GAAG,EAAE,GAAG,CAAC,KAAK;YACd,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,QAAQ,CAAC,SAAS;YAC5B,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAA;QAEF,2CAA2C;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAE/C,yBAAyB;QACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAkC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;YAC/F,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACxH,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,MAAM,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAE,GAAQ,EAAE,OAAoE;QACjG,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEpC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAM;QACR,CAAC;QAED,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;QAEnB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;IACpC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAE,MAAc,EAAE,OAAuB;QACnE,IAAI,CAAC,GAAG,CAAC,yCAAyC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAClF,IAAI,eAAe,GAAG,KAAK,CAAA;QAE3B,iBAAiB;QACjB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;gBAC/C,SAAQ;YACV,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACzB,kEAAkE;YAElE,MAAM,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;YAE3F,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAA;gBACjD,SAAQ;YACV,CAAC;YAED,IAAI,IAAI,GAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAEzC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;gBACtB,IAAI,GAAG,MAAM,IAAI,CAAA;YACnB,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;YAElE,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;YAEtD,IAAI,CAAC,iBAAiB,CAAkB,OAAO,EAAE;gBAC/C,MAAM,EAAE;oBACN,MAAM;oBACN,GAAG;oBACH,KAAK,EAAE,KAAK,CAAC,IAAI;iBAClB;aACF,CAAC,CAAA;YAEF,IAAI,CAAC,iBAAiB,CAAsC,UAAU,EAAE;gBACtE,MAAM,EAAE;oBACN,MAAM;oBACN,GAAG;oBACH,GAAG,EAAE,IAAI;oBACT,KAAK,EAAE,KAAK,CAAC,IAAI;iBAClB;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAEpC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,SAAQ;YACV,CAAC;YAED,uEAAuE;YACvE,uEAAuE;YACvE,8BAA8B;YAC9B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;YACnB,eAAe,GAAG,IAAI,CAAA;QACxB,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAEhC,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;YAEzD,IAAI,CAAC,iBAAiB,CAAsC,UAAU,EAAE;gBACtE,MAAM,EAAE;oBACN,MAAM;oBACN,GAAG;oBACH,GAAG,EAAE,IAAI,KAAK,iBAAiB,CAAC,SAAS;iBAC1C;aACF,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAE,MAAc;QACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;QACnC,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAE9C,wCAAwC;QACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,SAAQ;YACV,CAAC;YAED,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAElB,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE;gBAClC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACpB,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,QAAQ,CAAC,SAAS;gBAC5B,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,KAAK;aACpB,CAAC,CAAA;QACJ,CAAC;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAEjC,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAE/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4CAA4C,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAE,MAAc;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK;IAEL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAClB,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACxC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/bitswap",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0-9fa2427",
|
|
4
4
|
"description": "JavaScript implementation of the Bitswap data exchange protocol used by Helia",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/ipfs/helia/tree/main/packages/bitswap#readme",
|
|
@@ -148,8 +148,8 @@
|
|
|
148
148
|
"docs": "aegir docs"
|
|
149
149
|
},
|
|
150
150
|
"dependencies": {
|
|
151
|
-
"@helia/interface": "
|
|
152
|
-
"@helia/utils": "
|
|
151
|
+
"@helia/interface": "4.3.0-9fa2427",
|
|
152
|
+
"@helia/utils": "0.3.0-9fa2427",
|
|
153
153
|
"@libp2p/interface": "^1.1.2",
|
|
154
154
|
"@libp2p/logger": "^4.0.5",
|
|
155
155
|
"@libp2p/peer-collections": "^5.1.6",
|
|
@@ -158,9 +158,7 @@
|
|
|
158
158
|
"any-signal": "^4.1.1",
|
|
159
159
|
"interface-blockstore": "^5.2.9",
|
|
160
160
|
"interface-store": "^5.1.7",
|
|
161
|
-
"it-all": "^3.0.4",
|
|
162
161
|
"it-drain": "^3.0.5",
|
|
163
|
-
"it-filter": "^3.0.4",
|
|
164
162
|
"it-length-prefixed": "^9.0.0",
|
|
165
163
|
"it-length-prefixed-stream": "^1.1.6",
|
|
166
164
|
"it-map": "^3.0.5",
|
|
@@ -183,6 +181,7 @@
|
|
|
183
181
|
"aegir": "^42.2.2",
|
|
184
182
|
"blockstore-core": "^4.3.10",
|
|
185
183
|
"delay": "^6.0.0",
|
|
184
|
+
"it-all": "^3.0.4",
|
|
186
185
|
"it-pair": "^2.0.6",
|
|
187
186
|
"it-protobuf-stream": "^1.1.2",
|
|
188
187
|
"p-event": "^6.0.0",
|
package/src/network.ts
CHANGED
|
@@ -14,8 +14,9 @@ import { splitMessage } from './utils/split-message.js'
|
|
|
14
14
|
import type { WantOptions } from './bitswap.js'
|
|
15
15
|
import type { MultihashHasherLoader } from './index.js'
|
|
16
16
|
import type { Block } from './pb/message.js'
|
|
17
|
+
import type { QueuedBitswapMessage } from './utils/bitswap-message.js'
|
|
17
18
|
import type { Provider, Routing } from '@helia/interface/routing'
|
|
18
|
-
import type { Libp2p, AbortOptions, Connection, PeerId, IncomingStreamData, Topology, ComponentLogger, IdentifyResult, Counter } from '@libp2p/interface'
|
|
19
|
+
import type { Libp2p, AbortOptions, Connection, PeerId, IncomingStreamData, Topology, ComponentLogger, IdentifyResult, Counter, Metrics } from '@libp2p/interface'
|
|
19
20
|
import type { Logger } from '@libp2p/logger'
|
|
20
21
|
import type { CID } from 'multiformats/cid'
|
|
21
22
|
import type { ProgressEvent, ProgressOptions } from 'progress-events'
|
|
@@ -49,6 +50,7 @@ export interface NetworkComponents {
|
|
|
49
50
|
routing: Routing
|
|
50
51
|
logger: ComponentLogger
|
|
51
52
|
libp2p: Libp2p
|
|
53
|
+
metrics?: Metrics
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
export interface BitswapMessageEventDetail {
|
|
@@ -63,7 +65,7 @@ export interface NetworkEvents {
|
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
interface SendMessageJobOptions extends AbortOptions, ProgressOptions, PeerQueueJobOptions {
|
|
66
|
-
message:
|
|
68
|
+
message: QueuedBitswapMessage
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
export class Network extends TypedEventEmitter<NetworkEvents> {
|
|
@@ -101,13 +103,13 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
|
|
|
101
103
|
this.maxIncomingMessageSize = init.maxIncomingMessageSize ?? DEFAULT_MAX_OUTGOING_MESSAGE_SIZE
|
|
102
104
|
this.maxOutgoingMessageSize = init.maxOutgoingMessageSize ?? init.maxIncomingMessageSize ?? DEFAULT_MAX_INCOMING_MESSAGE_SIZE
|
|
103
105
|
this.metrics = {
|
|
104
|
-
blocksSent: components.
|
|
105
|
-
dataSent: components.
|
|
106
|
+
blocksSent: components.metrics?.registerCounter('helia_bitswap_sent_blocks_total'),
|
|
107
|
+
dataSent: components.metrics?.registerCounter('helia_bitswap_sent_data_bytes_total')
|
|
106
108
|
}
|
|
107
109
|
|
|
108
110
|
this.sendQueue = new PeerQueue({
|
|
109
111
|
concurrency: init.messageSendConcurrency ?? DEFAULT_MESSAGE_SEND_CONCURRENCY,
|
|
110
|
-
metrics: components.
|
|
112
|
+
metrics: components.metrics,
|
|
111
113
|
metricName: 'helia_bitswap_message_send_queue'
|
|
112
114
|
})
|
|
113
115
|
this.sendQueue.addEventListener('error', (evt) => {
|
|
@@ -186,9 +188,9 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
|
|
|
186
188
|
this.log('incoming new bitswap %s stream from %p', stream.protocol, connection.remotePeer)
|
|
187
189
|
const abortListener = (): void => {
|
|
188
190
|
if (stream.status === 'open') {
|
|
189
|
-
stream.abort(new CodeError(
|
|
191
|
+
stream.abort(new CodeError(`Incoming Bitswap stream timed out after ${this.messageReceiveTimeout}ms`, 'ERR_TIMEOUT'))
|
|
190
192
|
} else {
|
|
191
|
-
this.log('stream aborted with status', stream.status)
|
|
193
|
+
this.log('stream aborted with status %s', stream.status)
|
|
192
194
|
}
|
|
193
195
|
}
|
|
194
196
|
|
|
@@ -275,27 +277,16 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
|
|
|
275
277
|
* Connect to the given peer
|
|
276
278
|
* Send the given msg (instance of Message) to the given peer
|
|
277
279
|
*/
|
|
278
|
-
async sendMessage (peerId: PeerId,
|
|
280
|
+
async sendMessage (peerId: PeerId, message: QueuedBitswapMessage, options?: AbortOptions & ProgressOptions<BitswapNetworkWantProgressEvents>): Promise<void> {
|
|
279
281
|
if (!this.running) {
|
|
280
282
|
throw new Error('network isn\'t running')
|
|
281
283
|
}
|
|
282
284
|
|
|
283
|
-
const message: BitswapMessage = {
|
|
284
|
-
wantlist: {
|
|
285
|
-
full: msg.wantlist?.full ?? false,
|
|
286
|
-
entries: msg.wantlist?.entries ?? []
|
|
287
|
-
},
|
|
288
|
-
blocks: msg.blocks ?? [],
|
|
289
|
-
blockPresences: msg.blockPresences ?? [],
|
|
290
|
-
pendingBytes: msg.pendingBytes ?? 0
|
|
291
|
-
}
|
|
292
|
-
|
|
293
285
|
const existingJob = this.sendQueue.queue.find(job => {
|
|
294
286
|
return peerId.equals(job.options.peerId) && job.status === 'queued'
|
|
295
287
|
})
|
|
296
288
|
|
|
297
289
|
if (existingJob != null) {
|
|
298
|
-
// merge messages instead of adding new job
|
|
299
290
|
existingJob.options.message = mergeMessages(existingJob.options.message, message)
|
|
300
291
|
|
|
301
292
|
await existingJob.join({
|
|
@@ -376,7 +367,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
|
|
|
376
367
|
return connection
|
|
377
368
|
}
|
|
378
369
|
|
|
379
|
-
_updateSentStats (blocks: Block
|
|
370
|
+
_updateSentStats (blocks: Map<string, Block>): void {
|
|
380
371
|
let bytes = 0
|
|
381
372
|
|
|
382
373
|
for (const block of blocks.values()) {
|
|
@@ -384,6 +375,6 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
|
|
|
384
375
|
}
|
|
385
376
|
|
|
386
377
|
this.metrics.dataSent?.increment(bytes)
|
|
387
|
-
this.metrics.blocksSent?.increment(blocks.
|
|
378
|
+
this.metrics.blocksSent?.increment(blocks.size)
|
|
388
379
|
}
|
|
389
380
|
}
|
|
@@ -6,7 +6,7 @@ import { Ledger } from './ledger.js'
|
|
|
6
6
|
import type { BitswapNotifyProgressEvents, WantListEntry } from '../index.js'
|
|
7
7
|
import type { Network } from '../network.js'
|
|
8
8
|
import type { BitswapMessage } from '../pb/message.js'
|
|
9
|
-
import type { ComponentLogger, Libp2p, Logger, PeerId } from '@libp2p/interface'
|
|
9
|
+
import type { ComponentLogger, Libp2p, Logger, Metrics, PeerId } from '@libp2p/interface'
|
|
10
10
|
import type { PeerMap } from '@libp2p/peer-collections'
|
|
11
11
|
import type { Blockstore } from 'interface-blockstore'
|
|
12
12
|
import type { AbortOptions } from 'it-length-prefixed-stream'
|
|
@@ -21,6 +21,7 @@ export interface PeerWantListsComponents {
|
|
|
21
21
|
network: Network
|
|
22
22
|
libp2p: Libp2p
|
|
23
23
|
logger: ComponentLogger
|
|
24
|
+
metrics?: Metrics
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export interface PeerLedger {
|
|
@@ -48,7 +49,7 @@ export class PeerWantLists {
|
|
|
48
49
|
|
|
49
50
|
this.ledgerMap = trackedPeerMap({
|
|
50
51
|
name: 'helia_bitswap_ledger_map',
|
|
51
|
-
metrics: components.
|
|
52
|
+
metrics: components.metrics
|
|
52
53
|
})
|
|
53
54
|
|
|
54
55
|
this.network.addEventListener('bitswap:message', (evt) => {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable max-depth */
|
|
2
2
|
import { DEFAULT_MAX_SIZE_REPLACE_HAS_WITH_BLOCK } from '../constants.js'
|
|
3
|
-
import { BlockPresenceType,
|
|
3
|
+
import { BlockPresenceType, WantType } from '../pb/message.js'
|
|
4
|
+
import { QueuedBitswapMessage } from '../utils/bitswap-message.js'
|
|
4
5
|
import { cidToPrefix } from '../utils/cid-prefix.js'
|
|
5
6
|
import type { Network } from '../network.js'
|
|
6
7
|
import type { ComponentLogger, Logger, PeerId } from '@libp2p/interface'
|
|
@@ -89,16 +90,45 @@ export class Ledger {
|
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
public async sendBlocksToPeer (options?: AbortOptions): Promise<void> {
|
|
92
|
-
const message
|
|
93
|
-
blockPresences: [],
|
|
94
|
-
blocks: []
|
|
95
|
-
}
|
|
93
|
+
const message = new QueuedBitswapMessage()
|
|
96
94
|
const sentBlocks = new Set<string>()
|
|
97
95
|
|
|
98
96
|
for (const [key, entry] of this.wants.entries()) {
|
|
99
|
-
|
|
97
|
+
try {
|
|
98
|
+
const block = await this.blockstore.get(entry.cid, options)
|
|
99
|
+
|
|
100
|
+
// do they want the block or just us to tell them we have the block
|
|
101
|
+
if (entry.wantType === WantType.WantHave) {
|
|
102
|
+
if (block.byteLength < this.maxSizeReplaceHasWithBlock) {
|
|
103
|
+
this.log('sending have and block for %c', entry.cid)
|
|
104
|
+
// if the block is small we just send it to them
|
|
105
|
+
sentBlocks.add(key)
|
|
106
|
+
message.addBlock(entry.cid, {
|
|
107
|
+
data: block,
|
|
108
|
+
prefix: cidToPrefix(entry.cid)
|
|
109
|
+
})
|
|
110
|
+
} else {
|
|
111
|
+
this.log('sending have for %c', entry.cid)
|
|
112
|
+
// otherwise tell them we have the block
|
|
113
|
+
message.addBlockPresence(entry.cid, {
|
|
114
|
+
cid: entry.cid.bytes,
|
|
115
|
+
type: BlockPresenceType.HaveBlock
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
this.log('sending block for %c', entry.cid)
|
|
120
|
+
// they want the block, send it to them
|
|
121
|
+
sentBlocks.add(key)
|
|
122
|
+
message.addBlock(entry.cid, {
|
|
123
|
+
data: block,
|
|
124
|
+
prefix: cidToPrefix(entry.cid)
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
} catch (err: any) {
|
|
128
|
+
if (err.code !== 'ERR_NOT_FOUND') {
|
|
129
|
+
throw err
|
|
130
|
+
}
|
|
100
131
|
|
|
101
|
-
if (!has) {
|
|
102
132
|
this.log('do not have block for %c', entry.cid)
|
|
103
133
|
|
|
104
134
|
// we don't have the requested block and the remote is not interested
|
|
@@ -113,53 +143,21 @@ export class Ledger {
|
|
|
113
143
|
}
|
|
114
144
|
|
|
115
145
|
entry.sentDontHave = true
|
|
116
|
-
message.
|
|
146
|
+
message.addBlockPresence(entry.cid, {
|
|
117
147
|
cid: entry.cid.bytes,
|
|
118
148
|
type: BlockPresenceType.DontHaveBlock
|
|
119
149
|
})
|
|
120
|
-
|
|
121
|
-
continue
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const block = await this.blockstore.get(entry.cid, options)
|
|
125
|
-
|
|
126
|
-
// do they want the block or just us to tell them we have the block
|
|
127
|
-
if (entry.wantType === WantType.WantHave) {
|
|
128
|
-
if (block.byteLength < this.maxSizeReplaceHasWithBlock) {
|
|
129
|
-
this.log('sending have and block for %c', entry.cid)
|
|
130
|
-
// if the block is small we just send it to them
|
|
131
|
-
sentBlocks.add(key)
|
|
132
|
-
message.blocks.push({
|
|
133
|
-
data: block,
|
|
134
|
-
prefix: cidToPrefix(entry.cid)
|
|
135
|
-
})
|
|
136
|
-
} else {
|
|
137
|
-
this.log('sending have for %c', entry.cid)
|
|
138
|
-
// otherwise tell them we have the block
|
|
139
|
-
message.blockPresences.push({
|
|
140
|
-
cid: entry.cid.bytes,
|
|
141
|
-
type: BlockPresenceType.HaveBlock
|
|
142
|
-
})
|
|
143
|
-
}
|
|
144
|
-
} else {
|
|
145
|
-
this.log('sending block for %c', entry.cid)
|
|
146
|
-
// they want the block, send it to them
|
|
147
|
-
sentBlocks.add(key)
|
|
148
|
-
message.blocks.push({
|
|
149
|
-
data: block,
|
|
150
|
-
prefix: cidToPrefix(entry.cid)
|
|
151
|
-
})
|
|
152
150
|
}
|
|
153
151
|
}
|
|
154
152
|
|
|
155
153
|
// only send the message if we actually have something to send
|
|
156
|
-
if (message.blocks.
|
|
154
|
+
if (message.blocks.size > 0 || message.blockPresences.size > 0) {
|
|
157
155
|
this.log('sending message')
|
|
158
156
|
await this.network.sendMessage(this.peerId, message, options)
|
|
159
157
|
this.log('sent message')
|
|
160
158
|
|
|
161
159
|
// update accounting
|
|
162
|
-
this.sentBytes(message.blocks.reduce((acc, curr) => acc + curr.data.byteLength, 0))
|
|
160
|
+
this.sentBytes([...message.blocks.values()].reduce((acc, curr) => acc + curr.data.byteLength, 0))
|
|
163
161
|
|
|
164
162
|
// remove sent blocks from local copy of their want list - they can still
|
|
165
163
|
// re-request if required
|
package/src/stats.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Libp2p, MetricGroup, PeerId } from '@libp2p/interface'
|
|
1
|
+
import type { Libp2p, MetricGroup, Metrics, PeerId } from '@libp2p/interface'
|
|
2
2
|
|
|
3
3
|
export interface StatsComponents {
|
|
4
4
|
libp2p: Libp2p
|
|
5
|
+
metrics?: Metrics
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
export class Stats {
|
|
@@ -11,10 +12,10 @@ export class Stats {
|
|
|
11
12
|
private readonly duplicateDataReceived?: MetricGroup
|
|
12
13
|
|
|
13
14
|
constructor (components: StatsComponents) {
|
|
14
|
-
this.blocksReceived = components.
|
|
15
|
-
this.duplicateBlocksReceived = components.
|
|
16
|
-
this.dataReceived = components.
|
|
17
|
-
this.duplicateDataReceived = components.
|
|
15
|
+
this.blocksReceived = components.metrics?.registerMetricGroup('helia_bitswap_received_blocks')
|
|
16
|
+
this.duplicateBlocksReceived = components.metrics?.registerMetricGroup('helia_bitswap_duplicate_received_blocks')
|
|
17
|
+
this.dataReceived = components.metrics?.registerMetricGroup('helia_bitswap_data_received_bytes')
|
|
18
|
+
this.duplicateDataReceived = components.metrics?.registerMetricGroup('helia_bitswap_duplicate_data_received_bytes')
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
updateBlocksReceived (count: number = 1, peerId?: PeerId): void {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { base64 } from 'multiformats/bases/base64'
|
|
2
|
+
import type { Block, BlockPresence, WantlistEntry } from '../pb/message.js'
|
|
3
|
+
import type { CID } from 'multiformats'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A bitswap message that is in the send queue. So implemented to be
|
|
7
|
+
* cheap to merge multiple messages when we repeatedly send messages
|
|
8
|
+
* to the same peer.
|
|
9
|
+
*/
|
|
10
|
+
export class QueuedBitswapMessage {
|
|
11
|
+
public full: boolean
|
|
12
|
+
public pendingBytes: number
|
|
13
|
+
public wantlist: Map<string, WantlistEntry>
|
|
14
|
+
public blocks: Map<string, Block>
|
|
15
|
+
public blockPresences: Map<string, BlockPresence>
|
|
16
|
+
|
|
17
|
+
constructor (full: boolean = false, pendingBytes: number = 0) {
|
|
18
|
+
this.full = full
|
|
19
|
+
this.wantlist = new Map()
|
|
20
|
+
this.blocks = new Map()
|
|
21
|
+
this.blockPresences = new Map()
|
|
22
|
+
this.pendingBytes = 0
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
addWantlistEntry (cid: CID, entry: WantlistEntry): void {
|
|
26
|
+
const key = base64.encode(cid.multihash.bytes)
|
|
27
|
+
this.wantlist.set(key, entry)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
addBlockPresence (cid: CID, blockPresence: BlockPresence): void {
|
|
31
|
+
const key = base64.encode(cid.multihash.bytes)
|
|
32
|
+
this.blockPresences.set(key, blockPresence)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
addBlock (cid: CID, block: Block): void {
|
|
36
|
+
const key = base64.encode(cid.multihash.bytes)
|
|
37
|
+
this.blocks.set(key, block)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { BitswapMessage, Block, BlockPresence, WantlistEntry } from '../pb/message.js'
|
|
1
|
+
import type { QueuedBitswapMessage } from './bitswap-message.js'
|
|
3
2
|
|
|
4
|
-
export function mergeMessages (
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
base64.encode(entry.cid),
|
|
8
|
-
entry
|
|
9
|
-
]))
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
for (const entry of messageB.wantlist?.entries ?? []) {
|
|
13
|
-
const key = base64.encode(entry.cid)
|
|
14
|
-
const existingEntry = wantListEntries.get(key)
|
|
3
|
+
export function mergeMessages (existingMessage: QueuedBitswapMessage, newMessage: QueuedBitswapMessage): QueuedBitswapMessage {
|
|
4
|
+
for (const [key, entry] of newMessage.wantlist.entries()) {
|
|
5
|
+
const existingEntry = existingMessage.wantlist.get(key)
|
|
15
6
|
|
|
16
7
|
if (existingEntry != null) {
|
|
17
8
|
// take highest priority
|
|
@@ -25,46 +16,22 @@ export function mergeMessages (messageA: BitswapMessage, messageB: BitswapMessag
|
|
|
25
16
|
entry.sendDontHave = entry.sendDontHave ?? existingEntry.sendDontHave
|
|
26
17
|
}
|
|
27
18
|
|
|
28
|
-
|
|
19
|
+
existingMessage.wantlist.set(key, entry)
|
|
29
20
|
}
|
|
30
21
|
|
|
31
|
-
const
|
|
32
|
-
messageA.blockPresences.map(presence => ([
|
|
33
|
-
base64.encode(presence.cid),
|
|
34
|
-
presence
|
|
35
|
-
]))
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
for (const blockPresence of messageB.blockPresences) {
|
|
39
|
-
const key = base64.encode(blockPresence.cid)
|
|
40
|
-
|
|
22
|
+
for (const [key, blockPresence] of newMessage.blockPresences.entries()) {
|
|
41
23
|
// override earlier block presence with later one as if duplicated it is
|
|
42
24
|
// likely to be more accurate since it is more recent
|
|
43
|
-
blockPresences.set(key, blockPresence)
|
|
25
|
+
existingMessage.blockPresences.set(key, blockPresence)
|
|
44
26
|
}
|
|
45
27
|
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
base64.encode(block.data),
|
|
49
|
-
block
|
|
50
|
-
]))
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
for (const block of messageB.blocks) {
|
|
54
|
-
const key = base64.encode(block.data)
|
|
55
|
-
|
|
56
|
-
blocks.set(key, block)
|
|
28
|
+
for (const [key, block] of newMessage.blocks.entries()) {
|
|
29
|
+
existingMessage.blocks.set(key, block)
|
|
57
30
|
}
|
|
58
31
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
full: messageA.wantlist?.full ?? messageB.wantlist?.full ?? false,
|
|
62
|
-
entries: [...wantListEntries.values()]
|
|
63
|
-
},
|
|
64
|
-
blockPresences: [...blockPresences.values()],
|
|
65
|
-
blocks: [...blocks.values()],
|
|
66
|
-
pendingBytes: messageA.pendingBytes + messageB.pendingBytes
|
|
32
|
+
if (newMessage.full && !existingMessage.full) {
|
|
33
|
+
existingMessage.full = true
|
|
67
34
|
}
|
|
68
35
|
|
|
69
|
-
return
|
|
36
|
+
return existingMessage
|
|
70
37
|
}
|