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