@helia/bitswap 0.0.0 → 1.0.0-59de059

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 (62) hide show
  1. package/dist/index.min.js +6 -1
  2. package/dist/src/bitswap.d.ts +3 -2
  3. package/dist/src/bitswap.d.ts.map +1 -1
  4. package/dist/src/bitswap.js +7 -14
  5. package/dist/src/bitswap.js.map +1 -1
  6. package/dist/src/constants.d.ts +2 -0
  7. package/dist/src/constants.d.ts.map +1 -1
  8. package/dist/src/constants.js +2 -0
  9. package/dist/src/constants.js.map +1 -1
  10. package/dist/src/index.d.ts +22 -45
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/network.d.ts +8 -7
  14. package/dist/src/network.d.ts.map +1 -1
  15. package/dist/src/network.js +71 -169
  16. package/dist/src/network.js.map +1 -1
  17. package/dist/src/pb/message.d.ts +6 -6
  18. package/dist/src/pb/message.d.ts.map +1 -1
  19. package/dist/src/pb/message.js +37 -20
  20. package/dist/src/pb/message.js.map +1 -1
  21. package/dist/src/peer-want-lists/index.d.ts +3 -2
  22. package/dist/src/peer-want-lists/index.d.ts.map +1 -1
  23. package/dist/src/peer-want-lists/index.js +7 -3
  24. package/dist/src/peer-want-lists/index.js.map +1 -1
  25. package/dist/src/peer-want-lists/ledger.d.ts +3 -1
  26. package/dist/src/peer-want-lists/ledger.d.ts.map +1 -1
  27. package/dist/src/peer-want-lists/ledger.js +8 -0
  28. package/dist/src/peer-want-lists/ledger.js.map +1 -1
  29. package/dist/src/session.d.ts +13 -8
  30. package/dist/src/session.d.ts.map +1 -1
  31. package/dist/src/session.js +25 -88
  32. package/dist/src/session.js.map +1 -1
  33. package/dist/src/stats.d.ts +2 -2
  34. package/dist/src/stats.d.ts.map +1 -1
  35. package/dist/src/stats.js +4 -4
  36. package/dist/src/stats.js.map +1 -1
  37. package/dist/src/utils/merge-messages.d.ts +3 -0
  38. package/dist/src/utils/merge-messages.d.ts.map +1 -0
  39. package/dist/src/utils/merge-messages.js +51 -0
  40. package/dist/src/utils/merge-messages.js.map +1 -0
  41. package/dist/src/utils/split-message.d.ts +14 -0
  42. package/dist/src/utils/split-message.d.ts.map +1 -0
  43. package/dist/src/utils/split-message.js +99 -0
  44. package/dist/src/utils/split-message.js.map +1 -0
  45. package/dist/src/want-list.d.ts +20 -23
  46. package/dist/src/want-list.d.ts.map +1 -1
  47. package/dist/src/want-list.js +136 -133
  48. package/dist/src/want-list.js.map +1 -1
  49. package/package.json +6 -6
  50. package/src/bitswap.ts +9 -16
  51. package/src/constants.ts +2 -0
  52. package/src/index.ts +24 -51
  53. package/src/network.ts +83 -200
  54. package/src/pb/message.ts +40 -20
  55. package/src/peer-want-lists/index.ts +9 -5
  56. package/src/peer-want-lists/ledger.ts +11 -1
  57. package/src/session.ts +31 -120
  58. package/src/stats.ts +6 -6
  59. package/src/utils/merge-messages.ts +70 -0
  60. package/src/utils/split-message.ts +131 -0
  61. package/src/want-list.ts +205 -212
  62. package/dist/typedoc-urls.json +0 -24
@@ -1,100 +1,37 @@
1
- import { CodeError } from '@libp2p/interface';
2
- import { PeerSet } from '@libp2p/peer-collections';
3
- import { PeerQueue } from '@libp2p/utils/peer-queue';
4
- import map from 'it-map';
5
- import merge from 'it-merge';
6
- import pDefer, {} from 'p-defer';
7
- class BitswapSession {
8
- root;
9
- peers;
10
- log;
1
+ import { AbstractSession } from '@helia/utils';
2
+ class BitswapSession extends AbstractSession {
11
3
  wantList;
12
4
  network;
13
- queue;
14
- maxProviders;
15
5
  constructor(components, init) {
16
- this.peers = new PeerSet();
17
- this.root = init.root;
18
- this.maxProviders = init.maxProviders;
19
- this.log = components.logger.forComponent(`helia:bitswap:session:${init.root}`);
6
+ super(components, {
7
+ ...init,
8
+ name: 'helia:bitswap:session'
9
+ });
20
10
  this.wantList = components.wantList;
21
11
  this.network = components.network;
22
- this.queue = new PeerQueue({
23
- concurrency: init.queryConcurrency
24
- });
25
- this.queue.addEventListener('error', (evt) => {
26
- this.log.error('error querying peer for %c', this.root, evt.detail);
27
- });
28
12
  }
29
- async want(cid, options = {}) {
30
- if (this.peers.size === 0) {
31
- throw new CodeError('Bitswap session had no peers', 'ERR_NO_SESSION_PEERS');
13
+ async queryProvider(cid, provider, options) {
14
+ this.log('sending WANT-BLOCK for %c to %p', cid, provider);
15
+ const result = await this.wantList.wantSessionBlock(cid, provider, options);
16
+ this.log('%p %s %c', provider, result.has ? 'has' : 'does not have', cid);
17
+ if (result.has && result.block != null) {
18
+ return result.block;
32
19
  }
33
- this.log('sending WANT-BLOCK for %c to', cid, this.peers);
34
- const result = await Promise.any([...this.peers].map(async (peerId) => {
35
- return this.wantList.wantBlock(cid, {
36
- peerId,
37
- ...options
38
- });
39
- }));
40
- this.log('received block for %c from %p', cid, result.sender);
41
- // TODO findNewProviders when promise.any throws aggregate error and signal
42
- // is not aborted
43
- return result.block;
20
+ throw new Error('Provider did not have block');
44
21
  }
45
- async findNewProviders(cid, count, options = {}) {
46
- const deferred = pDefer();
47
- let found = 0;
48
- this.log('find %d-%d new provider(s) for %c', count, this.maxProviders, cid);
49
- const source = merge([...this.wantList.peers.keys()], map(this.network.findProviders(cid, options), prov => prov.id));
50
- void Promise.resolve()
51
- .then(async () => {
52
- for await (const peerId of source) {
53
- // eslint-disable-next-line no-loop-func
54
- await this.queue.add(async () => {
55
- try {
56
- this.log('asking potential session peer %p if they have %c', peerId, cid);
57
- const result = await this.wantList.wantPresence(cid, {
58
- peerId,
59
- ...options
60
- });
61
- if (!result.has) {
62
- this.log('potential session peer %p did not have %c', peerId, cid);
63
- return;
64
- }
65
- this.log('potential session peer %p had %c', peerId, cid);
66
- found++;
67
- // add to list
68
- this.peers.add(peerId);
69
- if (found === count) {
70
- this.log('found %d session peers', found);
71
- deferred.resolve();
72
- }
73
- if (found === this.maxProviders) {
74
- this.log('found max provider session peers', found);
75
- this.queue.clear();
76
- }
77
- }
78
- catch (err) {
79
- this.log.error('error querying potential session peer %p for %c', peerId, cid, err.errors ?? err);
80
- }
81
- }, {
82
- peerId
83
- });
84
- }
85
- this.log('found %d session peers total', found);
86
- if (count > 0) {
87
- deferred.reject(new CodeError(`Found ${found} of ${count} providers`, 'ERR_NO_PROVIDERS_FOUND'));
88
- }
89
- });
90
- return deferred.promise;
22
+ async *findNewProviders(cid, options = {}) {
23
+ for await (const provider of this.network.findProviders(cid, options)) {
24
+ yield provider.id;
25
+ }
26
+ }
27
+ toEvictionKey(provider) {
28
+ return provider.toBytes();
29
+ }
30
+ equals(providerA, providerB) {
31
+ return providerA.equals(providerB);
91
32
  }
92
33
  }
93
- export async function createBitswapSession(components, init) {
94
- const session = new BitswapSession(components, init);
95
- await session.findNewProviders(init.root, init.minProviders, {
96
- signal: init.signal
97
- });
98
- return session;
34
+ export function createBitswapSession(components, init) {
35
+ return new BitswapSession(components, init);
99
36
  }
100
37
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAe9C,MAAM,cAAe,SAAQ,eAAkD;IAC5D,QAAQ,CAAU;IAClB,OAAO,CAAS;IAEjC,YAAa,UAAoC,EAAE,IAA0B;QAC3E,KAAK,CAAC,UAAU,EAAE;YAChB,GAAG,IAAI;YACP,IAAI,EAAE,uBAAuB;SAC9B,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,aAAa,CAAE,GAAQ,EAAE,QAAgB,EAAE,OAAqB;QACpE,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;QAE1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE3E,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAA;QAEzE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC,KAAK,CAAA;QACrB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,CAAE,gBAAgB,CAAE,GAAQ,EAAE,UAAwB,EAAE;QAC5D,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YACtE,MAAM,QAAQ,CAAC,EAAE,CAAA;QACnB,CAAC;IACH,CAAC;IAED,aAAa,CAAE,QAAgB;QAC7B,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;IAED,MAAM,CAAE,SAAiB,EAAE,SAAiB;QAC1C,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAE,UAAoC,EAAE,IAA0B;IACpG,OAAO,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC7C,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { Metrics, PeerId } from '@libp2p/interface';
1
+ import type { Libp2p, PeerId } from '@libp2p/interface';
2
2
  export interface StatsComponents {
3
- metrics?: Metrics;
3
+ libp2p: Libp2p;
4
4
  }
5
5
  export declare class Stats {
6
6
  private readonly blocksReceived?;
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAErE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAa;gBAEvC,UAAU,EAAE,eAAe;IAOxC,oBAAoB,CAAE,KAAK,GAAE,MAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAY/D,6BAA6B,CAAE,KAAK,GAAE,MAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAYxE,kBAAkB,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAYzD,2BAA2B,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAWnE"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEpE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAa;gBAEvC,UAAU,EAAE,eAAe;IAOxC,oBAAoB,CAAE,KAAK,GAAE,MAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAY/D,6BAA6B,CAAE,KAAK,GAAE,MAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAYxE,kBAAkB,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAYzD,2BAA2B,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAWnE"}
package/dist/src/stats.js CHANGED
@@ -4,10 +4,10 @@ export class Stats {
4
4
  dataReceived;
5
5
  duplicateDataReceived;
6
6
  constructor(components) {
7
- this.blocksReceived = components.metrics?.registerMetricGroup('ipfs_bitswap_received_blocks');
8
- this.duplicateBlocksReceived = components.metrics?.registerMetricGroup('ipfs_bitswap_duplicate_received_blocks');
9
- this.dataReceived = components.metrics?.registerMetricGroup('ipfs_bitswap_data_received_bytes');
10
- this.duplicateDataReceived = components.metrics?.registerMetricGroup('ipfs_bitswap_duplicate_data_received_bytes');
7
+ this.blocksReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_received_blocks');
8
+ this.duplicateBlocksReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_duplicate_received_blocks');
9
+ this.dataReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_data_received_bytes');
10
+ this.duplicateDataReceived = components.libp2p.metrics?.registerMetricGroup('helia_bitswap_duplicate_data_received_bytes');
11
11
  }
12
12
  updateBlocksReceived(count = 1, peerId) {
13
13
  const stats = {
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,KAAK;IACC,cAAc,CAAc;IAC5B,uBAAuB,CAAc;IACrC,YAAY,CAAc;IAC1B,qBAAqB,CAAc;IAEpD,YAAa,UAA2B;QACtC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,8BAA8B,CAAC,CAAA;QAC7F,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,wCAAwC,CAAC,CAAA;QAChH,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,kCAAkC,CAAC,CAAA;QAC/F,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,4CAA4C,CAAC,CAAA;IACpH,CAAC;IAED,oBAAoB,CAAE,QAAgB,CAAC,EAAE,MAAe;QACtD,MAAM,KAAK,GAAqC;YAC9C,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC;IAED,6BAA6B,CAAE,QAAgB,CAAC,EAAE,MAAe;QAC/D,MAAM,KAAK,GAAqC;YAC9C,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAChD,CAAC;IAED,kBAAkB,CAAE,KAAa,EAAE,MAAe;QAChD,MAAM,KAAK,GAA2B;YACpC,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC;IAED,2BAA2B,CAAE,KAAa,EAAE,MAAe;QACzD,MAAM,KAAK,GAA2B;YACpC,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,KAAK;IACC,cAAc,CAAc;IAC5B,uBAAuB,CAAc;IACrC,YAAY,CAAc;IAC1B,qBAAqB,CAAc;IAEpD,YAAa,UAA2B;QACtC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,+BAA+B,CAAC,CAAA;QACrG,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,yCAAyC,CAAC,CAAA;QACxH,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,mCAAmC,CAAC,CAAA;QACvG,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,6CAA6C,CAAC,CAAA;IAC5H,CAAC;IAED,oBAAoB,CAAE,QAAgB,CAAC,EAAE,MAAe;QACtD,MAAM,KAAK,GAAqC;YAC9C,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC;IAED,6BAA6B,CAAE,QAAgB,CAAC,EAAE,MAAe;QAC/D,MAAM,KAAK,GAAqC;YAC9C,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAChD,CAAC;IAED,kBAAkB,CAAE,KAAa,EAAE,MAAe;QAChD,MAAM,KAAK,GAA2B;YACpC,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC;IAED,2BAA2B,CAAE,KAAa,EAAE,MAAe;QACzD,MAAM,KAAK,GAA2B;YACpC,MAAM,EAAE,KAAK;SACd,CAAA;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { BitswapMessage } from '../pb/message.js';
2
+ export declare function mergeMessages(messageA: BitswapMessage, messageB: BitswapMessage): BitswapMessage;
3
+ //# sourceMappingURL=merge-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-messages.d.ts","sourceRoot":"","sources":["../../../src/utils/merge-messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAuC,MAAM,kBAAkB,CAAA;AAE3F,wBAAgB,aAAa,CAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,cAAc,CAkEjG"}
@@ -0,0 +1,51 @@
1
+ import { base64 } from 'multiformats/bases/base64';
2
+ export function mergeMessages(messageA, messageB) {
3
+ const wantListEntries = new Map((messageA.wantlist?.entries ?? []).map(entry => ([
4
+ base64.encode(entry.cid),
5
+ entry
6
+ ])));
7
+ for (const entry of messageB.wantlist?.entries ?? []) {
8
+ const key = base64.encode(entry.cid);
9
+ const existingEntry = wantListEntries.get(key);
10
+ if (existingEntry != null) {
11
+ // take highest priority
12
+ if (existingEntry.priority > entry.priority) {
13
+ entry.priority = existingEntry.priority;
14
+ }
15
+ // take later values if passed, otherwise use earlier ones
16
+ entry.cancel = entry.cancel ?? existingEntry.cancel;
17
+ entry.wantType = entry.wantType ?? existingEntry.wantType;
18
+ entry.sendDontHave = entry.sendDontHave ?? existingEntry.sendDontHave;
19
+ }
20
+ wantListEntries.set(key, entry);
21
+ }
22
+ const blockPresences = new Map(messageA.blockPresences.map(presence => ([
23
+ base64.encode(presence.cid),
24
+ presence
25
+ ])));
26
+ for (const blockPresence of messageB.blockPresences) {
27
+ const key = base64.encode(blockPresence.cid);
28
+ // override earlier block presence with later one as if duplicated it is
29
+ // likely to be more accurate since it is more recent
30
+ blockPresences.set(key, blockPresence);
31
+ }
32
+ const blocks = new Map(messageA.blocks.map(block => ([
33
+ base64.encode(block.data),
34
+ block
35
+ ])));
36
+ for (const block of messageB.blocks) {
37
+ const key = base64.encode(block.data);
38
+ blocks.set(key, block);
39
+ }
40
+ const output = {
41
+ wantlist: {
42
+ full: messageA.wantlist?.full ?? messageB.wantlist?.full ?? false,
43
+ entries: [...wantListEntries.values()]
44
+ },
45
+ blockPresences: [...blockPresences.values()],
46
+ blocks: [...blocks.values()],
47
+ pendingBytes: messageA.pendingBytes + messageB.pendingBytes
48
+ };
49
+ return output;
50
+ }
51
+ //# sourceMappingURL=merge-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-messages.js","sourceRoot":"","sources":["../../../src/utils/merge-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BitswapMessage } from '../pb/message.js';
2
+ /**
3
+ * Split the passed Bitswap message into multiple smaller messages that when
4
+ * serialized will be under the maximum message size.
5
+ *
6
+ * Since blocks are the largest thing to send, we first try to fit as many
7
+ * blocks as possible into the message, then add (smaller) block presences and
8
+ * wants until the max size is reached.
9
+ *
10
+ * If a block is encountered that is larger than the max message size an error
11
+ * will be thrown.
12
+ */
13
+ export declare function splitMessage(message: BitswapMessage, maxSize: number): AsyncGenerator<Uint8Array>;
14
+ //# sourceMappingURL=split-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-message.d.ts","sourceRoot":"","sources":["../../../src/utils/split-message.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAuC,MAAM,kBAAkB,CAAA;AAEtF;;;;;;;;;;GAUG;AACH,wBAAwB,YAAY,CAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CA0D1G"}
@@ -0,0 +1,99 @@
1
+ /* eslint-disable complexity */
2
+ import { CodeError } from '@libp2p/interface';
3
+ import { encodingLength } from 'uint8-varint';
4
+ import { BitswapMessage, Block, BlockPresence, WantlistEntry } from '../pb/message.js';
5
+ /**
6
+ * Split the passed Bitswap message into multiple smaller messages that when
7
+ * serialized will be under the maximum message size.
8
+ *
9
+ * Since blocks are the largest thing to send, we first try to fit as many
10
+ * blocks as possible into the message, then add (smaller) block presences and
11
+ * wants until the max size is reached.
12
+ *
13
+ * If a block is encountered that is larger than the max message size an error
14
+ * will be thrown.
15
+ */
16
+ export async function* splitMessage(message, maxSize) {
17
+ const wantListEntries = message.wantlist?.entries ?? [];
18
+ const blockPresences = message.blockPresences;
19
+ const blocks = message.blocks;
20
+ let wantListIndex = 0;
21
+ let blockPresencesIndex = 0;
22
+ let blocksIndex = 0;
23
+ let messagesSent = 0;
24
+ let doneSending = false;
25
+ while (true) {
26
+ const subMessage = {
27
+ wantlist: {
28
+ full: false,
29
+ entries: []
30
+ },
31
+ blockPresences: [],
32
+ blocks: [],
33
+ pendingBytes: 0
34
+ };
35
+ let size = 4;
36
+ let { added, hasMore, newSize } = addToMessage(blocks, subMessage.blocks, blocksIndex, maxSize, size, calculateEncodedBlockSize);
37
+ blocksIndex += added;
38
+ size = newSize;
39
+ const haveMoreBlocks = hasMore;
40
+ ({ added, hasMore, newSize } = addToMessage(blockPresences, subMessage.blockPresences, blockPresencesIndex, maxSize, size, calculateEncodedBlockPresenceSize));
41
+ blockPresencesIndex += added;
42
+ size = newSize;
43
+ const haveMorePresences = hasMore;
44
+ ({ added, hasMore, newSize } = addToMessage(wantListEntries, subMessage.wantlist.entries, wantListIndex, maxSize, size, calculateEncodedWantlistEntrySize));
45
+ wantListIndex += added;
46
+ size = newSize;
47
+ const haveMoreWantlistEntries = hasMore;
48
+ doneSending = !haveMoreBlocks && !haveMorePresences && !haveMoreWantlistEntries;
49
+ // if we're only sending one message, and that message has the full wantlist
50
+ // make sure we let the remote know it's the full list
51
+ if (doneSending && messagesSent === 0 && message.wantlist?.full === true) {
52
+ subMessage.wantlist.full = true;
53
+ }
54
+ yield BitswapMessage.encode(subMessage);
55
+ messagesSent++;
56
+ if (doneSending) {
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ function addToMessage(input, output, start, maxSize, size, calculateSize) {
62
+ let added = 0;
63
+ let hasMore = false;
64
+ // try to send as many blocks as possible
65
+ for (let i = start; i < input.length; i++) {
66
+ const item = input[i];
67
+ const itemSize = calculateSize(item);
68
+ if (itemSize > maxSize) {
69
+ throw new CodeError('Cannot send block as it is over the max message size', 'ERR_BLOCK_TOO_LARGE');
70
+ }
71
+ const newSize = size + itemSize;
72
+ if (newSize >= maxSize) {
73
+ hasMore = true;
74
+ break;
75
+ }
76
+ output.push(item);
77
+ added++;
78
+ size = newSize;
79
+ }
80
+ return { hasMore, added, newSize: size };
81
+ }
82
+ function calculateEncodedBlockSize(block) {
83
+ // 3 is the "blocks" field number in message.proto
84
+ return calculateLength(3, Block.encode(block));
85
+ }
86
+ function calculateEncodedBlockPresenceSize(blockPresence) {
87
+ // 4 is the "blockPresences" field number in message.proto
88
+ return calculateLength(4, BlockPresence.encode(blockPresence));
89
+ }
90
+ function calculateEncodedWantlistEntrySize(entry) {
91
+ // 1 is the "entries" field number in message.proto
92
+ return calculateLength(1, WantlistEntry.encode(entry));
93
+ }
94
+ function calculateLength(fieldNumber, data) {
95
+ const fieldNumberLength = encodingLength(fieldNumber);
96
+ const dataLengthLength = encodingLength(data.byteLength);
97
+ return fieldNumberLength + dataLengthLength + data.byteLength;
98
+ }
99
+ //# sourceMappingURL=split-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-message.js","sourceRoot":"","sources":["../../../src/utils/split-message.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,15 @@
1
- import { PeerSet } from '@libp2p/peer-collections';
1
+ import { TypedEventEmitter } from '@libp2p/interface';
2
2
  import { CID } from 'multiformats/cid';
3
3
  import { WantType } from './pb/message.js';
4
- import type { MultihashHasherLoader } from './index.js';
4
+ import type { BitswapNotifyProgressEvents, MultihashHasherLoader } from './index.js';
5
5
  import type { BitswapNetworkWantProgressEvents, Network } from './network.js';
6
- import type { ComponentLogger, Metrics, PeerId, Startable, AbortOptions } from '@libp2p/interface';
6
+ import type { ComponentLogger, PeerId, Startable, AbortOptions, Libp2p, TypedEventTarget } from '@libp2p/interface';
7
7
  import type { PeerMap } from '@libp2p/peer-collections';
8
- import type { DeferredPromise } from 'p-defer';
9
8
  import type { ProgressOptions } from 'progress-events';
10
9
  export interface WantListComponents {
11
10
  network: Network;
12
11
  logger: ComponentLogger;
13
- metrics?: Metrics;
12
+ libp2p: Libp2p;
14
13
  }
15
14
  export interface WantListInit {
16
15
  sendMessagesDelay?: number;
@@ -38,24 +37,8 @@ export interface WantListEntry {
38
37
  * Whether the remote should tell us if they have the block or not
39
38
  */
40
39
  sendDontHave: boolean;
41
- /**
42
- * If this set has members, the want will only be sent to these peers
43
- */
44
- session: PeerSet;
45
- /**
46
- * Promises returned from `.wantBlock` for this block
47
- */
48
- blockWantListeners: Array<DeferredPromise<WantBlockResult>>;
49
- /**
50
- * Promises returned from `.wantPresence` for this block
51
- */
52
- blockPresenceListeners: Array<DeferredPromise<WantPresenceResult>>;
53
40
  }
54
41
  export interface WantOptions extends AbortOptions, ProgressOptions<BitswapNetworkWantProgressEvents> {
55
- /**
56
- * If set, this WantList entry will only be sent to this peer
57
- */
58
- peerId?: PeerId;
59
42
  /**
60
43
  * Allow prioritising blocks
61
44
  */
@@ -78,7 +61,11 @@ export interface WantHaveResult {
78
61
  block?: Uint8Array;
79
62
  }
80
63
  export type WantPresenceResult = WantDontHaveResult | WantHaveResult;
81
- export declare class WantList implements Startable {
64
+ export interface WantListEvents {
65
+ block: CustomEvent<WantBlockResult>;
66
+ presence: CustomEvent<WantPresenceResult>;
67
+ }
68
+ export declare class WantList extends TypedEventEmitter<WantListEvents> implements Startable, TypedEventTarget<WantListEvents> {
82
69
  /**
83
70
  * Tracks what CIDs we've previously sent to which peers
84
71
  */
@@ -89,18 +76,28 @@ export declare class WantList implements Startable {
89
76
  private readonly sendMessagesDelay;
90
77
  private sendMessagesTimeout?;
91
78
  private readonly hashLoader?;
79
+ private sendingMessages?;
92
80
  constructor(components: WantListComponents, init?: WantListInit);
93
81
  private addEntry;
82
+ private sendMessagesDebounced;
94
83
  private sendMessages;
95
84
  has(cid: CID): boolean;
96
85
  /**
97
86
  * Add a CID to the wantlist
98
87
  */
99
- wantPresence(cid: CID, options?: WantOptions): Promise<WantPresenceResult>;
88
+ wantSessionPresence(cid: CID, peerId: PeerId, options?: WantOptions): Promise<WantPresenceResult>;
100
89
  /**
101
90
  * Add a CID to the wantlist
102
91
  */
103
92
  wantBlock(cid: CID, options?: WantOptions): Promise<WantBlockResult>;
93
+ /**
94
+ * Add a CID to the wantlist
95
+ */
96
+ wantSessionBlock(cid: CID, peerId: PeerId, options?: WantOptions): Promise<WantPresenceResult>;
97
+ /**
98
+ * Invoked when a block has been received from an external source
99
+ */
100
+ receivedBlock(cid: CID, options: ProgressOptions<BitswapNotifyProgressEvents> & AbortOptions): Promise<void>;
104
101
  /**
105
102
  * Invoked when a message is received from a bitswap peer
106
103
  */
@@ -1 +1 @@
1
- {"version":3,"file":"want-list.d.ts","sourceRoot":"","sources":["../../src/want-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"want-list.d.ts","sourceRoot":"","sources":["../../src/want-list.ts"],"names":[],"mappings":"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"}