@antseed/node 0.2.71 → 0.2.73
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/discovery/announcer.d.ts +18 -0
- package/dist/discovery/announcer.d.ts.map +1 -1
- package/dist/discovery/announcer.js +45 -49
- package/dist/discovery/announcer.js.map +1 -1
- package/dist/discovery/dht-node.d.ts +55 -8
- package/dist/discovery/dht-node.d.ts.map +1 -1
- package/dist/discovery/dht-node.js +82 -24
- package/dist/discovery/dht-node.js.map +1 -1
- package/dist/discovery/http-metadata-resolver.d.ts +8 -1
- package/dist/discovery/http-metadata-resolver.d.ts.map +1 -1
- package/dist/discovery/http-metadata-resolver.js +26 -1
- package/dist/discovery/http-metadata-resolver.js.map +1 -1
- package/dist/discovery/index.d.ts +1 -1
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +1 -1
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/peer-lookup.d.ts +54 -1
- package/dist/discovery/peer-lookup.d.ts.map +1 -1
- package/dist/discovery/peer-lookup.js +130 -23
- package/dist/discovery/peer-lookup.js.map +1 -1
- package/dist/node.d.ts +4 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +83 -15
- package/dist/node.js.map +1 -1
- package/package.json +2 -2
package/dist/discovery/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DHTNode, DEFAULT_DHT_CONFIG, topicToInfoHash, ANTSEED_WILDCARD_TOPIC,
|
|
1
|
+
export { DHTNode, DEFAULT_DHT_CONFIG, topicToInfoHash, ANTSEED_WILDCARD_TOPIC, capabilityTopic, peerTopic, subnetTopic, subnetOf, SUBNET_COUNT, } from './dht-node.js';
|
|
2
2
|
export { PeerAnnouncer } from './announcer.js';
|
|
3
3
|
export { PeerLookup, DEFAULT_LOOKUP_CONFIG } from './peer-lookup.js';
|
|
4
4
|
export { scorePeer, rankPeers, selectBestPeer, selectDiversePeers, DEFAULT_SCORING_WEIGHTS } from './peer-selector.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,WAAW,EACX,QAAQ,EACR,YAAY,GAGb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAwC,MAAM,kBAAkB,CAAC;AAE3G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,uBAAuB,EAA4D,MAAM,oBAAoB,CAAC;AACjL,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAsB,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAwB,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAgD,MAAM,oBAAoB,CAAC;AACnI,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAA4B,MAAM,qBAAqB,CAAC;AAE9G,OAAO,EAAE,oBAAoB,EAAmC,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAiD,MAAM,iBAAiB,CAAC"}
|
|
@@ -8,6 +8,12 @@ export interface LookupConfig {
|
|
|
8
8
|
allowStaleMetadata: boolean;
|
|
9
9
|
maxAnnouncementAgeMs: number;
|
|
10
10
|
maxResults: number;
|
|
11
|
+
/**
|
|
12
|
+
* Optional foreground DHT budget for findAll(). Each individual lookup still
|
|
13
|
+
* gets the DHT's full operation timeout; the budget only controls how many
|
|
14
|
+
* subnet shards we attempt before returning the peers already found.
|
|
15
|
+
*/
|
|
16
|
+
maxFindAllDhtDurationMs?: number;
|
|
11
17
|
}
|
|
12
18
|
export declare const DEFAULT_LOOKUP_CONFIG: Omit<LookupConfig, "dht" | "metadataResolver">;
|
|
13
19
|
export interface LookupResult {
|
|
@@ -15,11 +21,58 @@ export interface LookupResult {
|
|
|
15
21
|
host: string;
|
|
16
22
|
port: number;
|
|
17
23
|
}
|
|
24
|
+
export interface LookupPartialContext {
|
|
25
|
+
mode: "foreground" | "background";
|
|
26
|
+
phase: "wildcard" | "subnet";
|
|
27
|
+
subnet?: number;
|
|
28
|
+
endpointCount: number;
|
|
29
|
+
}
|
|
30
|
+
export type LookupPartialCallback = (results: LookupResult[], context: LookupPartialContext) => void | Promise<void>;
|
|
18
31
|
export declare class PeerLookup {
|
|
19
32
|
private readonly config;
|
|
33
|
+
private nextSubnetStart;
|
|
20
34
|
constructor(config: LookupConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Enumerate every peer on the network.
|
|
37
|
+
*
|
|
38
|
+
* The lookup runs in two stages, sequentially:
|
|
39
|
+
*
|
|
40
|
+
* 1. Wildcard topic, alone. Its broad reach pulls many peers and warms
|
|
41
|
+
* the local DHT routing table with nodes that already know about
|
|
42
|
+
* AntSeed traffic.
|
|
43
|
+
* 2. Each subnet topic, one at a time, against that hot routing table.
|
|
44
|
+
* Each subnet only holds ~total/SUBNET_COUNT announcers, which keeps
|
|
45
|
+
* us well under the K-closest saturation limit that made the single
|
|
46
|
+
* wildcard topic return inconsistent subsets at scale.
|
|
47
|
+
*
|
|
48
|
+
* Why sequential: firing all shard lookups together through one UDP socket
|
|
49
|
+
* gave us lower wall-clock but worse completeness. Buyers need to give a
|
|
50
|
+
* shard lookup enough time to converge and drain its peer events, so every
|
|
51
|
+
* shard we do run gets a full lookup slot.
|
|
52
|
+
*
|
|
53
|
+
* Startup still should not block on all 16 shards when most of them are
|
|
54
|
+
* empty. If `maxFindAllDhtDurationMs` is configured, `findAll()` walks
|
|
55
|
+
* shards in a rotating order and stops after the foreground budget is
|
|
56
|
+
* exhausted; the next refresh resumes from the next shard. This preserves
|
|
57
|
+
* per-shard quality without forcing every buyer startup to pay the full
|
|
58
|
+
* network-wide sweep cost.
|
|
59
|
+
*
|
|
60
|
+
* `resolveLookupResults` deduplicates by `host:port` before resolving
|
|
61
|
+
* metadata, so the union still only incurs one metadata fetch per endpoint.
|
|
62
|
+
*/
|
|
21
63
|
findAll(): Promise<LookupResult[]>;
|
|
22
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Complete a full sequential wildcard+subnet sweep. Intended for background
|
|
66
|
+
* catch-up after a fast foreground discovery has already populated the UI.
|
|
67
|
+
*
|
|
68
|
+
* When `onPartial` is provided, each non-empty DHT batch is metadata-resolved
|
|
69
|
+
* and emitted immediately instead of making callers wait for every shard to
|
|
70
|
+
* finish. This keeps the buyer catalog moving while the exhaustive sweep is
|
|
71
|
+
* still walking later shards.
|
|
72
|
+
*/
|
|
73
|
+
findAllExhaustive(onPartial?: LookupPartialCallback): Promise<LookupResult[]>;
|
|
74
|
+
private findAllWithDhtBudget;
|
|
75
|
+
private deduplicateResultsByPeerId;
|
|
23
76
|
findByCapability(capability: string, name?: string): Promise<LookupResult[]>;
|
|
24
77
|
/**
|
|
25
78
|
* Look up a single peer by its peerId via the per-peer DHT topic
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer-lookup.d.ts","sourceRoot":"","sources":["../../src/discovery/peer-lookup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"peer-lookup.d.ts","sourceRoot":"","sources":["../../src/discovery/peer-lookup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAS7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,wBAAwB,CAAC;AAY7E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,eAAO,MAAM,qBAAqB,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,kBAAkB,CAYhF,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;IAClC,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,oBAAoB,KAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,EAAE,YAAY;IAIhC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIxC;;;;;;;;OAQG;IACG,iBAAiB,CAAC,SAAS,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAIrE,oBAAoB;IA8FlC,OAAO,CAAC,0BAA0B;IAY5B,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAOlF;;;;;;;;;OASG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAQ7C,oBAAoB;YAoCpB,kBAAkB;IAoB1B,uBAAuB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAMvE,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;CAIzC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { verifySignature, hexToBytes } from "../p2p/identity.js";
|
|
2
|
-
import { ANTSEED_WILDCARD_TOPIC,
|
|
2
|
+
import { ANTSEED_WILDCARD_TOPIC, capabilityTopic, peerTopic, subnetTopic, SUBNET_COUNT, topicToInfoHash, } from "./dht-node.js";
|
|
3
3
|
import { encodeMetadataForSigning } from "./metadata-codec.js";
|
|
4
|
+
import { debugLog } from "../utils/debug.js";
|
|
4
5
|
function shuffle(arr) {
|
|
5
6
|
const out = arr.slice();
|
|
6
7
|
for (let i = out.length - 1; i > 0; i--) {
|
|
@@ -13,37 +14,143 @@ export const DEFAULT_LOOKUP_CONFIG = {
|
|
|
13
14
|
requireValidSignature: true,
|
|
14
15
|
allowStaleMetadata: false,
|
|
15
16
|
maxAnnouncementAgeMs: 30 * 60 * 1000,
|
|
16
|
-
// Old cap was 50; with
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
maxResults:
|
|
17
|
+
// Old cap was 50, then 200; with subnet fan-out and larger live networks,
|
|
18
|
+
// keep browse/discovery truncation comfortably above current scale while
|
|
19
|
+
// still bounding downstream enrichment/rendering work.
|
|
20
|
+
maxResults: 1000,
|
|
21
|
+
// Do not make buyer startup wait for every empty shard in the foreground.
|
|
22
|
+
// A shard we do run still gets the full DHT operation timeout, but the
|
|
23
|
+
// sweep can resume from the next shard on the next refresh.
|
|
24
|
+
maxFindAllDhtDurationMs: 20_000,
|
|
20
25
|
};
|
|
21
26
|
export class PeerLookup {
|
|
22
27
|
config;
|
|
28
|
+
nextSubnetStart = 0;
|
|
23
29
|
constructor(config) {
|
|
24
30
|
this.config = config;
|
|
25
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Enumerate every peer on the network.
|
|
34
|
+
*
|
|
35
|
+
* The lookup runs in two stages, sequentially:
|
|
36
|
+
*
|
|
37
|
+
* 1. Wildcard topic, alone. Its broad reach pulls many peers and warms
|
|
38
|
+
* the local DHT routing table with nodes that already know about
|
|
39
|
+
* AntSeed traffic.
|
|
40
|
+
* 2. Each subnet topic, one at a time, against that hot routing table.
|
|
41
|
+
* Each subnet only holds ~total/SUBNET_COUNT announcers, which keeps
|
|
42
|
+
* us well under the K-closest saturation limit that made the single
|
|
43
|
+
* wildcard topic return inconsistent subsets at scale.
|
|
44
|
+
*
|
|
45
|
+
* Why sequential: firing all shard lookups together through one UDP socket
|
|
46
|
+
* gave us lower wall-clock but worse completeness. Buyers need to give a
|
|
47
|
+
* shard lookup enough time to converge and drain its peer events, so every
|
|
48
|
+
* shard we do run gets a full lookup slot.
|
|
49
|
+
*
|
|
50
|
+
* Startup still should not block on all 16 shards when most of them are
|
|
51
|
+
* empty. If `maxFindAllDhtDurationMs` is configured, `findAll()` walks
|
|
52
|
+
* shards in a rotating order and stops after the foreground budget is
|
|
53
|
+
* exhausted; the next refresh resumes from the next shard. This preserves
|
|
54
|
+
* per-shard quality without forcing every buyer startup to pay the full
|
|
55
|
+
* network-wide sweep cost.
|
|
56
|
+
*
|
|
57
|
+
* `resolveLookupResults` deduplicates by `host:port` before resolving
|
|
58
|
+
* metadata, so the union still only incurs one metadata fetch per endpoint.
|
|
59
|
+
*/
|
|
26
60
|
async findAll() {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
61
|
+
return this.findAllWithDhtBudget(this.config.maxFindAllDhtDurationMs, "foreground");
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Complete a full sequential wildcard+subnet sweep. Intended for background
|
|
65
|
+
* catch-up after a fast foreground discovery has already populated the UI.
|
|
66
|
+
*
|
|
67
|
+
* When `onPartial` is provided, each non-empty DHT batch is metadata-resolved
|
|
68
|
+
* and emitted immediately instead of making callers wait for every shard to
|
|
69
|
+
* finish. This keeps the buyer catalog moving while the exhaustive sweep is
|
|
70
|
+
* still walking later shards.
|
|
71
|
+
*/
|
|
72
|
+
async findAllExhaustive(onPartial) {
|
|
73
|
+
return this.findAllWithDhtBudget(undefined, "background", onPartial);
|
|
74
|
+
}
|
|
75
|
+
async findAllWithDhtBudget(maxDhtDurationMs, mode, onPartial) {
|
|
76
|
+
const merged = [];
|
|
77
|
+
const partialResults = [];
|
|
78
|
+
const sweepStartedAt = Date.now();
|
|
79
|
+
// Stage 1: wildcard, on its own. Warm the routing table.
|
|
80
|
+
const wildcardStartedAt = Date.now();
|
|
81
|
+
debugLog(`[PeerLookup] ${mode}: wildcard lookup starting`);
|
|
82
|
+
const wildcardEndpoints = await this.config.dht.lookup(topicToInfoHash(ANTSEED_WILDCARD_TOPIC));
|
|
83
|
+
debugLog(`[PeerLookup] ${mode}: wildcard lookup returned ${wildcardEndpoints.length} endpoint(s) `
|
|
84
|
+
+ `in ${Date.now() - wildcardStartedAt}ms`);
|
|
85
|
+
merged.push(...wildcardEndpoints);
|
|
86
|
+
if (onPartial && wildcardEndpoints.length > 0) {
|
|
87
|
+
const resolved = await this.resolveLookupResults(shuffle(wildcardEndpoints));
|
|
88
|
+
partialResults.push(...resolved);
|
|
89
|
+
await onPartial(resolved, {
|
|
90
|
+
mode,
|
|
91
|
+
phase: "wildcard",
|
|
92
|
+
endpointCount: wildcardEndpoints.length,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Stage 2: per-subnet, sequential. Each lookup gets the full operation
|
|
96
|
+
// timeout and exclusive use of the UDP socket. Rotate the start shard so
|
|
97
|
+
// budgeted foreground scans eventually cover the whole shard ring.
|
|
98
|
+
const startedAt = Date.now();
|
|
99
|
+
const start = this.nextSubnetStart;
|
|
100
|
+
let nextStart = start;
|
|
101
|
+
for (let offset = 0; offset < SUBNET_COUNT; offset++) {
|
|
102
|
+
if (offset > 0
|
|
103
|
+
&& maxDhtDurationMs !== undefined
|
|
104
|
+
&& Date.now() - startedAt >= maxDhtDurationMs) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
const subnet = (start + offset) % SUBNET_COUNT;
|
|
108
|
+
const subnetStartedAt = Date.now();
|
|
109
|
+
debugLog(`[PeerLookup] ${mode}: subnet ${subnet}/${SUBNET_COUNT - 1} lookup starting`);
|
|
110
|
+
const subnetEndpoints = await this.config.dht.lookup(topicToInfoHash(subnetTopic(subnet)));
|
|
111
|
+
debugLog(`[PeerLookup] ${mode}: subnet ${subnet}/${SUBNET_COUNT - 1} returned `
|
|
112
|
+
+ `${subnetEndpoints.length} endpoint(s) in ${Date.now() - subnetStartedAt}ms`);
|
|
113
|
+
merged.push(...subnetEndpoints);
|
|
114
|
+
if (onPartial && subnetEndpoints.length > 0) {
|
|
115
|
+
const partialStartedAt = Date.now();
|
|
116
|
+
const resolved = await this.resolveLookupResults(shuffle(subnetEndpoints));
|
|
117
|
+
partialResults.push(...resolved);
|
|
118
|
+
debugLog(`[PeerLookup] ${mode}: subnet ${subnet}/${SUBNET_COUNT - 1} partial metadata resolved `
|
|
119
|
+
+ `${resolved.length}/${subnetEndpoints.length} in ${Date.now() - partialStartedAt}ms`);
|
|
120
|
+
await onPartial(resolved, {
|
|
121
|
+
mode,
|
|
122
|
+
phase: "subnet",
|
|
123
|
+
subnet,
|
|
124
|
+
endpointCount: subnetEndpoints.length,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
nextStart = (subnet + 1) % SUBNET_COUNT;
|
|
128
|
+
}
|
|
129
|
+
this.nextSubnetStart = nextStart;
|
|
130
|
+
if (onPartial) {
|
|
131
|
+
const deduped = this.deduplicateResultsByPeerId(partialResults);
|
|
132
|
+
debugLog(`[PeerLookup] ${mode}: emitted ${deduped.length} incremental metadata result(s) from `
|
|
133
|
+
+ `${merged.length} DHT endpoint(s) (total ${Date.now() - sweepStartedAt}ms)`);
|
|
134
|
+
return deduped;
|
|
135
|
+
}
|
|
136
|
+
const metadataStartedAt = Date.now();
|
|
137
|
+
const resolved = await this.resolveLookupResults(shuffle(merged));
|
|
138
|
+
debugLog(`[PeerLookup] ${mode}: resolved ${resolved.length} metadata result(s) from `
|
|
139
|
+
+ `${merged.length} DHT endpoint(s) in ${Date.now() - metadataStartedAt}ms `
|
|
140
|
+
+ `(total ${Date.now() - sweepStartedAt}ms)`);
|
|
141
|
+
return resolved;
|
|
30
142
|
}
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
143
|
+
deduplicateResultsByPeerId(results) {
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const deduped = [];
|
|
146
|
+
for (const result of results) {
|
|
147
|
+
const peerId = result.metadata.peerId.toLowerCase();
|
|
148
|
+
if (seen.has(peerId))
|
|
149
|
+
continue;
|
|
150
|
+
seen.add(peerId);
|
|
151
|
+
deduped.push(result);
|
|
39
152
|
}
|
|
40
|
-
|
|
41
|
-
const compactInfoHash = topicToInfoHash(compactTopic);
|
|
42
|
-
const [canonicalPeers, compactPeers] = await Promise.all([
|
|
43
|
-
this.config.dht.lookup(canonicalInfoHash),
|
|
44
|
-
this.config.dht.lookup(compactInfoHash),
|
|
45
|
-
]);
|
|
46
|
-
return this.resolveLookupResults(shuffle([...canonicalPeers, ...compactPeers]));
|
|
153
|
+
return deduped;
|
|
47
154
|
}
|
|
48
155
|
async findByCapability(capability, name) {
|
|
49
156
|
const topic = capabilityTopic(capability, name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer-lookup.js","sourceRoot":"","sources":["../../src/discovery/peer-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EACL,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"peer-lookup.js","sourceRoot":"","sources":["../../src/discovery/peer-lookup.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -158,6 +158,8 @@ export declare class AntseedNode extends EventEmitter {
|
|
|
158
158
|
private _closeRequestedFromBlock;
|
|
159
159
|
/** Seller session lifecycle tracking (metering, settlement). */
|
|
160
160
|
private _sessionTracker;
|
|
161
|
+
/** Buyer-side background full discovery sweep, if one is running. */
|
|
162
|
+
private _backgroundPeerDiscoveryPromise;
|
|
161
163
|
constructor(config: NodeConfig);
|
|
162
164
|
get peerId(): string | null;
|
|
163
165
|
get identity(): Identity | null;
|
|
@@ -186,6 +188,8 @@ export declare class AntseedNode extends EventEmitter {
|
|
|
186
188
|
start(): Promise<void>;
|
|
187
189
|
stop(): Promise<void>;
|
|
188
190
|
discoverPeers(service?: string): Promise<PeerInfo[]>;
|
|
191
|
+
private _lookupResultsToPeerInfos;
|
|
192
|
+
private _startBackgroundPeerDiscoverySweep;
|
|
189
193
|
/**
|
|
190
194
|
* Look up a single peer by its peerId via the per-peer DHT topic.
|
|
191
195
|
* Much cheaper and more deterministic than walking the wildcard topic:
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAA6B,MAAM,iBAAiB,CAAC;AAE3E,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
package/dist/node.js
CHANGED
|
@@ -7,7 +7,7 @@ import { MeteringStorage } from "./metering/storage.js";
|
|
|
7
7
|
import { ReceiptGenerator } from "./metering/receipt-generator.js";
|
|
8
8
|
import { SellerSessionTracker, } from "./metering/seller-session-tracker.js";
|
|
9
9
|
import { ConnectionState } from "./types/connection.js";
|
|
10
|
-
import { DHTNode, DEFAULT_DHT_CONFIG, } from "./discovery/dht-node.js";
|
|
10
|
+
import { DHTNode, DEFAULT_DHT_CONFIG, SUBNET_COUNT, } from "./discovery/dht-node.js";
|
|
11
11
|
import { toBootstrapConfig, OFFICIAL_BOOTSTRAP_NODES, mergeBootstrapNodes } from "./discovery/bootstrap.js";
|
|
12
12
|
import { ConnectionManager, } from "./p2p/connection-manager.js";
|
|
13
13
|
import { PeerAnnouncer, } from "./discovery/announcer.js";
|
|
@@ -81,6 +81,8 @@ export class AntseedNode extends EventEmitter {
|
|
|
81
81
|
_closeRequestedFromBlock = 0;
|
|
82
82
|
/** Seller session lifecycle tracking (metering, settlement). */
|
|
83
83
|
_sessionTracker = null;
|
|
84
|
+
/** Buyer-side background full discovery sweep, if one is running. */
|
|
85
|
+
_backgroundPeerDiscoveryPromise = null;
|
|
84
86
|
constructor(config) {
|
|
85
87
|
super();
|
|
86
88
|
this._config = config;
|
|
@@ -253,6 +255,7 @@ export class AntseedNode extends EventEmitter {
|
|
|
253
255
|
this._buyerPaymentManager = null;
|
|
254
256
|
this._buyerNegotiator = null;
|
|
255
257
|
this._buyerHandler = null;
|
|
258
|
+
this._backgroundPeerDiscoveryPromise = null;
|
|
256
259
|
this._sellerPaymentManager = null;
|
|
257
260
|
this._sessionTracker = null;
|
|
258
261
|
this._started = false;
|
|
@@ -263,16 +266,20 @@ export class AntseedNode extends EventEmitter {
|
|
|
263
266
|
throw new Error("Node not started or not in buyer mode");
|
|
264
267
|
}
|
|
265
268
|
debugLog(`[Node] Discovering peers (service: "${service ?? "*"}")...`);
|
|
266
|
-
|
|
267
|
-
//
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
debugLog(`[Node] DHT returned ${results.length} result(s)`);
|
|
269
|
+
debugLog(`[Node] Discovery plan: wildcard warmup + budgeted sequential subnet shard lookups (${SUBNET_COUNT} total) + parallel metadata resolve; exhaustive sweep continues in background`);
|
|
270
|
+
// Always enumerate via subnet+wildcard. Service filtering is metadata
|
|
271
|
+
// driven — announcing per-service DHT topics did O(services) work per
|
|
272
|
+
// reannounce cycle, recreated the K-closest saturation problem on every
|
|
273
|
+
// popular service infohash, and was already an opportunistic optimisation
|
|
274
|
+
// (the production proxy never used it; the CLI always re-filtered
|
|
275
|
+
// metadata-side anyway). The signed metadata document carries the full
|
|
276
|
+
// service catalog, so we filter against that after enumeration.
|
|
277
|
+
const results = await this._peerLookup.findAll();
|
|
278
|
+
debugLog(`[Node] DHT returned ${results.length} foreground result(s)`);
|
|
279
|
+
this._startBackgroundPeerDiscoverySweep();
|
|
280
|
+
return this._lookupResultsToPeerInfos(results, service);
|
|
281
|
+
}
|
|
282
|
+
async _lookupResultsToPeerInfos(results, service) {
|
|
276
283
|
// Deduplicate by peerId (DHT can return the same peer from multiple topic lookups)
|
|
277
284
|
const seen = new Set();
|
|
278
285
|
const peers = [];
|
|
@@ -283,11 +290,41 @@ export class AntseedNode extends EventEmitter {
|
|
|
283
290
|
peers.push(p);
|
|
284
291
|
}
|
|
285
292
|
}
|
|
286
|
-
|
|
287
|
-
|
|
293
|
+
const filtered = service ? peers.filter((p) => peerOffersService(p, service)) : peers;
|
|
294
|
+
// On-chain enrichment runs after the metadata filter so we don't waste
|
|
295
|
+
// RPC calls on peers we'll discard.
|
|
296
|
+
await this._enrichPeersWithOnChainStats(filtered);
|
|
297
|
+
for (const p of filtered) {
|
|
288
298
|
debugLog(`[Node] peer ${p.peerId.slice(0, 12)}... providers=[${p.providers.join(",")}] addr=${p.publicAddress ?? "?"}`);
|
|
289
299
|
}
|
|
290
|
-
return
|
|
300
|
+
return filtered;
|
|
301
|
+
}
|
|
302
|
+
_startBackgroundPeerDiscoverySweep() {
|
|
303
|
+
if (!this._peerLookup || this._backgroundPeerDiscoveryPromise) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const peerLookup = this._peerLookup;
|
|
307
|
+
debugLog(`[Node] Starting background exhaustive peer discovery sweep`);
|
|
308
|
+
this._backgroundPeerDiscoveryPromise = (async () => {
|
|
309
|
+
const results = await peerLookup.findAllExhaustive(async (partialResults, context) => {
|
|
310
|
+
if (partialResults.length === 0)
|
|
311
|
+
return;
|
|
312
|
+
const peers = await this._lookupResultsToPeerInfos(partialResults);
|
|
313
|
+
debugLog(`[Node] Background DHT partial ${context.phase}`
|
|
314
|
+
+ `${context.subnet !== undefined ? ` ${context.subnet}/${SUBNET_COUNT - 1}` : ""}`
|
|
315
|
+
+ ` emitted ${peers.length} peer(s) from ${context.endpointCount} endpoint(s)`);
|
|
316
|
+
this.emit("peers:discovered", peers);
|
|
317
|
+
});
|
|
318
|
+
debugLog(`[Node] Background DHT sweep returned ${results.length} result(s)`);
|
|
319
|
+
const peers = await this._lookupResultsToPeerInfos(results);
|
|
320
|
+
this.emit("peers:discovered", peers);
|
|
321
|
+
return peers;
|
|
322
|
+
})().catch((err) => {
|
|
323
|
+
debugWarn(`[Node] Background DHT sweep failed: ${err instanceof Error ? err.message : err}`);
|
|
324
|
+
return [];
|
|
325
|
+
}).finally(() => {
|
|
326
|
+
this._backgroundPeerDiscoveryPromise = null;
|
|
327
|
+
});
|
|
291
328
|
}
|
|
292
329
|
/**
|
|
293
330
|
* Look up a single peer by its peerId via the per-peer DHT topic.
|
|
@@ -820,7 +857,10 @@ export class AntseedNode extends EventEmitter {
|
|
|
820
857
|
debugWarn(`[ConnectionManager] ${err.message}`);
|
|
821
858
|
});
|
|
822
859
|
// Create PeerLookup with HttpMetadataResolver
|
|
823
|
-
const metadataResolver = new HttpMetadataResolver(
|
|
860
|
+
const metadataResolver = new HttpMetadataResolver({
|
|
861
|
+
timeoutMs: 750,
|
|
862
|
+
maxConcurrent: 24,
|
|
863
|
+
});
|
|
824
864
|
const lookupConfig = {
|
|
825
865
|
dht: this._dht,
|
|
826
866
|
metadataResolver,
|
|
@@ -828,6 +868,7 @@ export class AntseedNode extends EventEmitter {
|
|
|
828
868
|
allowStaleMetadata: DEFAULT_LOOKUP_CONFIG.allowStaleMetadata,
|
|
829
869
|
maxAnnouncementAgeMs: DEFAULT_LOOKUP_CONFIG.maxAnnouncementAgeMs,
|
|
830
870
|
maxResults: DEFAULT_LOOKUP_CONFIG.maxResults,
|
|
871
|
+
maxFindAllDhtDurationMs: DEFAULT_LOOKUP_CONFIG.maxFindAllDhtDurationMs,
|
|
831
872
|
};
|
|
832
873
|
this._peerLookup = new PeerLookup(lookupConfig);
|
|
833
874
|
// Initialize buyer-side payment manager if payments config is provided
|
|
@@ -1219,4 +1260,31 @@ function parsePeerAddress(address) {
|
|
|
1219
1260
|
const parts = address.split(":");
|
|
1220
1261
|
return { host: parts[0], port: parseInt(parts[1] ?? "6882", 10) };
|
|
1221
1262
|
}
|
|
1263
|
+
/**
|
|
1264
|
+
* Predicate used by `discoverPeers(service)` to filter the enumerated peer
|
|
1265
|
+
* list against an optional service hint. Matches case-insensitively against
|
|
1266
|
+
* either a provider name (e.g. `openai`) or any service name announced in
|
|
1267
|
+
* the peer's signed metadata across all of its providers. Returns true when
|
|
1268
|
+
* `service` is empty/whitespace so the caller can skip the filter.
|
|
1269
|
+
*/
|
|
1270
|
+
function peerOffersService(peer, service) {
|
|
1271
|
+
const needle = service.trim().toLowerCase();
|
|
1272
|
+
if (needle.length === 0)
|
|
1273
|
+
return true;
|
|
1274
|
+
for (const provider of peer.providers) {
|
|
1275
|
+
if (provider.trim().toLowerCase() === needle)
|
|
1276
|
+
return true;
|
|
1277
|
+
}
|
|
1278
|
+
if (peer.providerPricing) {
|
|
1279
|
+
for (const entry of Object.values(peer.providerPricing)) {
|
|
1280
|
+
if (!entry.services)
|
|
1281
|
+
continue;
|
|
1282
|
+
for (const serviceName of Object.keys(entry.services)) {
|
|
1283
|
+
if (serviceName.trim().toLowerCase() === needle)
|
|
1284
|
+
return true;
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
return false;
|
|
1289
|
+
}
|
|
1222
1290
|
//# sourceMappingURL=node.js.map
|