@libp2p/kad-dht 14.0.2 → 14.1.0
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/README.md +36 -0
- package/dist/index.min.js +2 -2
- package/dist/src/constants.d.ts +4 -3
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +8 -3
- package/dist/src/constants.js.map +1 -1
- package/dist/src/content-fetching/index.d.ts +1 -0
- package/dist/src/content-fetching/index.d.ts.map +1 -1
- package/dist/src/content-fetching/index.js +5 -3
- package/dist/src/content-fetching/index.js.map +1 -1
- package/dist/src/index.d.ts +107 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +36 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/kad-dht.d.ts +14 -1
- package/dist/src/kad-dht.d.ts.map +1 -1
- package/dist/src/kad-dht.js +76 -27
- package/dist/src/kad-dht.js.map +1 -1
- package/dist/src/network.d.ts +1 -0
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +4 -5
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-routing/index.d.ts.map +1 -1
- package/dist/src/peer-routing/index.js +9 -10
- package/dist/src/peer-routing/index.js.map +1 -1
- package/dist/src/providers.d.ts +21 -50
- package/dist/src/providers.d.ts.map +1 -1
- package/dist/src/providers.js +51 -192
- package/dist/src/providers.js.map +1 -1
- package/dist/src/query/manager.d.ts +1 -1
- package/dist/src/query/manager.d.ts.map +1 -1
- package/dist/src/query/manager.js +8 -19
- package/dist/src/query/manager.js.map +1 -1
- package/dist/src/query-self.d.ts +3 -1
- package/dist/src/query-self.d.ts.map +1 -1
- package/dist/src/query-self.js +17 -16
- package/dist/src/query-self.js.map +1 -1
- package/dist/src/reprovider.d.ts +63 -0
- package/dist/src/reprovider.d.ts.map +1 -0
- package/dist/src/reprovider.js +161 -0
- package/dist/src/reprovider.js.map +1 -0
- package/dist/src/routing-table/closest-peers.d.ts +1 -0
- package/dist/src/routing-table/closest-peers.d.ts.map +1 -1
- package/dist/src/routing-table/closest-peers.js +7 -0
- package/dist/src/routing-table/closest-peers.js.map +1 -1
- package/dist/src/routing-table/index.d.ts +1 -0
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +14 -11
- package/dist/src/routing-table/index.js.map +1 -1
- package/dist/src/rpc/handlers/get-value.d.ts +1 -0
- package/dist/src/rpc/handlers/get-value.d.ts.map +1 -1
- package/dist/src/rpc/handlers/get-value.js +3 -1
- package/dist/src/rpc/handlers/get-value.js.map +1 -1
- package/dist/src/rpc/handlers/put-value.d.ts +1 -0
- package/dist/src/rpc/handlers/put-value.d.ts.map +1 -1
- package/dist/src/rpc/handlers/put-value.js +3 -1
- package/dist/src/rpc/handlers/put-value.js.map +1 -1
- package/dist/src/rpc/index.d.ts +1 -0
- package/dist/src/rpc/index.d.ts.map +1 -1
- package/dist/src/rpc/index.js +9 -10
- package/dist/src/rpc/index.js.map +1 -1
- package/dist/src/utils.d.ts +20 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +87 -4
- package/dist/src/utils.js.map +1 -1
- package/dist/typedoc-urls.json +3 -0
- package/package.json +11 -13
- package/src/constants.ts +11 -5
- package/src/content-fetching/index.ts +5 -3
- package/src/index.ts +116 -2
- package/src/kad-dht.ts +94 -41
- package/src/network.ts +5 -5
- package/src/peer-routing/index.ts +9 -11
- package/src/providers.ts +57 -244
- package/src/query/manager.ts +12 -28
- package/src/query-self.ts +20 -17
- package/src/reprovider.ts +226 -0
- package/src/routing-table/closest-peers.ts +9 -0
- package/src/routing-table/index.ts +16 -11
- package/src/rpc/handlers/get-value.ts +3 -1
- package/src/rpc/handlers/put-value.ts +3 -1
- package/src/rpc/index.ts +10 -10
- package/src/utils.ts +102 -4
package/dist/src/providers.js
CHANGED
|
@@ -1,220 +1,79 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import cache from 'hashlru';
|
|
3
|
-
import { Key } from 'interface-datastore/key';
|
|
4
|
-
import Queue from 'p-queue';
|
|
1
|
+
import { PeerMap } from '@libp2p/peer-collections';
|
|
5
2
|
import * as varint from 'uint8-varint';
|
|
6
|
-
import {
|
|
7
|
-
import { PROVIDERS_CLEANUP_INTERVAL, PROVIDERS_VALIDITY, PROVIDERS_LRU_CACHE_SIZE, PROVIDER_KEY_PREFIX } from './constants.js';
|
|
3
|
+
import { parseProviderKey, readProviderTime, toProviderKey } from './utils.js';
|
|
8
4
|
/**
|
|
9
|
-
*
|
|
10
|
-
* A provider is a peer that we know to have the content for a given CID.
|
|
11
|
-
*
|
|
12
|
-
* Every `cleanupInterval` providers are checked if they
|
|
13
|
-
* are still valid, i.e. younger than the `provideValidity`.
|
|
14
|
-
* If they are not, they are deleted.
|
|
15
|
-
*
|
|
16
|
-
* To ensure the list survives restarts of the daemon,
|
|
17
|
-
* providers are stored in the datastore, but to ensure
|
|
18
|
-
* access is fast there is an LRU cache in front of that.
|
|
5
|
+
* Provides a mechanism to add and remove provider records from the datastore
|
|
19
6
|
*/
|
|
20
7
|
export class Providers {
|
|
21
8
|
log;
|
|
22
9
|
datastore;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
cleaner;
|
|
29
|
-
constructor(components, init = {}) {
|
|
30
|
-
const { cacheSize, cleanupInterval, provideValidity } = init;
|
|
31
|
-
this.log = components.logger.forComponent('libp2p:kad-dht:providers');
|
|
10
|
+
datastorePrefix;
|
|
11
|
+
lock;
|
|
12
|
+
constructor(components, init) {
|
|
13
|
+
this.log = components.logger.forComponent(`${init.logPrefix}:providers`);
|
|
14
|
+
this.datastorePrefix = `/${init.datastorePrefix}/provider`;
|
|
32
15
|
this.datastore = components.datastore;
|
|
33
|
-
this.
|
|
34
|
-
this.provideValidity = provideValidity ?? PROVIDERS_VALIDITY;
|
|
35
|
-
this.cache = cache(cacheSize ?? PROVIDERS_LRU_CACHE_SIZE);
|
|
36
|
-
this.syncQueue = new Queue({ concurrency: 1 });
|
|
37
|
-
this.started = false;
|
|
38
|
-
}
|
|
39
|
-
isStarted() {
|
|
40
|
-
return this.started;
|
|
16
|
+
this.lock = init.lock;
|
|
41
17
|
}
|
|
42
18
|
/**
|
|
43
|
-
*
|
|
19
|
+
* Add a new provider for the given CID
|
|
44
20
|
*/
|
|
45
|
-
async
|
|
46
|
-
|
|
47
|
-
|
|
21
|
+
async addProvider(cid, provider) {
|
|
22
|
+
const release = await this.lock.readLock();
|
|
23
|
+
try {
|
|
24
|
+
this.log('%p provides %s', provider, cid);
|
|
25
|
+
await this.writeProviderEntry(cid, provider);
|
|
48
26
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this._cleanup().catch(err => {
|
|
52
|
-
this.log.error(err);
|
|
53
|
-
});
|
|
54
|
-
}, this.cleanupInterval);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Release any resources.
|
|
58
|
-
*/
|
|
59
|
-
async stop() {
|
|
60
|
-
this.started = false;
|
|
61
|
-
if (this.cleaner != null) {
|
|
62
|
-
clearInterval(this.cleaner);
|
|
63
|
-
this.cleaner = undefined;
|
|
27
|
+
finally {
|
|
28
|
+
release();
|
|
64
29
|
}
|
|
65
30
|
}
|
|
66
31
|
/**
|
|
67
|
-
*
|
|
32
|
+
* Remove a provider for the given CID
|
|
68
33
|
*/
|
|
69
|
-
async
|
|
70
|
-
await this.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
// Add a delete to the batch for each expired entry
|
|
81
|
-
const { cid, peerId } = parseProviderKey(entry.key);
|
|
82
|
-
const time = readTime(entry.value).getTime();
|
|
83
|
-
const now = Date.now();
|
|
84
|
-
const delta = now - time;
|
|
85
|
-
const expired = delta > this.provideValidity;
|
|
86
|
-
this.log('comparing: %d - %d = %d > %d %s', now, time, delta, this.provideValidity, expired ? '(expired)' : '');
|
|
87
|
-
if (expired) {
|
|
88
|
-
deleteCount++;
|
|
89
|
-
batch.delete(entry.key);
|
|
90
|
-
const peers = deleted.get(cid) ?? new Set();
|
|
91
|
-
peers.add(peerId);
|
|
92
|
-
deleted.set(cid, peers);
|
|
93
|
-
}
|
|
94
|
-
count++;
|
|
95
|
-
}
|
|
96
|
-
catch (err) {
|
|
97
|
-
this.log.error(err.message);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Commit the deletes to the datastore
|
|
101
|
-
if (deleted.size > 0) {
|
|
102
|
-
this.log('deleting %d / %d entries', deleteCount, count);
|
|
103
|
-
await batch.commit();
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
this.log('nothing to delete');
|
|
107
|
-
}
|
|
108
|
-
// Clear expired entries from the cache
|
|
109
|
-
for (const [cid, peers] of deleted) {
|
|
110
|
-
const key = makeProviderKey(cid);
|
|
111
|
-
const provs = this.cache.get(key);
|
|
112
|
-
if (provs != null) {
|
|
113
|
-
for (const peerId of peers) {
|
|
114
|
-
provs.delete(peerId);
|
|
115
|
-
}
|
|
116
|
-
if (provs.size === 0) {
|
|
117
|
-
this.cache.remove(key);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
this.cache.set(key, provs);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
this.log('Cleanup successful (%dms)', Date.now() - start);
|
|
125
|
-
});
|
|
34
|
+
async removeProvider(cid, provider) {
|
|
35
|
+
const release = await this.lock.writeLock();
|
|
36
|
+
try {
|
|
37
|
+
const key = toProviderKey(this.datastorePrefix, cid, provider);
|
|
38
|
+
this.log('%p no longer provides %s', provider, cid);
|
|
39
|
+
await this.datastore.delete(key);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
release();
|
|
43
|
+
}
|
|
126
44
|
}
|
|
127
45
|
/**
|
|
128
|
-
* Get
|
|
46
|
+
* Get a list of providers for the given CID
|
|
129
47
|
*/
|
|
130
|
-
async
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
provs = await loadProviders(
|
|
135
|
-
|
|
48
|
+
async getProviders(cid) {
|
|
49
|
+
const release = await this.lock.readLock();
|
|
50
|
+
try {
|
|
51
|
+
this.log('get providers for %s', cid);
|
|
52
|
+
const provs = await this.loadProviders(cid);
|
|
53
|
+
return [...provs.keys()];
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
release();
|
|
136
57
|
}
|
|
137
|
-
return provs;
|
|
138
58
|
}
|
|
139
59
|
/**
|
|
140
|
-
*
|
|
60
|
+
* Write a provider into the given store
|
|
141
61
|
*/
|
|
142
|
-
async
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.log('loaded %s provs', provs.size);
|
|
147
|
-
const now = new Date();
|
|
148
|
-
provs.set(provider.toString(), now);
|
|
149
|
-
const dsKey = makeProviderKey(cid);
|
|
150
|
-
this.cache.set(dsKey, provs);
|
|
151
|
-
await writeProviderEntry(this.datastore, cid, provider, now);
|
|
152
|
-
});
|
|
62
|
+
async writeProviderEntry(cid, peerId, time = new Date()) {
|
|
63
|
+
const key = toProviderKey(this.datastorePrefix, cid, peerId);
|
|
64
|
+
const buffer = varint.encode(time.getTime());
|
|
65
|
+
await this.datastore.put(key, buffer);
|
|
153
66
|
}
|
|
154
67
|
/**
|
|
155
|
-
*
|
|
68
|
+
* Load providers for the given CID from the store
|
|
156
69
|
*/
|
|
157
|
-
async
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}, {
|
|
165
|
-
// no timeout is specified for this queue so it will not
|
|
166
|
-
// throw, but this is required to get the right return
|
|
167
|
-
// type since p-queue@7.3.4
|
|
168
|
-
throwOnTimeout: true
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Encode the given key its matching datastore key
|
|
174
|
-
*/
|
|
175
|
-
function makeProviderKey(cid) {
|
|
176
|
-
const cidStr = typeof cid === 'string' ? cid : uint8ArrayToString(cid.multihash.bytes, 'base32');
|
|
177
|
-
return `${PROVIDER_KEY_PREFIX}/${cidStr}`;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Write a provider into the given store
|
|
181
|
-
*/
|
|
182
|
-
async function writeProviderEntry(store, cid, peer, time) {
|
|
183
|
-
const dsKey = [
|
|
184
|
-
makeProviderKey(cid),
|
|
185
|
-
'/',
|
|
186
|
-
peer.toString()
|
|
187
|
-
].join('');
|
|
188
|
-
const key = new Key(dsKey);
|
|
189
|
-
const buffer = varint.encode(time.getTime());
|
|
190
|
-
await store.put(key, buffer);
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Parse the CID and provider peer id from the key
|
|
194
|
-
*/
|
|
195
|
-
function parseProviderKey(key) {
|
|
196
|
-
const parts = key.toString().split('/');
|
|
197
|
-
if (parts.length !== 5) {
|
|
198
|
-
throw new Error(`incorrectly formatted provider entry key in datastore: ${key.toString()}`);
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
cid: parts[3],
|
|
202
|
-
peerId: parts[4]
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Load providers for the given CID from the store
|
|
207
|
-
*/
|
|
208
|
-
async function loadProviders(store, cid) {
|
|
209
|
-
const providers = new Map();
|
|
210
|
-
const query = store.query({ prefix: makeProviderKey(cid) });
|
|
211
|
-
for await (const entry of query) {
|
|
212
|
-
const { peerId } = parseProviderKey(entry.key);
|
|
213
|
-
providers.set(peerId, readTime(entry.value));
|
|
70
|
+
async loadProviders(cid) {
|
|
71
|
+
const providers = new PeerMap();
|
|
72
|
+
for await (const entry of this.datastore.query({ prefix: toProviderKey(this.datastorePrefix, cid).toString() })) {
|
|
73
|
+
const { peerId } = parseProviderKey(entry.key);
|
|
74
|
+
providers.set(peerId, readProviderTime(entry.value));
|
|
75
|
+
}
|
|
76
|
+
return providers;
|
|
214
77
|
}
|
|
215
|
-
return providers;
|
|
216
|
-
}
|
|
217
|
-
function readTime(buf) {
|
|
218
|
-
return new Date(varint.decode(buf));
|
|
219
78
|
}
|
|
220
79
|
//# sourceMappingURL=providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export interface CleanUpEvents {
|
|
|
9
9
|
}
|
|
10
10
|
export interface QueryManagerInit {
|
|
11
11
|
logPrefix: string;
|
|
12
|
+
metricsPrefix: string;
|
|
12
13
|
disjointPaths?: number;
|
|
13
14
|
alpha?: number;
|
|
14
15
|
initialQuerySelfHasRun: DeferredPromise<void>;
|
|
@@ -41,7 +42,6 @@ export declare class QueryManager implements Startable {
|
|
|
41
42
|
private readonly routingTable;
|
|
42
43
|
private initialQuerySelfHasRun?;
|
|
43
44
|
private readonly logPrefix;
|
|
44
|
-
private readonly metrics;
|
|
45
45
|
constructor(components: QueryManagerComponents, init: QueryManagerInit);
|
|
46
46
|
isStarted(): boolean;
|
|
47
47
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/query/manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/query/manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,WAAW,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sBAAsB,EAAE,eAAe,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,eAAe,CAAA;IACvB,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,SAAS;IACrC,aAAa,EAAE,MAAM,CAAA;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,kBAAkB,CAAiB;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,sBAAsB,CAAC,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAErB,UAAU,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB;IAkBvE,SAAS,IAAK,OAAO;IAIrB;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAa7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAMpB,GAAG,CAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc,CAAC,UAAU,CAAC;CAsH5G"}
|
|
@@ -21,27 +21,20 @@ export class QueryManager {
|
|
|
21
21
|
routingTable;
|
|
22
22
|
initialQuerySelfHasRun;
|
|
23
23
|
logPrefix;
|
|
24
|
-
metrics;
|
|
25
24
|
constructor(components, init) {
|
|
26
|
-
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
this.running = false;
|
|
30
|
-
this.alpha = alpha ?? ALPHA;
|
|
25
|
+
this.logPrefix = init.logPrefix;
|
|
26
|
+
this.disjointPaths = init.disjointPaths ?? K;
|
|
27
|
+
this.alpha = init.alpha ?? ALPHA;
|
|
31
28
|
this.initialQuerySelfHasRun = init.initialQuerySelfHasRun;
|
|
32
29
|
this.routingTable = init.routingTable;
|
|
33
30
|
this.logger = components.logger;
|
|
34
31
|
this.peerId = components.peerId;
|
|
35
32
|
this.connectionManager = components.connectionManager;
|
|
36
|
-
this.metrics = {
|
|
37
|
-
queries: components.metrics?.registerCounter(`${logPrefix.replaceAll(':', '_')}_queries_total`),
|
|
38
|
-
errors: components.metrics?.registerCounter(`${logPrefix.replaceAll(':', '_')}_query_errors_total`),
|
|
39
|
-
queryTime: components.metrics?.registerMetric(`${logPrefix.replaceAll(':', '_')}_query_time_seconds`)
|
|
40
|
-
};
|
|
41
33
|
// allow us to stop queries on shut down
|
|
42
34
|
this.shutDownController = new AbortController();
|
|
43
35
|
// make sure we don't make a lot of noise in the logs
|
|
44
36
|
setMaxListeners(Infinity, this.shutDownController.signal);
|
|
37
|
+
this.running = false;
|
|
45
38
|
}
|
|
46
39
|
isStarted() {
|
|
47
40
|
return this.running;
|
|
@@ -50,6 +43,9 @@ export class QueryManager {
|
|
|
50
43
|
* Starts the query manager
|
|
51
44
|
*/
|
|
52
45
|
async start() {
|
|
46
|
+
if (this.running) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
53
49
|
this.running = true;
|
|
54
50
|
// allow us to stop queries on shut down
|
|
55
51
|
this.shutDownController = new AbortController();
|
|
@@ -67,7 +63,6 @@ export class QueryManager {
|
|
|
67
63
|
if (!this.running) {
|
|
68
64
|
throw new Error('QueryManager not started');
|
|
69
65
|
}
|
|
70
|
-
const stopQueryTimer = this.metrics.queryTime?.timer();
|
|
71
66
|
if (options.signal == null) {
|
|
72
67
|
// don't let queries run forever
|
|
73
68
|
const signal = AbortSignal.timeout(DEFAULT_QUERY_TIMEOUT);
|
|
@@ -92,7 +87,6 @@ export class QueryManager {
|
|
|
92
87
|
setMaxListeners(Infinity, signal, queryEarlyExitController.signal);
|
|
93
88
|
const log = this.logger.forComponent(`${this.logPrefix}:query:` + uint8ArrayToString(key, 'base58btc'));
|
|
94
89
|
// query a subset of peers up to `kBucketSize / 2` in length
|
|
95
|
-
const startTime = Date.now();
|
|
96
90
|
let queryFinished = false;
|
|
97
91
|
try {
|
|
98
92
|
if (options.isSelfQuery !== true && this.initialQuerySelfHasRun != null) {
|
|
@@ -101,7 +95,6 @@ export class QueryManager {
|
|
|
101
95
|
this.initialQuerySelfHasRun = undefined;
|
|
102
96
|
}
|
|
103
97
|
log('query:start');
|
|
104
|
-
this.metrics?.queries?.increment();
|
|
105
98
|
const id = await convertBuffer(key);
|
|
106
99
|
const peers = this.routingTable.closestPeers(id);
|
|
107
100
|
const peersToQuery = peers.slice(0, Math.min(this.disjointPaths, peers.length));
|
|
@@ -148,9 +141,6 @@ export class QueryManager {
|
|
|
148
141
|
queryFinished = true;
|
|
149
142
|
}
|
|
150
143
|
catch (err) {
|
|
151
|
-
if (!queryFinished) {
|
|
152
|
-
this.metrics?.errors?.increment();
|
|
153
|
-
}
|
|
154
144
|
if (!this.running && err.name === 'QueryAbortedError') {
|
|
155
145
|
// ignore query aborted errors that were thrown during query manager shutdown
|
|
156
146
|
}
|
|
@@ -164,8 +154,7 @@ export class QueryManager {
|
|
|
164
154
|
queryEarlyExitController.abort();
|
|
165
155
|
}
|
|
166
156
|
signal.clear();
|
|
167
|
-
|
|
168
|
-
log('query:done in %dms', Date.now() - startTime);
|
|
157
|
+
log('query:done');
|
|
169
158
|
}
|
|
170
159
|
}
|
|
171
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/query/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EACL,KAAK,EAAE,CAAC,EAAE,qBAAqB,EAChC,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/query/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/src/query-self.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OperationMetrics } from './kad-dht.js';
|
|
1
2
|
import type { PeerRouting } from './peer-routing/index.js';
|
|
2
3
|
import type { RoutingTable } from './routing-table/index.js';
|
|
3
4
|
import type { ComponentLogger, PeerId, Startable } from '@libp2p/interface';
|
|
@@ -11,6 +12,7 @@ export interface QuerySelfInit {
|
|
|
11
12
|
initialInterval?: number;
|
|
12
13
|
queryTimeout?: number;
|
|
13
14
|
initialQuerySelfHasRun: DeferredPromise<void>;
|
|
15
|
+
operationMetrics: OperationMetrics;
|
|
14
16
|
}
|
|
15
17
|
export interface QuerySelfComponents {
|
|
16
18
|
peerId: PeerId;
|
|
@@ -28,7 +30,7 @@ export declare class QuerySelf implements Startable {
|
|
|
28
30
|
private readonly interval;
|
|
29
31
|
private readonly initialInterval;
|
|
30
32
|
private readonly queryTimeout;
|
|
31
|
-
private
|
|
33
|
+
private running;
|
|
32
34
|
private timeoutId?;
|
|
33
35
|
private controller?;
|
|
34
36
|
private initialQuerySelfHasRun?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-self.d.ts","sourceRoot":"","sources":["../../src/query-self.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-self.d.ts","sourceRoot":"","sources":["../../src/query-self.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sBAAsB,EAAE,eAAe,CAAC,IAAI,CAAC,CAAA;IAC7C,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAA+B;IACjD,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,sBAAsB,CAAC,CAAuB;IACtD,OAAO,CAAC,gBAAgB,CAAC,CAAuB;gBAEnC,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,aAAa;IAejE,SAAS,IAAK,OAAO;IAIrB,KAAK,IAAK,IAAI;IAed,IAAI,IAAK,IAAI;IAYP,SAAS,IAAK,OAAO,CAAC,IAAI,CAAC;CA6ElC"}
|
package/dist/src/query-self.js
CHANGED
|
@@ -6,6 +6,7 @@ import take from 'it-take';
|
|
|
6
6
|
import pDefer from 'p-defer';
|
|
7
7
|
import { pEvent } from 'p-event';
|
|
8
8
|
import { QUERY_SELF_INTERVAL, QUERY_SELF_TIMEOUT, K, QUERY_SELF_INITIAL_INTERVAL } from './constants.js';
|
|
9
|
+
import { timeOperationMethod } from './utils.js';
|
|
9
10
|
/**
|
|
10
11
|
* Receives notifications of new peers joining the network that support the DHT protocol
|
|
11
12
|
*/
|
|
@@ -18,32 +19,32 @@ export class QuerySelf {
|
|
|
18
19
|
interval;
|
|
19
20
|
initialInterval;
|
|
20
21
|
queryTimeout;
|
|
21
|
-
|
|
22
|
+
running;
|
|
22
23
|
timeoutId;
|
|
23
24
|
controller;
|
|
24
25
|
initialQuerySelfHasRun;
|
|
25
26
|
querySelfPromise;
|
|
26
27
|
constructor(components, init) {
|
|
27
|
-
const { peerRouting, logPrefix, count, interval, queryTimeout, routingTable } = init;
|
|
28
28
|
this.peerId = components.peerId;
|
|
29
|
-
this.log = components.logger.forComponent(`${logPrefix}:query-self`);
|
|
30
|
-
this.
|
|
31
|
-
this.peerRouting = peerRouting;
|
|
32
|
-
this.routingTable = routingTable;
|
|
33
|
-
this.count = count ?? K;
|
|
34
|
-
this.interval = interval ?? QUERY_SELF_INTERVAL;
|
|
29
|
+
this.log = components.logger.forComponent(`${init.logPrefix}:query-self`);
|
|
30
|
+
this.running = false;
|
|
31
|
+
this.peerRouting = init.peerRouting;
|
|
32
|
+
this.routingTable = init.routingTable;
|
|
33
|
+
this.count = init.count ?? K;
|
|
34
|
+
this.interval = init.interval ?? QUERY_SELF_INTERVAL;
|
|
35
35
|
this.initialInterval = init.initialInterval ?? QUERY_SELF_INITIAL_INTERVAL;
|
|
36
|
-
this.queryTimeout = queryTimeout ?? QUERY_SELF_TIMEOUT;
|
|
36
|
+
this.queryTimeout = init.queryTimeout ?? QUERY_SELF_TIMEOUT;
|
|
37
37
|
this.initialQuerySelfHasRun = init.initialQuerySelfHasRun;
|
|
38
|
+
this.querySelf = timeOperationMethod(this.querySelf.bind(this), init.operationMetrics, 'SELF_QUERY');
|
|
38
39
|
}
|
|
39
40
|
isStarted() {
|
|
40
|
-
return this.
|
|
41
|
+
return this.running;
|
|
41
42
|
}
|
|
42
43
|
start() {
|
|
43
|
-
if (this.
|
|
44
|
+
if (this.running) {
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
46
|
-
this.
|
|
47
|
+
this.running = true;
|
|
47
48
|
clearTimeout(this.timeoutId);
|
|
48
49
|
this.timeoutId = setTimeout(() => {
|
|
49
50
|
this.querySelf()
|
|
@@ -53,7 +54,7 @@ export class QuerySelf {
|
|
|
53
54
|
}, this.initialInterval);
|
|
54
55
|
}
|
|
55
56
|
stop() {
|
|
56
|
-
this.
|
|
57
|
+
this.running = false;
|
|
57
58
|
if (this.timeoutId != null) {
|
|
58
59
|
clearTimeout(this.timeoutId);
|
|
59
60
|
}
|
|
@@ -62,7 +63,7 @@ export class QuerySelf {
|
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
async querySelf() {
|
|
65
|
-
if (!this.
|
|
66
|
+
if (!this.running) {
|
|
66
67
|
this.log('skip self-query because we are not started');
|
|
67
68
|
return;
|
|
68
69
|
}
|
|
@@ -71,7 +72,7 @@ export class QuerySelf {
|
|
|
71
72
|
return this.querySelfPromise.promise;
|
|
72
73
|
}
|
|
73
74
|
this.querySelfPromise = pDefer();
|
|
74
|
-
if (this.
|
|
75
|
+
if (this.running) {
|
|
75
76
|
this.controller = new AbortController();
|
|
76
77
|
const signals = [this.controller.signal];
|
|
77
78
|
// add a shorter timeout if we've already run our initial self query
|
|
@@ -113,7 +114,7 @@ export class QuerySelf {
|
|
|
113
114
|
}
|
|
114
115
|
this.querySelfPromise.resolve();
|
|
115
116
|
this.querySelfPromise = undefined;
|
|
116
|
-
if (!this.
|
|
117
|
+
if (!this.running) {
|
|
117
118
|
return;
|
|
118
119
|
}
|
|
119
120
|
this.timeoutId = setTimeout(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-self.js","sourceRoot":"","sources":["../../src/query-self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,IAAI,MAAM,SAAS,CAAA;AAC1B,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"query-self.js","sourceRoot":"","sources":["../../src/query-self.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
+
import type { ContentRouting } from './content-routing/index.js';
|
|
3
|
+
import type { OperationMetrics } from './kad-dht.js';
|
|
4
|
+
import type { ComponentLogger, Metrics, PeerId } from '@libp2p/interface';
|
|
5
|
+
import type { AddressManager } from '@libp2p/interface-internal';
|
|
6
|
+
import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout';
|
|
7
|
+
import type { Datastore } from 'interface-datastore';
|
|
8
|
+
import type { Mortice } from 'mortice';
|
|
9
|
+
export interface ReproviderComponents {
|
|
10
|
+
peerId: PeerId;
|
|
11
|
+
datastore: Datastore;
|
|
12
|
+
logger: ComponentLogger;
|
|
13
|
+
addressManager: AddressManager;
|
|
14
|
+
metrics?: Metrics;
|
|
15
|
+
}
|
|
16
|
+
export interface ReproviderInit {
|
|
17
|
+
logPrefix: string;
|
|
18
|
+
metricsPrefix: string;
|
|
19
|
+
datastorePrefix: string;
|
|
20
|
+
contentRouting: ContentRouting;
|
|
21
|
+
lock: Mortice;
|
|
22
|
+
operationMetrics: OperationMetrics;
|
|
23
|
+
concurrency?: number;
|
|
24
|
+
maxQueueSize?: number;
|
|
25
|
+
threshold?: number;
|
|
26
|
+
validity?: number;
|
|
27
|
+
interval?: number;
|
|
28
|
+
timeout?: Omit<AdaptiveTimeoutInit, 'metricsName' | 'metrics'>;
|
|
29
|
+
}
|
|
30
|
+
interface ReprovideEvents {
|
|
31
|
+
'reprovide:start': CustomEvent;
|
|
32
|
+
'reprovide:end': CustomEvent;
|
|
33
|
+
}
|
|
34
|
+
export declare class Reprovider extends TypedEventEmitter<ReprovideEvents> {
|
|
35
|
+
private readonly log;
|
|
36
|
+
private readonly reprovideQueue;
|
|
37
|
+
private readonly maxQueueSize;
|
|
38
|
+
private readonly datastore;
|
|
39
|
+
private timeout?;
|
|
40
|
+
private readonly reprovideTimeout;
|
|
41
|
+
private running;
|
|
42
|
+
private shutdownController?;
|
|
43
|
+
private readonly reprovideThreshold;
|
|
44
|
+
private readonly contentRouting;
|
|
45
|
+
private readonly datastorePrefix;
|
|
46
|
+
private readonly addressManager;
|
|
47
|
+
private readonly validity;
|
|
48
|
+
private readonly interval;
|
|
49
|
+
private readonly lock;
|
|
50
|
+
private readonly peerId;
|
|
51
|
+
constructor(components: ReproviderComponents, init: ReproviderInit);
|
|
52
|
+
start(): void;
|
|
53
|
+
stop(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Check all provider records. Delete them if they have expired, reprovide
|
|
56
|
+
* them if the provider is us and the expiry is within the reprovide window.
|
|
57
|
+
*/
|
|
58
|
+
private cleanUp;
|
|
59
|
+
private queueReprovide;
|
|
60
|
+
private reprovide;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=reprovider.d.ts.map
|