@libp2p/kad-dht 15.0.2 → 15.1.0-aa25d38ab
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 +2 -15
- package/dist/index.min.js.map +7 -0
- package/dist/src/constants.d.ts +1 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +1 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/content-fetching/index.d.ts +4 -4
- package/dist/src/content-fetching/index.d.ts.map +1 -1
- package/dist/src/content-fetching/index.js +40 -13
- package/dist/src/content-fetching/index.js.map +1 -1
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +88 -38
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/index.d.ts +58 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/kad-dht.d.ts +3 -1
- package/dist/src/kad-dht.d.ts.map +1 -1
- package/dist/src/kad-dht.js +14 -10
- package/dist/src/kad-dht.js.map +1 -1
- package/dist/src/message/dht.d.ts +1 -1
- package/dist/src/message/dht.d.ts.map +1 -1
- package/dist/src/message/dht.js +0 -5
- package/dist/src/message/dht.js.map +1 -1
- package/dist/src/network.d.ts +14 -8
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +17 -16
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-distance-list.d.ts +10 -3
- package/dist/src/peer-distance-list.d.ts.map +1 -1
- package/dist/src/peer-distance-list.js +13 -5
- package/dist/src/peer-distance-list.js.map +1 -1
- package/dist/src/peer-routing/index.d.ts +10 -8
- package/dist/src/peer-routing/index.d.ts.map +1 -1
- package/dist/src/peer-routing/index.js +79 -49
- package/dist/src/peer-routing/index.js.map +1 -1
- package/dist/src/providers.d.ts +4 -4
- package/dist/src/providers.d.ts.map +1 -1
- package/dist/src/providers.js +12 -12
- package/dist/src/providers.js.map +1 -1
- package/dist/src/query/events.d.ts +15 -3
- package/dist/src/query/events.d.ts.map +1 -1
- package/dist/src/query/events.js +9 -0
- package/dist/src/query/events.js.map +1 -1
- package/dist/src/query/manager.d.ts +3 -5
- package/dist/src/query/manager.d.ts.map +1 -1
- package/dist/src/query/manager.js +41 -16
- package/dist/src/query/manager.js.map +1 -1
- package/dist/src/query/query-path.d.ts +10 -14
- package/dist/src/query/query-path.d.ts.map +1 -1
- package/dist/src/query/query-path.js +67 -53
- package/dist/src/query/query-path.js.map +1 -1
- package/dist/src/query/types.d.ts +6 -5
- package/dist/src/query/types.d.ts.map +1 -1
- package/dist/src/query-self.d.ts +2 -3
- package/dist/src/query-self.d.ts.map +1 -1
- package/dist/src/query-self.js +11 -14
- package/dist/src/query-self.js.map +1 -1
- package/dist/src/routing-table/closest-peers.js +1 -1
- package/dist/src/routing-table/closest-peers.js.map +1 -1
- package/dist/src/routing-table/k-bucket.js +1 -1
- package/dist/src/routing-table/k-bucket.js.map +1 -1
- package/dist/src/rpc/handlers/add-provider.d.ts +1 -1
- package/dist/src/rpc/handlers/add-provider.d.ts.map +1 -1
- package/dist/src/rpc/handlers/get-providers.js +1 -1
- package/dist/src/rpc/handlers/get-providers.js.map +1 -1
- package/dist/src/rpc/index.d.ts +7 -7
- package/dist/src/rpc/index.d.ts.map +1 -1
- package/dist/src/rpc/index.js +1 -1
- package/dist/src/rpc/index.js.map +1 -1
- package/dist/src/topology-listener.d.ts +2 -2
- package/dist/src/topology-listener.d.ts.map +1 -1
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +4 -0
- package/dist/src/utils.js.map +1 -1
- package/package.json +30 -39
- package/src/constants.ts +1 -1
- package/src/content-fetching/index.ts +41 -14
- package/src/content-routing/index.ts +93 -45
- package/src/index.ts +65 -6
- package/src/kad-dht.ts +14 -10
- package/src/message/dht.ts +2 -7
- package/src/network.ts +36 -22
- package/src/peer-distance-list.ts +19 -7
- package/src/peer-routing/index.ts +84 -53
- package/src/providers.ts +13 -13
- package/src/query/events.ts +27 -3
- package/src/query/manager.ts +48 -22
- package/src/query/query-path.ts +86 -76
- package/src/query/types.ts +7 -5
- package/src/query-self.ts +15 -17
- package/src/routing-table/closest-peers.ts +1 -1
- package/src/routing-table/k-bucket.ts +1 -1
- package/src/rpc/handlers/add-provider.ts +1 -1
- package/src/rpc/handlers/get-providers.ts +1 -1
- package/src/rpc/index.ts +12 -8
- package/src/topology-listener.ts +2 -2
- package/src/utils.ts +9 -0
- package/dist/typedoc-urls.json +0 -59
package/dist/src/query/events.js
CHANGED
|
@@ -75,4 +75,13 @@ export function dialPeerEvent(fields, options = {}) {
|
|
|
75
75
|
options.onProgress?.(new CustomEvent('kad-dht:query:dial-peer', { detail: event }));
|
|
76
76
|
return event;
|
|
77
77
|
}
|
|
78
|
+
export function pathEndedEvent(fields, options = {}) {
|
|
79
|
+
const event = {
|
|
80
|
+
...fields,
|
|
81
|
+
name: 'PATH_ENDED',
|
|
82
|
+
type: 8
|
|
83
|
+
};
|
|
84
|
+
options.onProgress?.(new CustomEvent('kad-dht:query:path-ended', { detail: event }));
|
|
85
|
+
return event;
|
|
86
|
+
}
|
|
78
87
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/query/events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/query/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import type { ComponentLogger, Metrics, PeerId, RoutingOptions, Startable } from
|
|
|
5
5
|
import type { ConnectionManager } from '@libp2p/interface-internal';
|
|
6
6
|
import type { DeferredPromise } from 'p-defer';
|
|
7
7
|
export interface CleanUpEvents {
|
|
8
|
-
|
|
8
|
+
cleanup: CustomEvent;
|
|
9
9
|
}
|
|
10
10
|
export interface QueryManagerInit {
|
|
11
11
|
logPrefix: string;
|
|
@@ -13,6 +13,7 @@ export interface QueryManagerInit {
|
|
|
13
13
|
disjointPaths?: number;
|
|
14
14
|
alpha?: number;
|
|
15
15
|
initialQuerySelfHasRun: DeferredPromise<void>;
|
|
16
|
+
allowQueryWithZeroPeers?: boolean;
|
|
16
17
|
routingTable: RoutingTable;
|
|
17
18
|
}
|
|
18
19
|
export interface QueryManagerComponents {
|
|
@@ -22,10 +23,6 @@ export interface QueryManagerComponents {
|
|
|
22
23
|
connectionManager: ConnectionManager;
|
|
23
24
|
}
|
|
24
25
|
export interface QueryOptions extends RoutingOptions {
|
|
25
|
-
/**
|
|
26
|
-
* A timeout for subqueries executed as part of the main query
|
|
27
|
-
*/
|
|
28
|
-
queryFuncTimeout?: number;
|
|
29
26
|
isSelfQuery?: boolean;
|
|
30
27
|
}
|
|
31
28
|
/**
|
|
@@ -42,6 +39,7 @@ export declare class QueryManager implements Startable {
|
|
|
42
39
|
private readonly routingTable;
|
|
43
40
|
private initialQuerySelfHasRun?;
|
|
44
41
|
private readonly logPrefix;
|
|
42
|
+
private readonly allowQueryWithZeroPeers;
|
|
45
43
|
constructor(components: QueryManagerComponents, init: QueryManagerInit);
|
|
46
44
|
isStarted(): boolean;
|
|
47
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/query/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/query/manager.ts"],"names":[],"mappings":"AAYA,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,OAAO,EAAE,WAAW,CAAA;CACrB;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,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,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,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;IAClC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;gBAEpC,UAAU,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB;IAmBvE,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;CAkJ5G"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { setMaxListeners } from '@libp2p/interface';
|
|
2
|
-
import {
|
|
2
|
+
import { createScalableCuckooFilter } from '@libp2p/utils/filters';
|
|
3
3
|
import { anySignal } from 'any-signal';
|
|
4
4
|
import merge from 'it-merge';
|
|
5
|
+
import { pEvent } from 'p-event';
|
|
5
6
|
import { raceSignal } from 'race-signal';
|
|
6
7
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
7
8
|
import { ALPHA, K, DEFAULT_QUERY_TIMEOUT } from '../constants.js';
|
|
@@ -21,6 +22,7 @@ export class QueryManager {
|
|
|
21
22
|
routingTable;
|
|
22
23
|
initialQuerySelfHasRun;
|
|
23
24
|
logPrefix;
|
|
25
|
+
allowQueryWithZeroPeers;
|
|
24
26
|
constructor(components, init) {
|
|
25
27
|
this.logPrefix = init.logPrefix;
|
|
26
28
|
this.disjointPaths = init.disjointPaths ?? K;
|
|
@@ -30,6 +32,7 @@ export class QueryManager {
|
|
|
30
32
|
this.logger = components.logger;
|
|
31
33
|
this.peerId = components.peerId;
|
|
32
34
|
this.connectionManager = components.connectionManager;
|
|
35
|
+
this.allowQueryWithZeroPeers = init.allowQueryWithZeroPeers ?? false;
|
|
33
36
|
// allow us to stop queries on shut down
|
|
34
37
|
this.shutDownController = new AbortController();
|
|
35
38
|
// make sure we don't make a lot of noise in the logs
|
|
@@ -89,34 +92,53 @@ export class QueryManager {
|
|
|
89
92
|
// query a subset of peers up to `kBucketSize / 2` in length
|
|
90
93
|
let queryFinished = false;
|
|
91
94
|
try {
|
|
95
|
+
if (this.routingTable.size === 0 && !this.allowQueryWithZeroPeers) {
|
|
96
|
+
log('routing table was empty, waiting for some peers before running%s query', options.isSelfQuery === true ? ' self' : '');
|
|
97
|
+
// wait to discover at least one DHT peer that isn't us
|
|
98
|
+
await pEvent(this.routingTable, 'peer:add', {
|
|
99
|
+
signal,
|
|
100
|
+
filter: (event) => !this.peerId.equals(event.detail)
|
|
101
|
+
});
|
|
102
|
+
log('routing table has peers, continuing with%s query', options.isSelfQuery === true ? ' self' : '');
|
|
103
|
+
}
|
|
92
104
|
if (options.isSelfQuery !== true && this.initialQuerySelfHasRun != null) {
|
|
93
|
-
log('waiting for initial
|
|
105
|
+
log('waiting for initial self query before continuing');
|
|
94
106
|
await raceSignal(this.initialQuerySelfHasRun.promise, signal);
|
|
95
107
|
this.initialQuerySelfHasRun = undefined;
|
|
96
108
|
}
|
|
97
109
|
log('query:start');
|
|
98
110
|
const id = await convertBuffer(key);
|
|
99
|
-
const peers = this.routingTable.closestPeers(id);
|
|
100
|
-
|
|
111
|
+
const peers = this.routingTable.closestPeers(id, this.routingTable.kBucketSize);
|
|
112
|
+
// split peers into d buckets evenly(ish)
|
|
113
|
+
const peersToQuery = peers.sort(() => {
|
|
114
|
+
if (Math.random() > 0.5) {
|
|
115
|
+
return 1;
|
|
116
|
+
}
|
|
117
|
+
return -1;
|
|
118
|
+
})
|
|
119
|
+
.reduce((acc, curr, index) => {
|
|
120
|
+
acc[index % this.disjointPaths].push(curr);
|
|
121
|
+
return acc;
|
|
122
|
+
}, new Array(this.disjointPaths).fill(0).map(() => []))
|
|
123
|
+
.filter(peers => peers.length > 0);
|
|
101
124
|
if (peers.length === 0) {
|
|
102
|
-
log.error('
|
|
125
|
+
log.error('running query with no peers');
|
|
103
126
|
return;
|
|
104
127
|
}
|
|
105
128
|
// make sure we don't get trapped in a loop
|
|
106
|
-
const peersSeen =
|
|
129
|
+
const peersSeen = createScalableCuckooFilter(1024);
|
|
107
130
|
// Create query paths from the starting peers
|
|
108
131
|
const paths = peersToQuery.map((peer, index) => {
|
|
109
132
|
return queryPath({
|
|
110
133
|
...options,
|
|
111
134
|
key,
|
|
112
|
-
|
|
135
|
+
startingPeers: peer,
|
|
113
136
|
ourPeerId: this.peerId,
|
|
114
137
|
signal,
|
|
115
138
|
query: queryFunc,
|
|
116
|
-
|
|
139
|
+
path: index,
|
|
117
140
|
numPaths: peersToQuery.length,
|
|
118
141
|
alpha: this.alpha,
|
|
119
|
-
queryFuncTimeout: options.queryFuncTimeout,
|
|
120
142
|
log,
|
|
121
143
|
peersSeen,
|
|
122
144
|
onProgress: options.onProgress,
|
|
@@ -131,21 +153,24 @@ export class QueryManager {
|
|
|
131
153
|
if (event.name === 'PEER_RESPONSE') {
|
|
132
154
|
for (const peer of [...event.closer, ...event.providers]) {
|
|
133
155
|
// eslint-disable-next-line max-depth
|
|
134
|
-
if (!(await this.connectionManager.isDialable(peer.multiaddrs
|
|
156
|
+
if (!(await this.connectionManager.isDialable(peer.multiaddrs, {
|
|
157
|
+
signal
|
|
158
|
+
}))) {
|
|
135
159
|
continue;
|
|
136
160
|
}
|
|
137
|
-
await this.routingTable.add(peer.id
|
|
161
|
+
await this.routingTable.add(peer.id, {
|
|
162
|
+
signal
|
|
163
|
+
});
|
|
138
164
|
}
|
|
139
165
|
}
|
|
166
|
+
signal.throwIfAborted();
|
|
140
167
|
yield event;
|
|
141
168
|
}
|
|
142
169
|
queryFinished = true;
|
|
143
170
|
}
|
|
144
171
|
catch (err) {
|
|
145
|
-
if (
|
|
146
|
-
// ignore
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
172
|
+
if (this.running) {
|
|
173
|
+
// ignore errors thrown during shut down
|
|
149
174
|
throw err;
|
|
150
175
|
}
|
|
151
176
|
}
|
|
@@ -155,7 +180,7 @@ export class QueryManager {
|
|
|
155
180
|
queryEarlyExitController.abort();
|
|
156
181
|
}
|
|
157
182
|
signal.clear();
|
|
158
|
-
log('query
|
|
183
|
+
log('query finished');
|
|
159
184
|
}
|
|
160
185
|
}
|
|
161
186
|
}
|
|
@@ -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,
|
|
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,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,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;AAiC3C;;GAEG;AACH,MAAM,OAAO,YAAY;IAChB,aAAa,CAAQ;IACX,KAAK,CAAQ;IACtB,kBAAkB,CAAiB;IACnC,OAAO,CAAS;IACP,MAAM,CAAiB;IACvB,MAAM,CAAQ;IACd,iBAAiB,CAAmB;IACpC,YAAY,CAAc;IACnC,sBAAsB,CAAwB;IACrC,SAAS,CAAQ;IACjB,uBAAuB,CAAS;IAEjD,YAAa,UAAkC,EAAE,IAAsB;QACrE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;QAChC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAA;QACzD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QACrC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAA;QACrD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,IAAI,KAAK,CAAA;QAEpE,wCAAwC;QACxC,IAAI,CAAC,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAA;QAC/C,qDAAqD;QACrD,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAEzD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QAEnB,wCAAwC;QACxC,IAAI,CAAC,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAA;QAC/C,qDAAqD;QACrD,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QAEpB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,CAAE,GAAG,CAAE,GAAe,EAAE,SAAoB,EAAE,UAAwB,EAAE;QAC5E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC3B,gCAAgC;YAChC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;YAEzD,6DAA6D;YAC7D,wDAAwD;YACxD,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAEjC,OAAO,GAAG;gBACR,GAAG,OAAO;gBACV,MAAM;aACP,CAAA;QACH,CAAC;QAED,sEAAsE;QACtE,2DAA2D;QAC3D,MAAM,wBAAwB,GAAG,IAAI,eAAe,EAAE,CAAA;QAEtD,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,IAAI,CAAC,kBAAkB,CAAC,MAAM;YAC9B,wBAAwB,CAAC,MAAM;YAC/B,OAAO,CAAC,MAAM;SACf,CAAC,CAAA;QAEF,qEAAqE;QACrE,wDAAwD;QACxD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAA;QAElE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,SAAS,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAA;QAEvG,4DAA4D;QAC5D,IAAI,aAAa,GAAG,KAAK,CAAA;QAEzB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAClE,GAAG,CAAC,wEAAwE,EAAE,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBAC1H,uDAAuD;gBACvD,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE;oBAC1C,MAAM;oBACN,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;iBACrD,CAAC,CAAA;gBACF,GAAG,CAAC,kDAAkD,EAAE,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACtG,CAAC;YAED,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,EAAE,CAAC;gBACxE,GAAG,CAAC,kDAAkD,CAAC,CAAA;gBAEvD,MAAM,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAE7D,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAA;YACzC,CAAC;YAED,GAAG,CAAC,aAAa,CAAC,CAAA;YAElB,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;YAE/E,yCAAyC;YACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;oBACxB,OAAO,CAAC,CAAA;gBACV,CAAC;gBAED,OAAO,CAAC,CAAC,CAAA;YACX,CAAC,CAAC;iBACC,MAAM,CAAC,CAAC,GAAe,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;gBACvC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAE1C,OAAO,GAAG,CAAA;YACZ,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;iBACtD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAEpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;gBACxC,OAAM;YACR,CAAC;YAED,2CAA2C;YAC3C,MAAM,SAAS,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAA;YAElD,6CAA6C;YAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC7C,OAAO,SAAS,CAAC;oBACf,GAAG,OAAO;oBACV,GAAG;oBACH,aAAa,EAAE,IAAI;oBACnB,SAAS,EAAE,IAAI,CAAC,MAAM;oBACtB,MAAM;oBACN,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE,KAAK;oBACX,QAAQ,EAAE,YAAY,CAAC,MAAM;oBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,GAAG;oBACH,SAAS;oBACT,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;iBAC1C,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,8FAA8F;YAC9F,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;gBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACjC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;gBACvC,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACnC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;wBACzD,qCAAqC;wBACrC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE;4BAC7D,MAAM;yBACP,CAAC,CAAC,EAAE,CAAC;4BACJ,SAAQ;wBACV,CAAC;wBAED,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;4BACnC,MAAM;yBACP,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,cAAc,EAAE,CAAA;gBACvB,MAAM,KAAK,CAAA;YACb,CAAC;YAED,aAAa,GAAG,IAAI,CAAA;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,wCAAwC;gBACxC,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,GAAG,CAAC,oBAAoB,CAAC,CAAA;gBACzB,wBAAwB,CAAC,KAAK,EAAE,CAAA;YAClC,CAAC;YAED,MAAM,CAAC,KAAK,EAAE,CAAA;YAEd,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -2,7 +2,7 @@ import type { QueryEvent } from '../index.js';
|
|
|
2
2
|
import type { QueryFunc } from '../query/types.js';
|
|
3
3
|
import type { Logger, PeerId, RoutingOptions } from '@libp2p/interface';
|
|
4
4
|
import type { ConnectionManager } from '@libp2p/interface-internal';
|
|
5
|
-
import type {
|
|
5
|
+
import type { Filter } from '@libp2p/utils/filters';
|
|
6
6
|
export interface QueryPathOptions extends RoutingOptions {
|
|
7
7
|
/**
|
|
8
8
|
* What are we trying to find
|
|
@@ -11,15 +11,11 @@ export interface QueryPathOptions extends RoutingOptions {
|
|
|
11
11
|
/**
|
|
12
12
|
* Where we start our query
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
startingPeers: PeerId[];
|
|
15
15
|
/**
|
|
16
16
|
* Who we are
|
|
17
17
|
*/
|
|
18
18
|
ourPeerId: PeerId;
|
|
19
|
-
/**
|
|
20
|
-
* When to stop querying
|
|
21
|
-
*/
|
|
22
|
-
signal: AbortSignal;
|
|
23
19
|
/**
|
|
24
20
|
* The query function to run with each peer
|
|
25
21
|
*/
|
|
@@ -29,17 +25,13 @@ export interface QueryPathOptions extends RoutingOptions {
|
|
|
29
25
|
*/
|
|
30
26
|
alpha: number;
|
|
31
27
|
/**
|
|
32
|
-
*
|
|
28
|
+
* The index within `k` this path represents
|
|
33
29
|
*/
|
|
34
|
-
|
|
30
|
+
path: number;
|
|
35
31
|
/**
|
|
36
|
-
* How many
|
|
32
|
+
* How many disjoint paths are in this query
|
|
37
33
|
*/
|
|
38
34
|
numPaths: number;
|
|
39
|
-
/**
|
|
40
|
-
* A timeout for queryFunc in ms
|
|
41
|
-
*/
|
|
42
|
-
queryFuncTimeout?: number;
|
|
43
35
|
/**
|
|
44
36
|
* Query log
|
|
45
37
|
*/
|
|
@@ -47,11 +39,15 @@ export interface QueryPathOptions extends RoutingOptions {
|
|
|
47
39
|
/**
|
|
48
40
|
* Set of peers seen by this and other paths
|
|
49
41
|
*/
|
|
50
|
-
peersSeen:
|
|
42
|
+
peersSeen: Filter;
|
|
51
43
|
/**
|
|
52
44
|
* The libp2p connection manager
|
|
53
45
|
*/
|
|
54
46
|
connectionManager: ConnectionManager;
|
|
47
|
+
/**
|
|
48
|
+
* The overall query abort signal
|
|
49
|
+
*/
|
|
50
|
+
signal: AbortSignal;
|
|
55
51
|
}
|
|
56
52
|
/**
|
|
57
53
|
* Walks a path through the DHT, calling the passed query function for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-path.d.ts","sourceRoot":"","sources":["../../../src/query/query-path.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-path.d.ts","sourceRoot":"","sources":["../../../src/query/query-path.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAA;AAC/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD;;OAEG;IACH,GAAG,EAAE,UAAU,CAAA;IAEf;;OAEG;IACH,aAAa,EAAE,MAAM,EAAE,CAAA;IAEvB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;IAEhB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,CAAA;IAEpC;;OAEG;IACH,MAAM,EAAE,WAAW,CAAA;CACpB;AAMD;;;GAGG;AACH,wBAAwB,SAAS,CAAE,OAAO,EAAE,gBAAgB,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAwIzG"}
|
|
@@ -1,60 +1,76 @@
|
|
|
1
|
-
import { setMaxListeners } from '@libp2p/interface';
|
|
2
1
|
import { Queue } from '@libp2p/utils/queue';
|
|
3
|
-
import {
|
|
2
|
+
import { pushable } from 'it-pushable';
|
|
4
3
|
import { xor as uint8ArrayXor } from 'uint8arrays/xor';
|
|
5
4
|
import { xorCompare as uint8ArrayXorCompare } from 'uint8arrays/xor-compare';
|
|
6
5
|
import { QueryAbortedError } from '../errors.js';
|
|
7
6
|
import { convertPeerId, convertBuffer } from '../utils.js';
|
|
8
|
-
import { queryErrorEvent } from './events.js';
|
|
7
|
+
import { pathEndedEvent, queryErrorEvent } from './events.js';
|
|
9
8
|
/**
|
|
10
9
|
* Walks a path through the DHT, calling the passed query function for
|
|
11
10
|
* every peer encountered that we have not seen before
|
|
12
11
|
*/
|
|
13
12
|
export async function* queryPath(options) {
|
|
14
|
-
const { key,
|
|
13
|
+
const { key, startingPeers, ourPeerId, query, alpha, path, numPaths, log, peersSeen, connectionManager, signal } = options;
|
|
14
|
+
const events = pushable({
|
|
15
|
+
objectMode: true
|
|
16
|
+
});
|
|
15
17
|
// Only ALPHA node/value lookups are allowed at any given time for each process
|
|
16
18
|
// https://github.com/libp2p/specs/tree/master/kad-dht#alpha-concurrency-parameter-%CE%B1
|
|
17
19
|
const queue = new Queue({
|
|
18
20
|
concurrency: alpha,
|
|
19
21
|
sort: (a, b) => uint8ArrayXorCompare(a.options.distance, b.options.distance)
|
|
20
22
|
});
|
|
23
|
+
queue.addEventListener('idle', () => {
|
|
24
|
+
events.push(pathEndedEvent({
|
|
25
|
+
path: {
|
|
26
|
+
index: path,
|
|
27
|
+
queued: queue.queued,
|
|
28
|
+
running: queue.running,
|
|
29
|
+
total: queue.size
|
|
30
|
+
}
|
|
31
|
+
}, options));
|
|
32
|
+
events.end();
|
|
33
|
+
});
|
|
34
|
+
queue.addEventListener('error', (evt) => {
|
|
35
|
+
log.error('error during query - %e', evt.detail);
|
|
36
|
+
});
|
|
37
|
+
signal.addEventListener('abort', () => {
|
|
38
|
+
queue.abort();
|
|
39
|
+
events.end(new QueryAbortedError());
|
|
40
|
+
});
|
|
21
41
|
// perform lookups on kadId, not the actual value
|
|
22
42
|
const kadId = await convertBuffer(key);
|
|
23
43
|
/**
|
|
24
|
-
* Adds the passed peer to the query queue if it's not us and no
|
|
25
|
-
*
|
|
44
|
+
* Adds the passed peer to the query queue if it's not us and no other path
|
|
45
|
+
* has passed through this peer
|
|
26
46
|
*/
|
|
27
47
|
function queryPeer(peer, peerKadId) {
|
|
28
48
|
if (peer == null) {
|
|
29
49
|
return;
|
|
30
50
|
}
|
|
31
|
-
peersSeen.add(peer);
|
|
51
|
+
peersSeen.add(peer.id.toMultihash().bytes);
|
|
32
52
|
const peerXor = uint8ArrayXor(peerKadId, kadId);
|
|
33
53
|
queue.add(async () => {
|
|
34
|
-
const signals = [signal];
|
|
35
|
-
if (queryFuncTimeout != null) {
|
|
36
|
-
signals.push(AbortSignal.timeout(queryFuncTimeout));
|
|
37
|
-
}
|
|
38
|
-
const compoundSignal = anySignal(signals);
|
|
39
|
-
// this signal can get listened to a lot
|
|
40
|
-
setMaxListeners(Infinity, compoundSignal);
|
|
41
54
|
try {
|
|
42
55
|
for await (const event of query({
|
|
43
56
|
...options,
|
|
44
57
|
key,
|
|
45
58
|
peer,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
path: {
|
|
60
|
+
index: path,
|
|
61
|
+
queued: queue.queued,
|
|
62
|
+
running: queue.running,
|
|
63
|
+
total: queue.size
|
|
64
|
+
},
|
|
65
|
+
numPaths,
|
|
66
|
+
peerKadId,
|
|
67
|
+
signal
|
|
49
68
|
})) {
|
|
50
|
-
if (compoundSignal.aborted) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
69
|
// if there are closer peers and the query has not completed, continue the query
|
|
54
70
|
if (event.name === 'PEER_RESPONSE') {
|
|
55
71
|
for (const closerPeer of event.closer) {
|
|
56
|
-
if (peersSeen.has(closerPeer.id)) { // eslint-disable-line max-depth
|
|
57
|
-
log
|
|
72
|
+
if (peersSeen.has(closerPeer.id.toMultihash().bytes)) { // eslint-disable-line max-depth
|
|
73
|
+
log('already seen %p in query', closerPeer.id);
|
|
58
74
|
continue;
|
|
59
75
|
}
|
|
60
76
|
if (ourPeerId.equals(closerPeer.id)) { // eslint-disable-line max-depth
|
|
@@ -69,50 +85,48 @@ export async function* queryPath(options) {
|
|
|
69
85
|
const closerPeerXor = uint8ArrayXor(closerPeerKadId, kadId);
|
|
70
86
|
// only continue query if closer peer is actually closer
|
|
71
87
|
if (uint8ArrayXorCompare(closerPeerXor, peerXor) !== -1) { // eslint-disable-line max-depth
|
|
72
|
-
log
|
|
88
|
+
log('skipping %p as they are not closer to %b than %p', closerPeer.id, key, peer);
|
|
73
89
|
continue;
|
|
74
90
|
}
|
|
75
|
-
log
|
|
76
|
-
queryPeer(closerPeer
|
|
91
|
+
log('querying closer peer %p', closerPeer.id);
|
|
92
|
+
queryPeer(closerPeer, closerPeerKadId);
|
|
77
93
|
}
|
|
78
94
|
}
|
|
79
|
-
|
|
80
|
-
|
|
95
|
+
events.push({
|
|
96
|
+
...event,
|
|
97
|
+
path: {
|
|
98
|
+
index: path,
|
|
99
|
+
queued: queue.queued,
|
|
100
|
+
running: queue.running,
|
|
101
|
+
total: queue.size
|
|
102
|
+
}
|
|
81
103
|
});
|
|
82
104
|
}
|
|
83
105
|
}
|
|
84
106
|
catch (err) {
|
|
85
|
-
if
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
107
|
+
// yield error event if query is continuing
|
|
108
|
+
events.push(queryErrorEvent({
|
|
109
|
+
from: peer.id,
|
|
110
|
+
error: err,
|
|
111
|
+
path: {
|
|
112
|
+
index: path,
|
|
113
|
+
queued: queue.queued,
|
|
114
|
+
running: queue.running - 1,
|
|
115
|
+
total: queue.size - 1
|
|
116
|
+
}
|
|
117
|
+
}, options));
|
|
94
118
|
}
|
|
95
119
|
}, {
|
|
96
120
|
distance: peerXor
|
|
97
121
|
}).catch(err => {
|
|
98
|
-
log.error(err);
|
|
122
|
+
log.error('error during query - %e', err);
|
|
99
123
|
});
|
|
100
124
|
}
|
|
101
|
-
// begin the query with the starting
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
yield event;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
if (signal.aborted) {
|
|
113
|
-
throw new QueryAbortedError('Query aborted');
|
|
114
|
-
}
|
|
115
|
-
throw err;
|
|
116
|
-
}
|
|
125
|
+
// begin the query with the starting peers
|
|
126
|
+
await Promise.all(startingPeers.map(async (startingPeer) => {
|
|
127
|
+
queryPeer({ id: startingPeer, multiaddrs: [] }, await convertPeerId(startingPeer));
|
|
128
|
+
}));
|
|
129
|
+
// yield results as they come in
|
|
130
|
+
yield* events;
|
|
117
131
|
}
|
|
118
132
|
//# sourceMappingURL=query-path.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-path.js","sourceRoot":"","sources":["../../../src/query/query-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"query-path.js","sourceRoot":"","sources":["../../../src/query/query-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { QueryEvent } from '../index.js';
|
|
2
|
-
import type {
|
|
1
|
+
import type { DisjointPath, QueryEvent } from '../index.js';
|
|
2
|
+
import type { PeerInfo } from '@libp2p/interface';
|
|
3
3
|
export interface QueryContext {
|
|
4
4
|
key: Uint8Array;
|
|
5
|
-
peer:
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
peer: PeerInfo;
|
|
6
|
+
peerKadId: Uint8Array;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
path: DisjointPath;
|
|
8
9
|
numPaths: number;
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/query/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/query/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,MAAM,WAAW,YAAY;IAE3B,GAAG,EAAE,UAAU,CAAA;IAEf,IAAI,EAAE,QAAQ,CAAA;IAEd,SAAS,EAAE,UAAU,CAAA;IAErB,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB,IAAI,EAAE,YAAY,CAAA;IAElB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;CACnD"}
|
package/dist/src/query-self.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { OperationMetrics } from './kad-dht.js';
|
|
2
2
|
import type { PeerRouting } from './peer-routing/index.js';
|
|
3
|
-
import type { RoutingTable } from './routing-table/index.js';
|
|
4
3
|
import type { ComponentLogger, Metrics, PeerId, Startable } from '@libp2p/interface';
|
|
5
4
|
import type { DeferredPromise } from 'p-defer';
|
|
6
5
|
export interface QuerySelfInit {
|
|
7
6
|
logPrefix: string;
|
|
8
7
|
peerRouting: PeerRouting;
|
|
9
|
-
routingTable: RoutingTable;
|
|
10
8
|
count?: number;
|
|
11
9
|
interval?: number;
|
|
12
10
|
initialInterval?: number;
|
|
@@ -18,6 +16,7 @@ export interface QuerySelfComponents {
|
|
|
18
16
|
peerId: PeerId;
|
|
19
17
|
logger: ComponentLogger;
|
|
20
18
|
metrics?: Metrics;
|
|
19
|
+
events: EventTarget;
|
|
21
20
|
}
|
|
22
21
|
/**
|
|
23
22
|
* Receives notifications of new peers joining the network that support the DHT protocol
|
|
@@ -26,7 +25,7 @@ export declare class QuerySelf implements Startable {
|
|
|
26
25
|
private readonly log;
|
|
27
26
|
private readonly peerId;
|
|
28
27
|
private readonly peerRouting;
|
|
29
|
-
private readonly
|
|
28
|
+
private readonly events;
|
|
30
29
|
private readonly count;
|
|
31
30
|
private readonly interval;
|
|
32
31
|
private readonly initialInterval;
|
|
@@ -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":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAU,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,WAAW,CAAA;IACxB,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;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,WAAW,CAAA;CACpB;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,MAAM,CAAa;IACpC,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;CA4ElC"}
|
package/dist/src/query-self.js
CHANGED
|
@@ -4,7 +4,6 @@ import length from 'it-length';
|
|
|
4
4
|
import { pipe } from 'it-pipe';
|
|
5
5
|
import take from 'it-take';
|
|
6
6
|
import pDefer from 'p-defer';
|
|
7
|
-
import { pEvent } from 'p-event';
|
|
8
7
|
import { QUERY_SELF_INTERVAL, QUERY_SELF_TIMEOUT, K, QUERY_SELF_INITIAL_INTERVAL } from './constants.js';
|
|
9
8
|
import { timeOperationMethod } from './utils.js';
|
|
10
9
|
/**
|
|
@@ -14,7 +13,7 @@ export class QuerySelf {
|
|
|
14
13
|
log;
|
|
15
14
|
peerId;
|
|
16
15
|
peerRouting;
|
|
17
|
-
|
|
16
|
+
events;
|
|
18
17
|
count;
|
|
19
18
|
interval;
|
|
20
19
|
initialInterval;
|
|
@@ -27,9 +26,9 @@ export class QuerySelf {
|
|
|
27
26
|
constructor(components, init) {
|
|
28
27
|
this.peerId = components.peerId;
|
|
29
28
|
this.log = components.logger.forComponent(`${init.logPrefix}:query-self`);
|
|
29
|
+
this.events = components.events;
|
|
30
30
|
this.running = false;
|
|
31
31
|
this.peerRouting = init.peerRouting;
|
|
32
|
-
this.routingTable = init.routingTable;
|
|
33
32
|
this.count = init.count ?? K;
|
|
34
33
|
this.interval = init.interval ?? QUERY_SELF_INTERVAL;
|
|
35
34
|
this.initialInterval = init.initialInterval ?? QUERY_SELF_INITIAL_INTERVAL;
|
|
@@ -84,22 +83,20 @@ export class QuerySelf {
|
|
|
84
83
|
const signal = anySignal(signals);
|
|
85
84
|
setMaxListeners(Infinity, signal, this.controller.signal);
|
|
86
85
|
try {
|
|
87
|
-
if (this.routingTable.size === 0) {
|
|
88
|
-
this.log('routing table was empty, waiting for some peers before running query');
|
|
89
|
-
// wait to discover at least one DHT peer that isn't us
|
|
90
|
-
await pEvent(this.routingTable, 'peer:add', {
|
|
91
|
-
signal,
|
|
92
|
-
filter: (event) => !this.peerId.equals(event.detail)
|
|
93
|
-
});
|
|
94
|
-
this.log('routing table has peers, continuing with query');
|
|
95
|
-
}
|
|
96
86
|
this.log('run self-query, look for %d peers timing out after %dms', this.count, this.queryTimeout);
|
|
97
87
|
const start = Date.now();
|
|
98
|
-
const
|
|
88
|
+
const peers = await pipe(this.peerRouting.getClosestPeers(this.peerId.toMultihash().bytes, {
|
|
99
89
|
signal,
|
|
100
90
|
isSelfQuery: true
|
|
101
91
|
}), (source) => take(source, this.count), async (source) => length(source));
|
|
102
|
-
|
|
92
|
+
const duration = Date.now() - start;
|
|
93
|
+
this.log('self-query found %d peers in %dms', peers, duration);
|
|
94
|
+
this.events.dispatchEvent(new CustomEvent('kad-dht:query:self', {
|
|
95
|
+
detail: {
|
|
96
|
+
peers,
|
|
97
|
+
duration
|
|
98
|
+
}
|
|
99
|
+
}));
|
|
103
100
|
}
|
|
104
101
|
catch (err) {
|
|
105
102
|
this.log.error('self-query error', err);
|