@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.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +3 -3
- package/dist/src/bitswap.d.ts +2 -2
- package/dist/src/bitswap.d.ts.map +1 -1
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +1 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/index.d.ts +10 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/peer-want-lists/index.d.ts +4 -2
- package/dist/src/peer-want-lists/index.d.ts.map +1 -1
- package/dist/src/peer-want-lists/index.js +27 -2
- package/dist/src/peer-want-lists/index.js.map +1 -1
- package/dist/src/peer-want-lists/ledger.d.ts +14 -0
- package/dist/src/peer-want-lists/ledger.d.ts.map +1 -1
- package/dist/src/peer-want-lists/ledger.js +31 -7
- package/dist/src/peer-want-lists/ledger.js.map +1 -1
- package/package.json +3 -3
- package/src/bitswap.ts +2 -2
- package/src/constants.ts +1 -0
- package/src/index.ts +13 -1
- package/src/peer-want-lists/index.ts +37 -4
- package/src/peer-want-lists/ledger.ts +53 -8
package/dist/src/bitswap.d.ts
CHANGED
|
@@ -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):
|
|
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;
|
|
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"}
|
package/dist/src/constants.d.ts
CHANGED
|
@@ -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"}
|
package/dist/src/constants.js
CHANGED
|
@@ -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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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):
|
|
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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,kCAAkC,EAAE,gCAAgC,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAA;AACtI,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAErE,MAAM,MAAM,yBAAyB,GACnC,8BAA8B,CAAA;AAEhC,MAAM,MAAM,2BAA2B,GACrC,kCAAkC,CAAA;AAEpC,MAAM,MAAM,8BAA8B,GACxC,aAAa,CAAC,gBAAgB,EAAE,GAAG,CAAC,GACpC,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,GAClC,aAAa,CAAC,eAAe,EAAE;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5D,gCAAgC,CAAA;AAElC,YAAY,EAAE,kCAAkC,EAAE,CAAA;AAClD,YAAY,EAAE,gCAAgC,EAAE,CAAA;AAChD,YAAY,EAAE,4BAA4B,EAAE,CAAA;AAC5C,YAAY,EAAE,QAAQ,EAAE,CAAA;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,GAAG,CAAA;IACR,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACxC;;OAEG;IACH,WAAW,IAAI,aAAa,EAAE,CAAA;IAE9B;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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):
|
|
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":"
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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":"AAAA,OAAO,QAAQ,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,uCAAuC,EAAE,MAAM,iBAAiB,CAAA;
|
|
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-
|
|
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-
|
|
55
|
-
"@helia/utils": "2.4.2-
|
|
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):
|
|
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):
|
|
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,
|
|
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):
|
|
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
|
}
|