@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.
@@ -1,4 +1,4 @@
1
- export { DHTNode, DEFAULT_DHT_CONFIG, topicToInfoHash, ANTSEED_WILDCARD_TOPIC, serviceTopic, serviceSearchTopic, capabilityTopic, peerTopic, normalizeServiceTopicKey, normalizeServiceSearchTopicKey, } from './dht-node.js';
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,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,wBAAwB,EACxB,8BAA8B,GAE/B,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"}
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
- findByService(service: string): Promise<LookupResult[]>;
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;AAW7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,wBAAwB,CAAC;AAW7E,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;CACpB;AAED,eAAO,MAAM,qBAAqB,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,kBAAkB,CAQhF,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAI1B,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAMlC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoBvD,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
+ {"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, serviceTopic, serviceSearchTopic, capabilityTopic, peerTopic, topicToInfoHash, normalizeServiceTopicKey, normalizeServiceSearchTopicKey, } from "./dht-node.js";
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 the network growing past that, browse views were
17
- // silently truncated. 200 keeps the parallel metadata fan-out reasonable
18
- // while no longer hiding peers from ‘network browse’.
19
- maxResults: 200,
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
- const infoHash = topicToInfoHash(ANTSEED_WILDCARD_TOPIC);
28
- const peers = await this.config.dht.lookup(infoHash);
29
- return this.resolveLookupResults(shuffle(peers));
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
- async findByService(service) {
32
- const canonicalTopic = serviceTopic(service);
33
- const canonicalInfoHash = topicToInfoHash(canonicalTopic);
34
- const canonicalServiceKey = normalizeServiceTopicKey(service);
35
- const compactServiceKey = normalizeServiceSearchTopicKey(service);
36
- if (compactServiceKey === canonicalServiceKey) {
37
- const peers = await this.config.dht.lookup(canonicalInfoHash);
38
- return this.resolveLookupResults(shuffle(peers));
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
- const compactTopic = serviceSearchTopic(service);
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":"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"}
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:
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
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
- // Query service-level DHT topic when a service is specified — returns only peers
267
- // that explicitly announced that service. Fall back to wildcard if no results.
268
- let results = service
269
- ? await this._peerLookup.findByService(service)
270
- : await this._peerLookup.findAll();
271
- if (service && results.length === 0) {
272
- debugLog(`[Node] No service-topic results for "${service}", falling back to wildcard`);
273
- results = await this._peerLookup.findAll();
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
- await this._enrichPeersWithOnChainStats(peers);
287
- for (const p of peers) {
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 peers;
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