@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.
Files changed (42) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/src/network.d.ts +5 -3
  3. package/dist/src/network.d.ts.map +1 -1
  4. package/dist/src/network.js +8 -18
  5. package/dist/src/network.js.map +1 -1
  6. package/dist/src/peer-want-lists/index.d.ts +2 -1
  7. package/dist/src/peer-want-lists/index.d.ts.map +1 -1
  8. package/dist/src/peer-want-lists/index.js +1 -1
  9. package/dist/src/peer-want-lists/index.js.map +1 -1
  10. package/dist/src/peer-want-lists/ledger.d.ts.map +1 -1
  11. package/dist/src/peer-want-lists/ledger.js +41 -40
  12. package/dist/src/peer-want-lists/ledger.js.map +1 -1
  13. package/dist/src/stats.d.ts +2 -1
  14. package/dist/src/stats.d.ts.map +1 -1
  15. package/dist/src/stats.js +4 -4
  16. package/dist/src/stats.js.map +1 -1
  17. package/dist/src/utils/bitswap-message.d.ts +19 -0
  18. package/dist/src/utils/bitswap-message.d.ts.map +1 -0
  19. package/dist/src/utils/bitswap-message.js +33 -0
  20. package/dist/src/utils/bitswap-message.js.map +1 -0
  21. package/dist/src/utils/merge-messages.d.ts +2 -2
  22. package/dist/src/utils/merge-messages.d.ts.map +1 -1
  23. package/dist/src/utils/merge-messages.js +12 -34
  24. package/dist/src/utils/merge-messages.js.map +1 -1
  25. package/dist/src/utils/split-message.d.ts +2 -2
  26. package/dist/src/utils/split-message.d.ts.map +1 -1
  27. package/dist/src/utils/split-message.js +5 -5
  28. package/dist/src/utils/split-message.js.map +1 -1
  29. package/dist/src/want-list.d.ts +2 -1
  30. package/dist/src/want-list.d.ts.map +1 -1
  31. package/dist/src/want-list.js +51 -67
  32. package/dist/src/want-list.js.map +1 -1
  33. package/package.json +4 -5
  34. package/src/network.ts +12 -21
  35. package/src/peer-want-lists/index.ts +3 -2
  36. package/src/peer-want-lists/ledger.ts +40 -42
  37. package/src/stats.ts +6 -5
  38. package/src/utils/bitswap-message.ts +39 -0
  39. package/src/utils/merge-messages.ts +12 -45
  40. package/src/utils/split-message.ts +6 -5
  41. package/src/want-list.ts +59 -80
  42. package/dist/typedoc-urls.json +0 -20
@@ -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.libp2p.metrics
31
+ metrics: components.metrics
35
32
  });
36
33
  this.wants = trackedMap({
37
34
  name: 'helia_bitswap_wantlist',
38
- metrics: components.libp2p.metrics
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
- wantlist: {
124
- full: false,
125
- entries: pipe(this.wants.entries(), (source) => filter(source, ([key, entry]) => {
126
- const sentPreviously = sentWants.has(key);
127
- // don't cancel if we've not sent it to them before
128
- if (entry.cancel) {
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
- if (message.wantlist?.entries.length === 0) {
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
- // sending WantHave directly to peer
183
- await this.network.sendMessage(peerId, {
184
- wantlist: {
185
- full: false,
186
- entries: [{
187
- cid: cid.bytes,
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
- // sending WantBlockResult directly to peer
216
- await this.network.sendMessage(peerId, {
217
- wantlist: {
218
- full: false,
219
- entries: [{
220
- cid: cid.bytes,
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 %d from %p with %d blocks', sender, message.blocks.length);
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 message = {
323
- wantlist: {
324
- full: true,
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?.entries.length === 0) {
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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/bitswap",
3
- "version": "1.0.1",
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": "^4.2.0",
152
- "@helia/utils": "^0.2.0",
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: BitswapMessage
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.libp2p.metrics?.registerCounter('helia_bitswap_sent_blocks_total'),
105
- dataSent: components.libp2p.metrics?.registerCounter('helia_bitswap_sent_data_bytes_total')
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.libp2p.metrics,
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('Incoming Bitswap stream timed out', 'ERR_TIMEOUT'))
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, msg: Partial<BitswapMessage>, options?: AbortOptions & ProgressOptions<BitswapNetworkWantProgressEvents>): Promise<void> {
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[] = []): void {
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.length)
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.libp2p.metrics
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, type BitswapMessage, WantType } from '../pb/message.js'
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: Pick<BitswapMessage, 'blockPresences' | 'blocks'> = {
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
- const has = await this.blockstore.has(entry.cid, options)
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.blockPresences.push({
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.length > 0 || message.blockPresences.length > 0) {
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.libp2p.metrics?.registerMetricGroup('helia_bitswap_received_blocks')
15
- this.duplicateBlocksReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_duplicate_received_blocks')
16
- this.dataReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_data_received_bytes')
17
- this.duplicateDataReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_duplicate_data_received_bytes')
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 { base64 } from 'multiformats/bases/base64'
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 (messageA: BitswapMessage, messageB: BitswapMessage): BitswapMessage {
5
- const wantListEntries = new Map<string, WantlistEntry>(
6
- (messageA.wantlist?.entries ?? []).map(entry => ([
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
- wantListEntries.set(key, entry)
19
+ existingMessage.wantlist.set(key, entry)
29
20
  }
30
21
 
31
- const blockPresences = new Map<string, BlockPresence>(
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 blocks = new Map<string, Block>(
47
- messageA.blocks.map(block => ([
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
- const output: BitswapMessage = {
60
- wantlist: {
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 output
36
+ return existingMessage
70
37
  }