@helia/bitswap 3.1.2-2c225e85 → 3.1.2-92480ee8

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.
@@ -2,7 +2,7 @@ import { Network } from './network.js';
2
2
  import { PeerWantLists } from './peer-want-lists/index.js';
3
3
  import { Stats } from './stats.js';
4
4
  import { WantList } from './want-list.js';
5
- import type { BitswapOptions, Bitswap as BitswapInterface, BitswapWantProgressEvents, BitswapNotifyProgressEvents, WantListEntry, BitswapComponents } from './index.js';
5
+ import type { BitswapOptions, Bitswap as BitswapInterface, BitswapWantProgressEvents, BitswapNotifyProgressEvents, WantListEntry, BitswapComponents, PeerWantListEntry } from './index.js';
6
6
  import type { CreateSessionOptions, ProviderOptions, SessionBlockBroker } from '@helia/interface';
7
7
  import type { Libp2p, PeerId, AbortOptions } from '@libp2p/interface';
8
8
  import type { Blockstore } from 'interface-blockstore';
@@ -38,7 +38,7 @@ export declare class Bitswap implements BitswapInterface {
38
38
  */
39
39
  notify(cid: CID, options?: ProgressOptions<BitswapNotifyProgressEvents> & AbortOptions): Promise<void>;
40
40
  getWantlist(): WantListEntry[];
41
- getPeerWantlist(peer: PeerId): WantListEntry[] | undefined;
41
+ getPeerWantlist(peer: PeerId): PeerWantListEntry[] | undefined;
42
42
  /**
43
43
  * Start the bitswap node
44
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"bitswap.d.ts","sourceRoot":"","sources":["../../src/bitswap.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,IAAI,gBAAgB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACvK,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,KAAK,EAAmB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,WAAY,SAAQ,YAAY,EAAE,eAAe,CAAC,yBAAyB,CAAC,EAAE,eAAe;IAC5G;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;GAGG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,SAAgB,KAAK,EAAE,KAAK,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;gBAER,UAAU,EAAE,iBAAiB,EAAE,IAAI,GAAE,cAAmB;IAyBrE,aAAa,CAAE,OAAO,GAAE,oBAAyB,GAAG,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IASnI,IAAI,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmCrE;;OAEG;IACG,MAAM,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,eAAe,CAAC,2BAA2B,CAAC,GAAG,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjH,WAAW,IAAK,aAAa,EAAE;IAU/B,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,SAAS;IAI3D;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAK7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAI7B"}
1
+ {"version":3,"file":"bitswap.d.ts","sourceRoot":"","sources":["../../src/bitswap.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,IAAI,gBAAgB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC1L,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,KAAK,EAAmB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,WAAY,SAAQ,YAAY,EAAE,eAAe,CAAC,yBAAyB,CAAC,EAAE,eAAe;IAC5G;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;GAGG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,SAAgB,KAAK,EAAE,KAAK,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;gBAER,UAAU,EAAE,iBAAiB,EAAE,IAAI,GAAE,cAAmB;IAyBrE,aAAa,CAAE,OAAO,GAAE,oBAAyB,GAAG,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IASnI,IAAI,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmCrE;;OAEG;IACG,MAAM,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,eAAe,CAAC,2BAA2B,CAAC,GAAG,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjH,WAAW,IAAK,aAAa,EAAE;IAU/B,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,SAAS;IAI/D;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAK7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -11,4 +11,5 @@ export declare const DEFAULT_SESSION_ROOT_PRIORITY = 1;
11
11
  export declare const DEFAULT_MAX_PROVIDERS_PER_REQUEST = 3;
12
12
  export declare const DEFAULT_MAX_OUTGOING_MESSAGE_SIZE: number;
13
13
  export declare const DEFAULT_MAX_INCOMING_MESSAGE_SIZE: number;
14
+ export declare const DEFAULT_DO_NOT_RESEND_BLOCK_WINDOW: number;
14
15
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,wBAAwB,CAAA;AAChD,eAAO,MAAM,uCAAuC,OAAO,CAAA;AAC3D,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAC/C,eAAO,MAAM,4BAA4B,OAAO,CAAA;AAChD,eAAO,MAAM,+BAA+B,OAAO,CAAA;AACnD,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAC5C,eAAO,MAAM,4BAA4B,OAAO,CAAA;AAChD,eAAO,MAAM,gCAAgC,KAAK,CAAA;AAClD,eAAO,MAAM,oCAAoC,QAAQ,CAAA;AACzD,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAC9C,eAAO,MAAM,iCAAiC,IAAI,CAAA;AAClD,eAAO,MAAM,iCAAiC,QAAkB,CAAA;AAChE,eAAO,MAAM,iCAAiC,QAAoC,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,wBAAwB,CAAA;AAChD,eAAO,MAAM,uCAAuC,OAAO,CAAA;AAC3D,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAC/C,eAAO,MAAM,4BAA4B,OAAO,CAAA;AAChD,eAAO,MAAM,+BAA+B,OAAO,CAAA;AACnD,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAC5C,eAAO,MAAM,4BAA4B,OAAO,CAAA;AAChD,eAAO,MAAM,gCAAgC,KAAK,CAAA;AAClD,eAAO,MAAM,oCAAoC,QAAQ,CAAA;AACzD,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAC9C,eAAO,MAAM,iCAAiC,IAAI,CAAA;AAClD,eAAO,MAAM,iCAAiC,QAAkB,CAAA;AAChE,eAAO,MAAM,iCAAiC,QAAoC,CAAA;AAClF,eAAO,MAAM,kCAAkC,QAAa,CAAA"}
@@ -11,4 +11,5 @@ export const DEFAULT_SESSION_ROOT_PRIORITY = 1;
11
11
  export const DEFAULT_MAX_PROVIDERS_PER_REQUEST = 3;
12
12
  export const DEFAULT_MAX_OUTGOING_MESSAGE_SIZE = 1024 * 1024 * 4;
13
13
  export const DEFAULT_MAX_INCOMING_MESSAGE_SIZE = DEFAULT_MAX_OUTGOING_MESSAGE_SIZE;
14
+ export const DEFAULT_DO_NOT_RESEND_BLOCK_WINDOW = 1_000 * 60;
14
15
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAA;AAChD,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAA;AAC3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAA;AAC/C,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAA;AAChD,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAA;AACnD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAA;AAC5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAA;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAA;AAClD,MAAM,CAAC,MAAM,oCAAoC,GAAG,KAAK,CAAA;AACzD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAA;AAC9C,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAA;AAClD,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAA;AAChE,MAAM,CAAC,MAAM,iCAAiC,GAAG,iCAAiC,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAA;AAChD,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAA;AAC3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAA;AAC/C,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAA;AAChD,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAA;AACnD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAA;AAC5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAA;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAA;AAClD,MAAM,CAAC,MAAM,oCAAoC,GAAG,KAAK,CAAA;AACzD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAA;AAC9C,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAA;AAClD,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAA;AAChE,MAAM,CAAC,MAAM,iCAAiC,GAAG,iCAAiC,CAAA;AAClF,MAAM,CAAC,MAAM,kCAAkC,GAAG,KAAK,GAAG,EAAE,CAAA"}
@@ -25,11 +25,15 @@ export type { BitswapNetworkWantProgressEvents };
25
25
  export type { BitswapNetworkProgressEvents };
26
26
  export type { WantType };
27
27
  export type { BitswapProvider } from './network.ts';
28
+ export type WantStatus = 'want' | 'sending' | 'sent';
28
29
  export interface WantListEntry {
29
30
  cid: CID;
30
31
  priority: number;
31
32
  wantType: WantType;
32
33
  }
34
+ export interface PeerWantListEntry extends WantListEntry {
35
+ status: WantStatus;
36
+ }
33
37
  export interface Bitswap extends Startable {
34
38
  /**
35
39
  * Returns the current state of the wantlist
@@ -39,7 +43,7 @@ export interface Bitswap extends Startable {
39
43
  * Returns the current state of the wantlist for a peer, if it is being
40
44
  * tracked
41
45
  */
42
- getPeerWantlist(peerId: PeerId): WantListEntry[] | undefined;
46
+ getPeerWantlist(peerId: PeerId): PeerWantListEntry[] | undefined;
43
47
  /**
44
48
  * Notify bitswap that a new block is available
45
49
  */
@@ -158,6 +162,11 @@ export interface BitswapOptions {
158
162
  * @default 2097152
159
163
  */
160
164
  maxIncomingMessageSize?: number;
165
+ /**
166
+ * If a block has been sent to a peer and it is requested again by the same
167
+ * peer, do not send it again until this many ms have elapsed
168
+ */
169
+ doNotResendBlockWindow?: number;
161
170
  }
162
171
  export declare const createBitswap: (components: BitswapComponents, options?: BitswapOptions) => Bitswap;
163
172
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAwLtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAA6B,EAAE,UAA0B,EAAE,EAAW,EAAE;IACpG,OAAO,IAAI,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC9C,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAoMtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAA6B,EAAE,UAA0B,EAAE,EAAW,EAAE;IACpG,OAAO,IAAI,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC9C,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { CID } from 'multiformats/cid';
2
2
  import { Ledger } from './ledger.js';
3
- import type { BitswapNotifyProgressEvents, WantListEntry } from '../index.js';
3
+ import type { BitswapNotifyProgressEvents, PeerWantListEntry } from '../index.js';
4
4
  import type { Network } from '../network.js';
5
5
  import type { BitswapMessage } from '../pb/message.js';
6
6
  import type { AbortOptions, ComponentLogger, Libp2p, Metrics, PeerId } from '@libp2p/interface';
@@ -9,6 +9,7 @@ import type { Blockstore } from 'interface-blockstore';
9
9
  import type { ProgressOptions } from 'progress-events';
10
10
  export interface PeerWantListsInit {
11
11
  maxSizeReplaceHasWithBlock?: number;
12
+ doNotResendBlockWindow?: number;
12
13
  }
13
14
  export interface PeerWantListsComponents {
14
15
  blockstore: Blockstore;
@@ -29,11 +30,12 @@ export declare class PeerWantLists {
29
30
  network: Network;
30
31
  readonly ledgerMap: PeerMap<Ledger>;
31
32
  private readonly maxSizeReplaceHasWithBlock?;
33
+ private readonly doNotResendBlockWindow?;
32
34
  private readonly log;
33
35
  private readonly logger;
34
36
  constructor(components: PeerWantListsComponents, init?: PeerWantListsInit);
35
37
  ledgerForPeer(peerId: PeerId): PeerLedger | undefined;
36
- wantListForPeer(peerId: PeerId): WantListEntry[] | undefined;
38
+ wantListForPeer(peerId: PeerId): PeerWantListEntry[] | undefined;
37
39
  peers(): PeerId[];
38
40
  /**
39
41
  * Handle incoming messages
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/peer-want-lists/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAU,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACvG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,aAAa;IACjB,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IACvB,SAAgB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC1C,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAQ;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE3B,UAAU,EAAE,uBAAuB,EAAE,IAAI,GAAE,iBAAsB;IAuB9E,aAAa,CAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAgBtD,eAAe,CAAE,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,SAAS;IAU7D,KAAK,IAAK,MAAM,EAAE;IAIlB;;OAEG;IACG,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDvE,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,2BAA2B,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAenH,gBAAgB,CAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAGxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/peer-want-lists/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACjF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAU,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACvG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,aAAa;IACjB,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IACvB,SAAgB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC1C,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAQ;IACpD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE3B,UAAU,EAAE,uBAAuB,EAAE,IAAI,GAAE,iBAAsB;IAwB9E,aAAa,CAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAgBtD,eAAe,CAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,SAAS;IAajE,KAAK,IAAK,MAAM,EAAE;IAIlB;;OAEG;IACG,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA8EvE,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,2BAA2B,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAenH,gBAAgB,CAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAGxC"}
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-depth */
1
2
  import { trackedPeerMap } from '@libp2p/peer-collections';
2
3
  import { CID } from 'multiformats/cid';
3
4
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
@@ -8,12 +9,14 @@ export class PeerWantLists {
8
9
  network;
9
10
  ledgerMap;
10
11
  maxSizeReplaceHasWithBlock;
12
+ doNotResendBlockWindow;
11
13
  log;
12
14
  logger;
13
15
  constructor(components, init = {}) {
14
16
  this.blockstore = components.blockstore;
15
17
  this.network = components.network;
16
18
  this.maxSizeReplaceHasWithBlock = init.maxSizeReplaceHasWithBlock;
19
+ this.doNotResendBlockWindow = init.doNotResendBlockWindow;
17
20
  this.log = components.logger.forComponent('helia:bitswap:peer-want-lists');
18
21
  this.logger = components.logger;
19
22
  this.ledgerMap = trackedPeerMap({
@@ -48,6 +51,8 @@ export class PeerWantLists {
48
51
  if (ledger == null) {
49
52
  return undefined;
50
53
  }
54
+ // remove any expired wants
55
+ ledger.removeExpiredWants();
51
56
  return [...ledger.wants.values()];
52
57
  }
53
58
  peers() {
@@ -65,12 +70,15 @@ export class PeerWantLists {
65
70
  network: this.network,
66
71
  logger: this.logger
67
72
  }, {
68
- maxSizeReplaceHasWithBlock: this.maxSizeReplaceHasWithBlock
73
+ maxSizeReplaceHasWithBlock: this.maxSizeReplaceHasWithBlock,
74
+ doNotResendBlockWindow: this.doNotResendBlockWindow
69
75
  });
70
76
  this.ledgerMap.set(peerId, ledger);
71
77
  }
72
78
  // record the amount of block data received
73
79
  ledger.receivedBytes(message.blocks?.reduce((acc, curr) => acc + curr.data.byteLength, 0) ?? 0);
80
+ // remove any expired wants
81
+ ledger.removeExpiredWants();
74
82
  if (message.wantlist != null) {
75
83
  // if the message has a full wantlist, clear the current wantlist
76
84
  if (message.wantlist.full === true) {
@@ -91,11 +99,28 @@ export class PeerWantLists {
91
99
  else {
92
100
  this.log('peer %p wanted block for %c', peerId, cid);
93
101
  }
102
+ const existingWant = ledger.wants.get(cidStr);
103
+ // we are already tracking a want for this CID, just update the fields
104
+ if (existingWant != null) {
105
+ const sentOrSending = existingWant.status === 'sent' || existingWant.status === 'sending';
106
+ const wantTypeUpgrade = existingWant.wantType === WantType.WantHave && (entry.wantType == null || entry.wantType === WantType.WantBlock);
107
+ // allow upgrade from WantHave to WantBlock if we've previously
108
+ // sent or are sending a WantHave
109
+ if (sentOrSending && wantTypeUpgrade) {
110
+ existingWant.status = 'want';
111
+ }
112
+ existingWant.priority = entry.priority;
113
+ existingWant.wantType = entry.wantType ?? WantType.WantBlock;
114
+ existingWant.sendDontHave = entry.sendDontHave ?? false;
115
+ continue;
116
+ }
117
+ // add a new want
94
118
  ledger.wants.set(cidStr, {
95
119
  cid,
96
120
  priority: entry.priority,
97
121
  wantType: entry.wantType ?? WantType.WantBlock,
98
- sendDontHave: entry.sendDontHave ?? false
122
+ sendDontHave: entry.sendDontHave ?? false,
123
+ status: 'want'
99
124
  });
100
125
  }
101
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer-want-lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AA6BpC,MAAM,OAAO,aAAa;IACjB,UAAU,CAAY;IACtB,OAAO,CAAS;IACP,SAAS,CAAiB;IACzB,0BAA0B,CAAS;IACnC,GAAG,CAAQ;IACX,MAAM,CAAiB;IAExC,YAAa,UAAmC,EAAE,OAA0B,EAAE;QAC5E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;QACjC,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,0BAA0B,CAAA;QACjE,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAA;QAC1E,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAE/B,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;YAC9B,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC,CAAA;QAEF,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,8CAA8C,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACtF,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;IAED,aAAa,CAAE,MAAc;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEzC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE;YACzB,IAAI,EAAE,MAAM,CAAC,SAAS;YACtB,QAAQ,EAAE,MAAM,CAAC,aAAa;YAC9B,SAAS,EAAE,MAAM,CAAC,aAAa;SAChC,CAAA;IACH,CAAC;IAED,eAAe,CAAE,MAAc;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEzC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,KAAK;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAE,MAAc,EAAE,OAAuB;QAC3D,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEvC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,GAAG,IAAI,MAAM,CAAC;gBAClB,MAAM;gBACN,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,EAAE;gBACD,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;aAC5D,CAAC,CAAA;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACpC,CAAC;QAED,2CAA2C;QAC3C,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAE/F,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,iEAAiE;YACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACtB,CAAC;YAED,wDAAwD;YACxD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACjC,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;gBAEhE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,CAAC,wCAAwC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;oBAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC7B,CAAC;qBAAM,CAAC;oBACN,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;wBACzC,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;oBAC/D,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;oBACtD,CAAC;oBAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;wBACvB,GAAG;wBACH,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS;wBAC9C,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK;qBAC1C,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAC/B,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CAAE,GAAQ,EAAE,OAAoE;QACjG,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAChE,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAChE,CAAA;IACH,CAAC;IAED,gBAAgB,CAAE,MAAc;QAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer-want-lists/index.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ export interface LedgerComponents {
11
11
  }
12
12
  export interface LedgerInit {
13
13
  maxSizeReplaceHasWithBlock?: number;
14
+ doNotResendBlockWindow?: number;
14
15
  }
15
16
  export interface PeerWantListEntry {
16
17
  /**
@@ -34,6 +35,17 @@ export interface PeerWantListEntry {
34
35
  * If we don't have the block and we've told them we don't have the block
35
36
  */
36
37
  sentDoNotHave?: boolean;
38
+ /**
39
+ * If the status is `sending` or `sent`, the block for this CID is or has been
40
+ * sent to the peer so we should not attempt to send it again
41
+ */
42
+ status: 'want' | 'sending' | 'sent';
43
+ /**
44
+ * A timestamp for when this want should be removed from the list, typically
45
+ * this is set with the `sent` status to prevent sending duplicate blocks to a
46
+ * peer. Once it has expired the peer can request the block a subsequent time.
47
+ */
48
+ expires?: number;
37
49
  }
38
50
  export declare class Ledger {
39
51
  peerId: PeerId;
@@ -46,10 +58,12 @@ export declare class Ledger {
46
58
  lastExchange?: number;
47
59
  private readonly maxSizeReplaceHasWithBlock;
48
60
  private readonly log;
61
+ private readonly doNotResendBlockWindow;
49
62
  constructor(components: LedgerComponents, init: LedgerInit);
50
63
  sentBytes(n: number): void;
51
64
  receivedBytes(n: number): void;
52
65
  debtRatio(): number;
66
+ removeExpiredWants(): void;
53
67
  sendBlocksToPeer(options?: AbortOptions): Promise<void>;
54
68
  }
55
69
  //# sourceMappingURL=ledger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../src/peer-want-lists/ledger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAG9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,GAAG,EAAE,GAAG,CAAA;IAER;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;OAGG;IACH,QAAQ,EAAE,QAAQ,CAAA;IAElB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAA;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,qBAAa,MAAM;IACV,MAAM,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IAC5B,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAQ;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU;IAa3D,SAAS,CAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3B,aAAa,CAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAM/B,SAAS,IAAK,MAAM;IAIP,gBAAgB,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CA6EtE"}
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../src/peer-want-lists/ledger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAG9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,GAAG,EAAE,GAAG,CAAA;IAER;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;OAGG;IACH,QAAQ,EAAE,QAAQ,CAAA;IAElB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAA;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;IAEnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,MAAM;IACV,MAAM,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IAC5B,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAQ;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;gBAElC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU;IAc3D,SAAS,CAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3B,aAAa,CAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAM/B,SAAS,IAAK,MAAM;IAIpB,kBAAkB,IAAK,IAAI;IASd,gBAAgB,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAiGtE"}
@@ -1,5 +1,5 @@
1
1
  import toBuffer from 'it-to-buffer';
2
- import { DEFAULT_MAX_SIZE_REPLACE_HAS_WITH_BLOCK } from '../constants.js';
2
+ import { DEFAULT_MAX_SIZE_REPLACE_HAS_WITH_BLOCK, DEFAULT_DO_NOT_RESEND_BLOCK_WINDOW } from '../constants.js';
3
3
  import { BlockPresenceType, WantType } from '../pb/message.js';
4
4
  import { QueuedBitswapMessage } from '../utils/bitswap-message.js';
5
5
  import { cidToPrefix } from '../utils/cid-prefix.js';
@@ -14,6 +14,7 @@ export class Ledger {
14
14
  lastExchange;
15
15
  maxSizeReplaceHasWithBlock;
16
16
  log;
17
+ doNotResendBlockWindow;
17
18
  constructor(components, init) {
18
19
  this.peerId = components.peerId;
19
20
  this.blockstore = components.blockstore;
@@ -24,6 +25,7 @@ export class Ledger {
24
25
  this.bytesSent = 0;
25
26
  this.bytesReceived = 0;
26
27
  this.maxSizeReplaceHasWithBlock = init.maxSizeReplaceHasWithBlock ?? DEFAULT_MAX_SIZE_REPLACE_HAS_WITH_BLOCK;
28
+ this.doNotResendBlockWindow = init.doNotResendBlockWindow ?? DEFAULT_DO_NOT_RESEND_BLOCK_WINDOW;
27
29
  }
28
30
  sentBytes(n) {
29
31
  this.exchangeCount++;
@@ -38,12 +40,35 @@ export class Ledger {
38
40
  debtRatio() {
39
41
  return (this.bytesSent / (this.bytesReceived + 1)); // +1 is to prevent division by zero
40
42
  }
43
+ removeExpiredWants() {
44
+ // remove any expired wants
45
+ this.wants.forEach((value, key) => {
46
+ if (value.expires != null && value.expires < Date.now()) {
47
+ this.wants.delete(key);
48
+ }
49
+ });
50
+ }
41
51
  async sendBlocksToPeer(options) {
42
52
  const message = new QueuedBitswapMessage();
43
53
  const sentBlocks = new Set();
44
- for (const [key, entry] of this.wants.entries()) {
54
+ // remove any expired wants
55
+ this.removeExpiredWants();
56
+ // pick unsent wants
57
+ const unsent = [...this.wants.entries()]
58
+ .filter(([key, value]) => value.status === 'want');
59
+ // update status, ensure we don't send the same blocks repeatedly
60
+ unsent.forEach(([key, value]) => {
61
+ value.status = 'sending';
62
+ });
63
+ for (const [key, entry] of unsent) {
45
64
  try {
46
65
  const block = await toBuffer(this.blockstore.get(entry.cid, options));
66
+ // ensure we still need to send the block/status, status may have
67
+ // changed due to incoming message while we were waiting for async block
68
+ // load
69
+ if (entry.status !== 'sending') {
70
+ continue;
71
+ }
47
72
  // do they want the block or just us to tell them we have the block
48
73
  if (entry.wantType === WantType.WantHave) {
49
74
  if (block.byteLength < this.maxSizeReplaceHasWithBlock) {
@@ -73,11 +98,15 @@ export class Ledger {
73
98
  prefix: cidToPrefix(entry.cid)
74
99
  });
75
100
  }
101
+ entry.status = 'sent';
102
+ entry.expires = Date.now() + this.doNotResendBlockWindow;
76
103
  }
77
104
  catch (err) {
78
105
  if (err.name !== 'NotFoundError') {
79
106
  throw err;
80
107
  }
108
+ // reset status to try again later
109
+ entry.status = 'want';
81
110
  this.log('do not have block for %c', entry.cid);
82
111
  // we don't have the requested block and the remote is not interested
83
112
  // in us telling them that
@@ -102,11 +131,6 @@ export class Ledger {
102
131
  this.log('sent message');
103
132
  // update accounting
104
133
  this.sentBytes([...message.blocks.values()].reduce((acc, curr) => acc + curr.data.byteLength, 0));
105
- // remove sent blocks from local copy of their want list - they can still
106
- // re-request if required
107
- for (const key of sentBlocks) {
108
- this.wants.delete(key);
109
- }
110
134
  }
111
135
  }
112
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/peer-want-lists/ledger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/peer-want-lists/ledger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/bitswap",
3
- "version": "3.1.2-2c225e85",
3
+ "version": "3.1.2-92480ee8",
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",
@@ -51,8 +51,8 @@
51
51
  "docs": "aegir docs"
52
52
  },
53
53
  "dependencies": {
54
- "@helia/interface": "6.1.1-2c225e85",
55
- "@helia/utils": "2.4.2-2c225e85",
54
+ "@helia/interface": "6.1.1-92480ee8",
55
+ "@helia/utils": "2.4.2-92480ee8",
56
56
  "@libp2p/interface": "^3.1.0",
57
57
  "@libp2p/logger": "^6.0.5",
58
58
  "@libp2p/peer-collections": "^7.0.5",
package/src/bitswap.ts CHANGED
@@ -6,7 +6,7 @@ import { PeerWantLists } from './peer-want-lists/index.js'
6
6
  import { createBitswapSession } from './session.js'
7
7
  import { Stats } from './stats.js'
8
8
  import { WantList } from './want-list.js'
9
- import type { BitswapOptions, Bitswap as BitswapInterface, BitswapWantProgressEvents, BitswapNotifyProgressEvents, WantListEntry, BitswapComponents } from './index.js'
9
+ import type { BitswapOptions, Bitswap as BitswapInterface, BitswapWantProgressEvents, BitswapNotifyProgressEvents, WantListEntry, BitswapComponents, PeerWantListEntry } from './index.js'
10
10
  import type { CreateSessionOptions, ProviderOptions, SessionBlockBroker } from '@helia/interface'
11
11
  import type { ComponentLogger, Libp2p, PeerId, AbortOptions } from '@libp2p/interface'
12
12
  import type { Logger } from '@libp2p/logger'
@@ -127,7 +127,7 @@ export class Bitswap implements BitswapInterface {
127
127
  }))
128
128
  }
129
129
 
130
- getPeerWantlist (peer: PeerId): WantListEntry[] | undefined {
130
+ getPeerWantlist (peer: PeerId): PeerWantListEntry[] | undefined {
131
131
  return this.peerWantLists.wantListForPeer(peer)
132
132
  }
133
133
 
package/src/constants.ts CHANGED
@@ -11,3 +11,4 @@ export const DEFAULT_SESSION_ROOT_PRIORITY = 1
11
11
  export const DEFAULT_MAX_PROVIDERS_PER_REQUEST = 3
12
12
  export const DEFAULT_MAX_OUTGOING_MESSAGE_SIZE = 1024 * 1024 * 4
13
13
  export const DEFAULT_MAX_INCOMING_MESSAGE_SIZE = DEFAULT_MAX_OUTGOING_MESSAGE_SIZE
14
+ export const DEFAULT_DO_NOT_RESEND_BLOCK_WINDOW = 1_000 * 60
package/src/index.ts CHANGED
@@ -35,12 +35,18 @@ export type { BitswapNetworkProgressEvents }
35
35
  export type { WantType }
36
36
  export type { BitswapProvider } from './network.ts'
37
37
 
38
+ export type WantStatus = 'want' | 'sending' | 'sent'
39
+
38
40
  export interface WantListEntry {
39
41
  cid: CID
40
42
  priority: number
41
43
  wantType: WantType
42
44
  }
43
45
 
46
+ export interface PeerWantListEntry extends WantListEntry {
47
+ status: WantStatus
48
+ }
49
+
44
50
  export interface Bitswap extends Startable {
45
51
  /**
46
52
  * Returns the current state of the wantlist
@@ -51,7 +57,7 @@ export interface Bitswap extends Startable {
51
57
  * Returns the current state of the wantlist for a peer, if it is being
52
58
  * tracked
53
59
  */
54
- getPeerWantlist(peerId: PeerId): WantListEntry[] | undefined
60
+ getPeerWantlist(peerId: PeerId): PeerWantListEntry[] | undefined
55
61
 
56
62
  /**
57
63
  * Notify bitswap that a new block is available
@@ -188,6 +194,12 @@ export interface BitswapOptions {
188
194
  * @default 2097152
189
195
  */
190
196
  maxIncomingMessageSize?: number
197
+
198
+ /**
199
+ * If a block has been sent to a peer and it is requested again by the same
200
+ * peer, do not send it again until this many ms have elapsed
201
+ */
202
+ doNotResendBlockWindow?: number
191
203
  }
192
204
 
193
205
  export const createBitswap = (components: BitswapComponents, options: BitswapOptions = {}): Bitswap => {
@@ -1,9 +1,11 @@
1
+ /* eslint-disable max-depth */
2
+
1
3
  import { trackedPeerMap } from '@libp2p/peer-collections'
2
4
  import { CID } from 'multiformats/cid'
3
5
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
4
6
  import { WantType } from '../pb/message.js'
5
7
  import { Ledger } from './ledger.js'
6
- import type { BitswapNotifyProgressEvents, WantListEntry } from '../index.js'
8
+ import type { BitswapNotifyProgressEvents, PeerWantListEntry } from '../index.js'
7
9
  import type { Network } from '../network.js'
8
10
  import type { BitswapMessage } from '../pb/message.js'
9
11
  import type { AbortOptions, ComponentLogger, Libp2p, Logger, Metrics, PeerId } from '@libp2p/interface'
@@ -13,6 +15,7 @@ import type { ProgressOptions } from 'progress-events'
13
15
 
14
16
  export interface PeerWantListsInit {
15
17
  maxSizeReplaceHasWithBlock?: number
18
+ doNotResendBlockWindow?: number
16
19
  }
17
20
 
18
21
  export interface PeerWantListsComponents {
@@ -36,6 +39,7 @@ export class PeerWantLists {
36
39
  public network: Network
37
40
  public readonly ledgerMap: PeerMap<Ledger>
38
41
  private readonly maxSizeReplaceHasWithBlock?: number
42
+ private readonly doNotResendBlockWindow?: number
39
43
  private readonly log: Logger
40
44
  private readonly logger: ComponentLogger
41
45
 
@@ -43,6 +47,7 @@ export class PeerWantLists {
43
47
  this.blockstore = components.blockstore
44
48
  this.network = components.network
45
49
  this.maxSizeReplaceHasWithBlock = init.maxSizeReplaceHasWithBlock
50
+ this.doNotResendBlockWindow = init.doNotResendBlockWindow
46
51
  this.log = components.logger.forComponent('helia:bitswap:peer-want-lists')
47
52
  this.logger = components.logger
48
53
 
@@ -78,13 +83,16 @@ export class PeerWantLists {
78
83
  }
79
84
  }
80
85
 
81
- wantListForPeer (peerId: PeerId): WantListEntry[] | undefined {
86
+ wantListForPeer (peerId: PeerId): PeerWantListEntry[] | undefined {
82
87
  const ledger = this.ledgerMap.get(peerId)
83
88
 
84
89
  if (ledger == null) {
85
90
  return undefined
86
91
  }
87
92
 
93
+ // remove any expired wants
94
+ ledger.removeExpiredWants()
95
+
88
96
  return [...ledger.wants.values()]
89
97
  }
90
98
 
@@ -105,7 +113,8 @@ export class PeerWantLists {
105
113
  network: this.network,
106
114
  logger: this.logger
107
115
  }, {
108
- maxSizeReplaceHasWithBlock: this.maxSizeReplaceHasWithBlock
116
+ maxSizeReplaceHasWithBlock: this.maxSizeReplaceHasWithBlock,
117
+ doNotResendBlockWindow: this.doNotResendBlockWindow
109
118
  })
110
119
  this.ledgerMap.set(peerId, ledger)
111
120
  }
@@ -113,6 +122,9 @@ export class PeerWantLists {
113
122
  // record the amount of block data received
114
123
  ledger.receivedBytes(message.blocks?.reduce((acc, curr) => acc + curr.data.byteLength, 0) ?? 0)
115
124
 
125
+ // remove any expired wants
126
+ ledger.removeExpiredWants()
127
+
116
128
  if (message.wantlist != null) {
117
129
  // if the message has a full wantlist, clear the current wantlist
118
130
  if (message.wantlist.full === true) {
@@ -134,11 +146,32 @@ export class PeerWantLists {
134
146
  this.log('peer %p wanted block for %c', peerId, cid)
135
147
  }
136
148
 
149
+ const existingWant = ledger.wants.get(cidStr)
150
+
151
+ // we are already tracking a want for this CID, just update the fields
152
+ if (existingWant != null) {
153
+ const sentOrSending = existingWant.status === 'sent' || existingWant.status === 'sending'
154
+ const wantTypeUpgrade = existingWant.wantType === WantType.WantHave && (entry.wantType == null || entry.wantType === WantType.WantBlock)
155
+
156
+ // allow upgrade from WantHave to WantBlock if we've previously
157
+ // sent or are sending a WantHave
158
+ if (sentOrSending && wantTypeUpgrade) {
159
+ existingWant.status = 'want'
160
+ }
161
+
162
+ existingWant.priority = entry.priority
163
+ existingWant.wantType = entry.wantType ?? WantType.WantBlock
164
+ existingWant.sendDontHave = entry.sendDontHave ?? false
165
+ continue
166
+ }
167
+
168
+ // add a new want
137
169
  ledger.wants.set(cidStr, {
138
170
  cid,
139
171
  priority: entry.priority,
140
172
  wantType: entry.wantType ?? WantType.WantBlock,
141
- sendDontHave: entry.sendDontHave ?? false
173
+ sendDontHave: entry.sendDontHave ?? false,
174
+ status: 'want'
142
175
  })
143
176
  }
144
177
  }