@helia/bitswap 0.0.0-9c8a2c0 → 0.0.0-9ea934e

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.
@@ -1,5 +1,5 @@
1
1
  import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
2
- import { trackedPeerMap, PeerSet } from '@libp2p/peer-collections';
2
+ import { trackedPeerMap } from '@libp2p/peer-collections';
3
3
  import { trackedMap } from '@libp2p/utils/tracked-map';
4
4
  import all from 'it-all';
5
5
  import filter from 'it-filter';
@@ -30,11 +30,11 @@ export class WantList extends TypedEventEmitter {
30
30
  super();
31
31
  setMaxListeners(Infinity, this);
32
32
  this.peers = trackedPeerMap({
33
- name: 'ipfs_bitswap_peers',
33
+ name: 'helia_bitswap_peers',
34
34
  metrics: components.libp2p.metrics
35
35
  });
36
36
  this.wants = trackedMap({
37
- name: 'ipfs_bitswap_wantlist',
37
+ name: 'helia_bitswap_wantlist',
38
38
  metrics: components.libp2p.metrics
39
39
  });
40
40
  this.network = components.network;
@@ -63,15 +63,11 @@ export class WantList extends TypedEventEmitter {
63
63
  if (entry == null) {
64
64
  entry = {
65
65
  cid,
66
- session: new PeerSet(),
67
66
  priority: options.priority ?? 1,
68
67
  wantType: options.wantType ?? WantType.WantBlock,
69
68
  cancel: false,
70
69
  sendDontHave: true
71
70
  };
72
- if (options.peerId != null) {
73
- entry.session.add(options.peerId);
74
- }
75
71
  this.wants.set(cidStr, entry);
76
72
  }
77
73
  // upgrade want-have to want-block if the new want is a WantBlock but the
@@ -79,20 +75,6 @@ export class WantList extends TypedEventEmitter {
79
75
  if (entry.wantType === WantType.WantHave && options.wantType === WantType.WantBlock) {
80
76
  entry.wantType = WantType.WantBlock;
81
77
  }
82
- // if this want was part of a session..
83
- if (entry.session.size > 0) {
84
- // if the new want is also part of a session, expand the want session to
85
- // include both sets of peers
86
- if (options.peerId != null) {
87
- entry.session.add(options.peerId);
88
- }
89
- // if the new want is not part of a session, make this want a non-session
90
- // want - nb. this will cause this WantList entry to be sent to every peer
91
- // instead of just the ones in the session
92
- if (options.peerId == null) {
93
- entry.session.clear();
94
- }
95
- }
96
78
  // broadcast changes
97
79
  await this.sendMessagesDebounced();
98
80
  try {
@@ -141,10 +123,6 @@ export class WantList extends TypedEventEmitter {
141
123
  wantlist: {
142
124
  full: false,
143
125
  entries: pipe(this.wants.entries(), (source) => filter(source, ([key, entry]) => {
144
- // skip session-only wants
145
- if (entry.session.size > 0 && !entry.session.has(peerId)) {
146
- return false;
147
- }
148
126
  const sentPreviously = sentWants.has(key);
149
127
  // don't cancel if we've not sent it to them before
150
128
  if (entry.cancel) {
@@ -200,33 +178,26 @@ export class WantList extends TypedEventEmitter {
200
178
  /**
201
179
  * Add a CID to the wantlist
202
180
  */
203
- async wantPresence(cid, options = {}) {
204
- if (options.peerId != null) {
205
- const peer = options.peerId;
206
- // sending WantHave directly to peer
207
- await this.network.sendMessage(options.peerId, {
208
- wantlist: {
209
- full: false,
210
- entries: [{
211
- cid: cid.bytes,
212
- sendDontHave: true,
213
- wantType: WantType.WantHave,
214
- priority: 1
215
- }]
216
- }
217
- });
218
- // wait for peer response
219
- const event = await raceEvent(this, 'presence', options.signal, {
220
- filter: (event) => {
221
- return peer.equals(event.detail.sender) && uint8ArrayEquals(cid.multihash.digest, event.detail.cid.multihash.digest);
222
- }
223
- });
224
- return event.detail;
225
- }
226
- return this.addEntry(cid, {
227
- ...options,
228
- wantType: WantType.WantHave
181
+ 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
+ }
193
+ });
194
+ // wait for peer response
195
+ const event = await raceEvent(this, 'presence', options.signal, {
196
+ filter: (event) => {
197
+ return peerId.equals(event.detail.sender) && uint8ArrayEquals(cid.multihash.digest, event.detail.cid.multihash.digest);
198
+ }
229
199
  });
200
+ return event.detail;
230
201
  }
231
202
  /**
232
203
  * Add a CID to the wantlist
@@ -237,6 +208,30 @@ export class WantList extends TypedEventEmitter {
237
208
  wantType: WantType.WantBlock
238
209
  });
239
210
  }
211
+ /**
212
+ * Add a CID to the wantlist
213
+ */
214
+ 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
+ }
226
+ });
227
+ // wait for peer response
228
+ const event = await raceEvent(this, 'presence', options.signal, {
229
+ filter: (event) => {
230
+ return peerId.equals(event.detail.sender) && uint8ArrayEquals(cid.multihash.digest, event.detail.cid.multihash.digest);
231
+ }
232
+ });
233
+ return event.detail;
234
+ }
240
235
  /**
241
236
  * Invoked when a block has been received from an external source
242
237
  */
@@ -324,7 +319,7 @@ export class WantList extends TypedEventEmitter {
324
319
  const message = {
325
320
  wantlist: {
326
321
  full: true,
327
- entries: pipe(this.wants.entries(), (source) => filter(source, ([key, entry]) => !entry.cancel && (entry.session.size > 0 && !entry.session.has(peerId))), (source) => filter(source, ([key, entry]) => !entry.cancel), (source) => map(source, ([key, entry]) => {
322
+ entries: pipe(this.wants.entries(), (source) => filter(source, ([key, entry]) => !entry.cancel), (source) => map(source, ([key, entry]) => {
328
323
  sentWants.add(key);
329
324
  return {
330
325
  cid: entry.cid.bytes,
@@ -360,6 +355,7 @@ export class WantList extends TypedEventEmitter {
360
355
  }
361
356
  stop() {
362
357
  this.peers.clear();
358
+ clearTimeout(this.sendMessagesTimeout);
363
359
  }
364
360
  }
365
361
  //# sourceMappingURL=want-list.js.map
@@ -1 +1 @@
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,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,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,MAAM,2BAA2B,CAAA;AA4F1C,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,oBAAoB;YAC1B,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;SACnC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;SACnC,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,OAAO,EAAE,IAAI,OAAO,EAAE;gBACtB,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,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;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,uCAAuC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3B,wEAAwE;YACxE,6BAA6B;YAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;YAED,yEAAyE;YACzE,0EAA0E;YAC1E,0CAA0C;YAC1C,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC3B,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;YACvB,CAAC;QACH,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,GAA4B;gBACvC,QAAQ,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,IAAI,CACX,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EACpB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;wBAC1C,0BAA0B;wBAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;4BACzD,OAAO,KAAK,CAAA;wBACd,CAAC;wBAED,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;wBAEzC,mDAAmD;wBACnD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;4BACjB,OAAO,cAAc,CAAA;wBACvB,CAAC;wBAED,gDAAgD;wBAChD,OAAO,CAAC,cAAc,CAAA;oBACxB,CAAC,CAAC,EACF,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;wBACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;wBAEb,OAAO;4BACL,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;4BACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,YAAY,EAAE,KAAK,CAAC,YAAY;yBACjC,CAAA;oBACH,CAAC,CAAC,EACF,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CACxB;iBACF;aACF,CAAA;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,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,YAAY,CAAE,GAAQ,EAAE,UAAuB,EAAE;QACrD,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAA;YAE3B,oCAAoC;YACpC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC7C,QAAQ,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,CAAC;4BACR,GAAG,EAAE,GAAG,CAAC,KAAK;4BACd,YAAY,EAAE,IAAI;4BAClB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;4BAC3B,QAAQ,EAAE,CAAC;yBACZ,CAAC;iBACH;aACF,CAAC,CAAA;YAEF,yBAAyB;YACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAmD,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;gBAChH,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,OAAO,IAAI,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;gBACtH,CAAC;aACF,CAAC,CAAA;YAEF,OAAO,KAAK,CAAC,MAAM,CAAA;QACrB,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACxB,GAAG,OAAO;YACV,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC,CAAA;IACJ,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,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,0BAA0B,EAAE,MAAM,CAAC,CAAA;QAC5C,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,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC5C,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,OAAM;YACR,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;QAEnC,wCAAwC;QACxC,MAAM,OAAO,GAA4B;YACvC,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI,CACX,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EACpB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EACrH,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAC3D,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBACvC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAElB,OAAO;wBACL,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;wBACpB,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,QAAQ,CAAC,SAAS;wBAC5B,MAAM,EAAE,KAAK;wBACb,YAAY,EAAE,KAAK;qBACpB,CAAA;gBACH,CAAC,CAAC,EACF,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CACxB;aACF;SACF,CAAA;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,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;IACpB,CAAC;CACF"}
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,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,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,MAAM,2BAA2B,CAAA;AAkF1C,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,MAAM,CAAC,OAAO;SACnC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;SACnC,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,GAA4B;gBACvC,QAAQ,EAAE;oBACR,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,IAAI,CACX,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EACpB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;wBAC1C,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;wBAEzC,mDAAmD;wBACnD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;4BACjB,OAAO,cAAc,CAAA;wBACvB,CAAC;wBAED,gDAAgD;wBAChD,OAAO,CAAC,cAAc,CAAA;oBACxB,CAAC,CAAC,EACF,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;wBACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;wBAEb,OAAO;4BACL,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;4BACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,YAAY,EAAE,KAAK,CAAC,YAAY;yBACjC,CAAA;oBACH,CAAC,CAAC,EACF,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CACxB;iBACF;aACF,CAAA;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,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,oCAAoC;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE;YACrC,QAAQ,EAAE;gBACR,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,CAAC;wBACR,GAAG,EAAE,GAAG,CAAC,KAAK;wBACd,YAAY,EAAE,IAAI;wBAClB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,QAAQ,EAAE,CAAC;qBACZ,CAAC;aACH;SACF,CAAC,CAAA;QAEF,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,2CAA2C;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE;YACrC,QAAQ,EAAE;gBACR,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,CAAC;wBACR,GAAG,EAAE,GAAG,CAAC,KAAK;wBACd,YAAY,EAAE,IAAI;wBAClB,QAAQ,EAAE,QAAQ,CAAC,SAAS;wBAC5B,QAAQ,EAAE,CAAC;qBACZ,CAAC;aACH;SACF,CAAC,CAAA;QAEF,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,0BAA0B,EAAE,MAAM,CAAC,CAAA;QAC5C,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,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC5C,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,OAAM;YACR,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;QAEnC,wCAAwC;QACxC,MAAM,OAAO,GAA4B;YACvC,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI,CACX,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EACpB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAC3D,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBACvC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAElB,OAAO;wBACL,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;wBACpB,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,QAAQ,CAAC,SAAS;wBAC5B,MAAM,EAAE,KAAK;wBACb,YAAY,EAAE,KAAK;qBACpB,CAAA;gBACH,CAAC,CAAC,EACF,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CACxB;aACF;SACF,CAAA;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,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": "0.0.0-9c8a2c0",
3
+ "version": "0.0.0-9ea934e",
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,13 +148,13 @@
148
148
  "docs": "aegir docs"
149
149
  },
150
150
  "dependencies": {
151
- "@helia/interface": "4.1.0-9c8a2c0",
151
+ "@helia/interface": "4.1.0-9ea934e",
152
+ "@helia/utils": "0.1.0-9ea934e",
152
153
  "@libp2p/interface": "^1.1.2",
153
154
  "@libp2p/logger": "^4.0.5",
154
155
  "@libp2p/peer-collections": "^5.1.6",
155
156
  "@libp2p/utils": "^5.2.3",
156
157
  "@multiformats/multiaddr": "^12.1.14",
157
- "@multiformats/multiaddr-matcher": "^1.1.2",
158
158
  "any-signal": "^4.1.1",
159
159
  "debug": "^4.3.4",
160
160
  "interface-blockstore": "^5.2.9",
@@ -165,7 +165,6 @@
165
165
  "it-length-prefixed": "^9.0.0",
166
166
  "it-length-prefixed-stream": "^1.1.6",
167
167
  "it-map": "^3.0.5",
168
- "it-merge": "^3.0.3",
169
168
  "it-pipe": "^3.0.1",
170
169
  "it-take": "^3.0.1",
171
170
  "multiformats": "^13.0.1",
package/src/bitswap.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable no-loop-func */
2
- import { DEFAULT_SESSION_MAX_PROVIDERS, DEFAULT_SESSION_MIN_PROVIDERS, DEFAULT_SESSION_PROVIDER_QUERY_CONCURRENCY } from '@helia/interface'
3
2
  import { setMaxListeners } from '@libp2p/interface'
4
3
  import { anySignal } from 'any-signal'
5
4
  import { Network } from './network.js'
@@ -7,7 +6,8 @@ import { PeerWantLists } from './peer-want-lists/index.js'
7
6
  import { createBitswapSession } from './session.js'
8
7
  import { Stats } from './stats.js'
9
8
  import { WantList } from './want-list.js'
10
- import type { BitswapOptions, Bitswap as BitswapInterface, BitswapWantProgressEvents, BitswapNotifyProgressEvents, BitswapSession, WantListEntry, BitswapComponents, CreateBitswapSessionOptions } from './index.js'
9
+ import type { BitswapOptions, Bitswap as BitswapInterface, BitswapWantProgressEvents, BitswapNotifyProgressEvents, WantListEntry, BitswapComponents } from './index.js'
10
+ import type { BlockBroker, CreateSessionOptions } from '@helia/interface'
11
11
  import type { ComponentLogger, PeerId } from '@libp2p/interface'
12
12
  import type { Logger } from '@libp2p/logger'
13
13
  import type { AbortOptions } from '@multiformats/multiaddr'
@@ -62,22 +62,12 @@ export class Bitswap implements BitswapInterface {
62
62
  }, init)
63
63
  }
64
64
 
65
- async createSession (root: CID, options?: CreateBitswapSessionOptions): Promise<BitswapSession> {
66
- const minProviders = options?.minProviders ?? DEFAULT_SESSION_MIN_PROVIDERS
67
- const maxProviders = options?.maxProviders ?? DEFAULT_SESSION_MAX_PROVIDERS
68
-
65
+ createSession (options: CreateSessionOptions = {}): Required<Pick<BlockBroker<BitswapWantProgressEvents>, 'retrieve'>> {
69
66
  return createBitswapSession({
70
67
  wantList: this.wantList,
71
68
  network: this.network,
72
69
  logger: this.logger
73
- }, {
74
- root,
75
- queryConcurrency: options?.providerQueryConcurrency ?? DEFAULT_SESSION_PROVIDER_QUERY_CONCURRENCY,
76
- minProviders,
77
- maxProviders,
78
- connectedPeers: options?.queryConnectedPeers !== false ? [...this.wantList.peers.keys()] : [],
79
- signal: options?.signal
80
- })
70
+ }, options)
81
71
  }
82
72
 
83
73
  async want (cid: CID, options: WantOptions = {}): Promise<Uint8Array> {
package/src/index.ts CHANGED
@@ -9,10 +9,9 @@
9
9
  import { Bitswap as BitswapClass } from './bitswap.js'
10
10
  import type { BitswapNetworkNotifyProgressEvents, BitswapNetworkWantProgressEvents } from './network.js'
11
11
  import type { WantType } from './pb/message.js'
12
- import type { CreateSessionOptions } from '@helia/interface'
12
+ import type { BlockBroker, CreateSessionOptions } from '@helia/interface'
13
13
  import type { Routing } from '@helia/interface/routing'
14
14
  import type { Libp2p, AbortOptions, Startable, ComponentLogger, Metrics, PeerId } from '@libp2p/interface'
15
- import type { PeerSet } from '@libp2p/peer-collections'
16
15
  import type { Blockstore } from 'interface-blockstore'
17
16
  import type { CID } from 'multiformats/cid'
18
17
  import type { MultihashHasher } from 'multiformats/hashes/interface'
@@ -29,52 +28,12 @@ export type BitswapWantBlockProgressEvents =
29
28
  ProgressEvent<'bitswap:want-block:block', CID> |
30
29
  BitswapNetworkWantProgressEvents
31
30
 
32
- /**
33
- * A bitswap session is a network overlay consisting of peers that all have the
34
- * first block in a file. Subsequent requests will only go to these peers.
35
- */
36
- export interface BitswapSession {
37
- /**
38
- * The peers in this session
39
- */
40
- peers: PeerSet
41
-
42
- /**
43
- * Fetch an additional CID from this DAG
44
- */
45
- want(cid: CID, options?: AbortOptions & ProgressOptions<BitswapWantProgressEvents>): Promise<Uint8Array>
46
- }
47
-
48
31
  export interface WantListEntry {
49
32
  cid: CID
50
33
  priority: number
51
34
  wantType: WantType
52
35
  }
53
36
 
54
- export interface CreateBitswapSessionOptions extends CreateSessionOptions<BitswapWantProgressEvents> {
55
- /**
56
- * If true, query connected peers before searching for providers via
57
- * Helia routers
58
- *
59
- * @default true
60
- */
61
- queryConnectedPeers?: boolean
62
-
63
- /**
64
- * If true, search for providers via Helia routers to query for the root CID
65
- *
66
- * @default true
67
- */
68
- queryRoutingPeers?: boolean
69
-
70
- /**
71
- * The priority to use when querying availability of the root CID
72
- *
73
- * @default 1
74
- */
75
- priority?: number
76
- }
77
-
78
37
  export interface Bitswap extends Startable {
79
38
  /**
80
39
  * Returns the current state of the wantlist
@@ -100,7 +59,7 @@ export interface Bitswap extends Startable {
100
59
  /**
101
60
  * Start a session to retrieve a file from the network
102
61
  */
103
- createSession(root: CID, options?: AbortOptions & ProgressOptions<BitswapWantProgressEvents>): Promise<BitswapSession>
62
+ createSession(options?: CreateSessionOptions<BitswapWantProgressEvents>): Required<Pick<BlockBroker<BitswapWantProgressEvents>, 'retrieve'>>
104
63
  }
105
64
 
106
65
  export interface MultihashHasherLoader {
package/src/network.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { CodeError, TypedEventEmitter, setMaxListeners } from '@libp2p/interface'
2
2
  import { PeerQueue, type PeerQueueJobOptions } from '@libp2p/utils/peer-queue'
3
- import { Circuit } from '@multiformats/multiaddr-matcher'
4
3
  import { anySignal } from 'any-signal'
5
4
  import debug from 'debug'
6
5
  import drain from 'it-drain'
@@ -129,14 +128,14 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
129
128
  this.messageSendTimeout = init.messageSendTimeout ?? DEFAULT_MESSAGE_SEND_TIMEOUT
130
129
  this.runOnTransientConnections = init.runOnTransientConnections ?? DEFAULT_RUN_ON_TRANSIENT_CONNECTIONS
131
130
  this.metrics = {
132
- blocksSent: components.libp2p.metrics?.registerCounter('ipfs_bitswap_sent_blocks_total'),
133
- dataSent: components.libp2p.metrics?.registerCounter('ipfs_bitswap_sent_data_bytes_total')
131
+ blocksSent: components.libp2p.metrics?.registerCounter('helia_bitswap_sent_blocks_total'),
132
+ dataSent: components.libp2p.metrics?.registerCounter('helia_bitswap_sent_data_bytes_total')
134
133
  }
135
134
 
136
135
  this.sendQueue = new PeerQueue({
137
136
  concurrency: init.messageSendConcurrency ?? DEFAULT_MESSAGE_SEND_CONCURRENCY,
138
137
  metrics: components.libp2p.metrics,
139
- metricName: 'ipfs_bitswap_message_send_queue'
138
+ metricName: 'helia_bitswap_message_send_queue'
140
139
  })
141
140
  this.sendQueue.addEventListener('error', (evt) => {
142
141
  this.log.error('error sending wantlist to peer', evt.detail)
@@ -263,29 +262,12 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
263
262
  options?.onProgress?.(new CustomProgressEvent<PeerId>('bitswap:network:find-providers', cid))
264
263
 
265
264
  for await (const provider of this.routing.findProviders(cid, options)) {
266
- // unless we explicitly run on transient connections, skip peers that only
267
- // have circuit relay addresses as bitswap won't run over them
268
- if (!this.runOnTransientConnections) {
269
- let hasDirectAddress = false
270
-
271
- for (let ma of provider.multiaddrs) {
272
- if (ma.getPeerId() == null) {
273
- ma = ma.encapsulate(`/p2p/${provider.id}`)
274
- }
275
-
276
- if (!Circuit.exactMatch(ma)) {
277
- hasDirectAddress = true
278
- break
279
- }
280
- }
281
-
282
- if (!hasDirectAddress) {
283
- continue
284
- }
285
- }
265
+ // make sure we can dial the provider
266
+ const dialable = await this.libp2p.isDialable(provider.multiaddrs, {
267
+ runOnTransientConnection: this.runOnTransientConnections
268
+ })
286
269
 
287
- // ignore non-bitswap providers
288
- if (provider.protocols?.includes('transport-bitswap') === false) {
270
+ if (!dialable) {
289
271
  continue
290
272
  }
291
273
 
@@ -327,8 +309,9 @@ export class Network extends TypedEventEmitter<NetworkEvents> {
327
309
  pendingBytes: msg.pendingBytes ?? 0
328
310
  }
329
311
 
330
- const signal = anySignal([AbortSignal.timeout(this.messageSendTimeout), options?.signal])
331
- setMaxListeners(Infinity, signal)
312
+ const timeoutSignal = AbortSignal.timeout(this.messageSendTimeout)
313
+ const signal = anySignal([timeoutSignal, options?.signal])
314
+ setMaxListeners(Infinity, timeoutSignal, signal)
332
315
 
333
316
  try {
334
317
  const existingJob = this.sendQueue.queue.find(job => {
@@ -45,7 +45,7 @@ export class PeerWantLists {
45
45
  this.log = components.logger.forComponent('helia:bitswap:peer-want-lists')
46
46
 
47
47
  this.ledgerMap = trackedPeerMap({
48
- name: 'ipfs_bitswap_ledger_map',
48
+ name: 'helia_bitswap_ledger_map',
49
49
  metrics: components.libp2p.metrics
50
50
  })
51
51
 
package/src/session.ts CHANGED
@@ -1,16 +1,11 @@
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, { type DeferredPromise } from 'p-defer'
7
- import type { BitswapWantProgressEvents, BitswapSession as BitswapSessionInterface } from './index.js'
1
+ import { AbstractSession } from '@helia/utils'
2
+ import type { BitswapWantProgressEvents } from './index.js'
8
3
  import type { Network } from './network.js'
9
4
  import type { WantList } from './want-list.js'
10
- import type { ComponentLogger, Logger, PeerId } from '@libp2p/interface'
5
+ import type { CreateSessionOptions } from '@helia/interface'
6
+ import type { ComponentLogger, PeerId } from '@libp2p/interface'
11
7
  import type { AbortOptions } from 'interface-store'
12
8
  import type { CID } from 'multiformats/cid'
13
- import type { ProgressOptions } from 'progress-events'
14
9
 
15
10
  export interface BitswapSessionComponents {
16
11
  network: Network
@@ -18,138 +13,49 @@ export interface BitswapSessionComponents {
18
13
  logger: ComponentLogger
19
14
  }
20
15
 
21
- export interface BitswapSessionInit extends AbortOptions {
22
- root: CID
23
- queryConcurrency: number
24
- minProviders: number
25
- maxProviders: number
26
- connectedPeers: PeerId[]
27
- }
28
-
29
- class BitswapSession implements BitswapSessionInterface {
30
- public readonly root: CID
31
- public readonly peers: PeerSet
32
- private readonly log: Logger
16
+ class BitswapSession extends AbstractSession<PeerId, BitswapWantProgressEvents> {
33
17
  private readonly wantList: WantList
34
18
  private readonly network: Network
35
- private readonly queue: PeerQueue
36
- private readonly maxProviders: number
37
19
 
38
- constructor (components: BitswapSessionComponents, init: BitswapSessionInit) {
39
- this.peers = new PeerSet()
40
- this.root = init.root
41
- this.maxProviders = init.maxProviders
42
- this.log = components.logger.forComponent(`helia:bitswap:session:${init.root}`)
20
+ constructor (components: BitswapSessionComponents, init: CreateSessionOptions) {
21
+ super(components, {
22
+ ...init,
23
+ name: 'helia:bitswap:session'
24
+ })
25
+
43
26
  this.wantList = components.wantList
44
27
  this.network = components.network
45
-
46
- this.queue = new PeerQueue({
47
- concurrency: init.queryConcurrency
48
- })
49
- this.queue.addEventListener('error', (evt) => {
50
- this.log.error('error querying peer for %c', this.root, evt.detail)
51
- })
52
28
  }
53
29
 
54
- async want (cid: CID, options: AbortOptions & ProgressOptions<BitswapWantProgressEvents> = {}): Promise<Uint8Array> {
55
- if (this.peers.size === 0) {
56
- throw new CodeError('Bitswap session had no peers', 'ERR_NO_SESSION_PEERS')
57
- }
58
-
59
- this.log('sending WANT-BLOCK for %c to', cid, this.peers)
30
+ async queryProvider (cid: CID, provider: PeerId, options: AbortOptions): Promise<Uint8Array> {
31
+ this.log('sending WANT-BLOCK for %c to %p', cid, provider)
60
32
 
61
- const result = await Promise.any(
62
- [...this.peers].map(async peerId => {
63
- return this.wantList.wantBlock(cid, {
64
- peerId,
65
- ...options
66
- })
67
- })
68
- )
33
+ const result = await this.wantList.wantSessionBlock(cid, provider, options)
69
34
 
70
- this.log('received block for %c from %p', cid, result.sender)
35
+ this.log('%p %s %c', provider, result.has ? 'has' : 'does not have', cid)
71
36
 
72
- // TODO findNewProviders when promise.any throws aggregate error and signal
73
- // is not aborted
37
+ if (result.has && result.block != null) {
38
+ return result.block
39
+ }
74
40
 
75
- return result.block
41
+ throw new Error('Provider did not have block')
76
42
  }
77
43
 
78
- async findNewProviders (cid: CID, count: number, options: AbortOptions = {}): Promise<void> {
79
- const deferred: DeferredPromise<void> = pDefer()
80
- let found = 0
81
-
82
- this.log('find %d-%d new provider(s) for %c', count, this.maxProviders, cid)
83
-
84
- const source = merge(
85
- [...this.wantList.peers.keys()],
86
- map(this.network.findProviders(cid, options), prov => prov.id)
87
- )
88
-
89
- void Promise.resolve()
90
- .then(async () => {
91
- for await (const peerId of source) {
92
- if (found === this.maxProviders) {
93
- this.queue.clear()
94
- break
95
- }
96
-
97
- // eslint-disable-next-line no-loop-func
98
- await this.queue.add(async () => {
99
- try {
100
- this.log('asking potential session peer %p if they have %c', peerId, cid)
101
- const result = await this.wantList.wantPresence(cid, {
102
- peerId,
103
- ...options
104
- })
105
-
106
- if (!result.has) {
107
- this.log('potential session peer %p did not have %c', peerId, cid)
108
- return
109
- }
110
-
111
- this.log('potential session peer %p had %c', peerId, cid)
112
- found++
113
-
114
- // add to list
115
- this.peers.add(peerId)
116
-
117
- if (found === count) {
118
- this.log('found %d session peers', found)
119
-
120
- deferred.resolve()
121
- }
122
-
123
- if (found === this.maxProviders) {
124
- this.log('found max provider session peers', found)
125
-
126
- this.queue.clear()
127
- }
128
- } catch (err: any) {
129
- this.log.error('error querying potential session peer %p for %c', peerId, cid, err.errors ?? err)
130
- }
131
- }, {
132
- peerId
133
- })
134
- }
135
-
136
- this.log('found %d session peers total', found)
44
+ async * findNewProviders (cid: CID, options: AbortOptions = {}): AsyncGenerator<PeerId> {
45
+ for await (const provider of this.network.findProviders(cid, options)) {
46
+ yield provider.id
47
+ }
48
+ }
137
49
 
138
- if (count > 0) {
139
- deferred.reject(new CodeError(`Found ${found} of ${count} providers`, 'ERR_NO_PROVIDERS_FOUND'))
140
- }
141
- })
50
+ toEvictionKey (provider: PeerId): Uint8Array | string {
51
+ return provider.toBytes()
52
+ }
142
53
 
143
- return deferred.promise
54
+ equals (providerA: PeerId, providerB: PeerId): boolean {
55
+ return providerA.equals(providerB)
144
56
  }
145
57
  }
146
58
 
147
- export async function createBitswapSession (components: BitswapSessionComponents, init: BitswapSessionInit): Promise<BitswapSessionInterface> {
148
- const session = new BitswapSession(components, init)
149
-
150
- await session.findNewProviders(init.root, init.minProviders, {
151
- signal: init.signal
152
- })
153
-
154
- return session
59
+ export function createBitswapSession (components: BitswapSessionComponents, init: CreateSessionOptions): BitswapSession {
60
+ return new BitswapSession(components, init)
155
61
  }
package/src/stats.ts CHANGED
@@ -11,10 +11,10 @@ export class Stats {
11
11
  private readonly duplicateDataReceived?: MetricGroup
12
12
 
13
13
  constructor (components: StatsComponents) {
14
- this.blocksReceived = components.libp2p.metrics?.registerMetricGroup('ipfs_bitswap_received_blocks')
15
- this.duplicateBlocksReceived = components.libp2p.metrics?.registerMetricGroup('ipfs_bitswap_duplicate_received_blocks')
16
- this.dataReceived = components.libp2p.metrics?.registerMetricGroup('ipfs_bitswap_data_received_bytes')
17
- this.duplicateDataReceived = components.libp2p.metrics?.registerMetricGroup('ipfs_bitswap_duplicate_data_received_bytes')
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')
18
18
  }
19
19
 
20
20
  updateBlocksReceived (count: number = 1, peerId?: PeerId): void {