@libp2p/kad-dht 13.1.2-b4f02a637 → 14.0.0-d4da56961

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. package/dist/index.min.js +2 -2
  2. package/dist/src/index.d.ts +26 -2
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/kad-dht.d.ts.map +1 -1
  6. package/dist/src/kad-dht.js +25 -13
  7. package/dist/src/kad-dht.js.map +1 -1
  8. package/dist/src/network.d.ts +1 -1
  9. package/dist/src/network.d.ts.map +1 -1
  10. package/dist/src/network.js +1 -3
  11. package/dist/src/network.js.map +1 -1
  12. package/dist/src/peer-distance-list.d.ts.map +1 -0
  13. package/dist/src/{peer-list/peer-distance-list.js → peer-distance-list.js} +1 -1
  14. package/dist/src/peer-distance-list.js.map +1 -0
  15. package/dist/src/peer-routing/index.js +1 -1
  16. package/dist/src/peer-routing/index.js.map +1 -1
  17. package/dist/src/query-self.d.ts.map +1 -1
  18. package/dist/src/query-self.js +13 -6
  19. package/dist/src/query-self.js.map +1 -1
  20. package/dist/src/routing-table/closest-peers.d.ts +43 -0
  21. package/dist/src/routing-table/closest-peers.d.ts.map +1 -0
  22. package/dist/src/routing-table/closest-peers.js +86 -0
  23. package/dist/src/routing-table/closest-peers.js.map +1 -0
  24. package/dist/src/routing-table/index.d.ts +54 -32
  25. package/dist/src/routing-table/index.d.ts.map +1 -1
  26. package/dist/src/routing-table/index.js +256 -172
  27. package/dist/src/routing-table/index.js.map +1 -1
  28. package/dist/src/routing-table/k-bucket.d.ts +65 -21
  29. package/dist/src/routing-table/k-bucket.d.ts.map +1 -1
  30. package/dist/src/routing-table/k-bucket.js +122 -66
  31. package/dist/src/routing-table/k-bucket.js.map +1 -1
  32. package/dist/src/routing-table/refresh.d.ts.map +1 -1
  33. package/dist/src/routing-table/refresh.js +4 -1
  34. package/dist/src/routing-table/refresh.js.map +1 -1
  35. package/dist/src/rpc/index.d.ts.map +1 -1
  36. package/dist/src/rpc/index.js +3 -7
  37. package/dist/src/rpc/index.js.map +1 -1
  38. package/package.json +11 -12
  39. package/src/index.ts +30 -2
  40. package/src/kad-dht.ts +29 -15
  41. package/src/network.ts +1 -4
  42. package/src/{peer-list/peer-distance-list.ts → peer-distance-list.ts} +1 -1
  43. package/src/peer-routing/index.ts +1 -1
  44. package/src/query-self.ts +14 -6
  45. package/src/routing-table/closest-peers.ts +113 -0
  46. package/src/routing-table/index.ts +296 -205
  47. package/src/routing-table/k-bucket.ts +194 -81
  48. package/src/routing-table/refresh.ts +5 -1
  49. package/src/rpc/index.ts +4 -7
  50. package/dist/src/peer-list/index.d.ts +0 -29
  51. package/dist/src/peer-list/index.d.ts.map +0 -1
  52. package/dist/src/peer-list/index.js +0 -45
  53. package/dist/src/peer-list/index.js.map +0 -1
  54. package/dist/src/peer-list/peer-distance-list.d.ts.map +0 -1
  55. package/dist/src/peer-list/peer-distance-list.js.map +0 -1
  56. package/src/peer-list/index.ts +0 -54
  57. /package/dist/src/{peer-list/peer-distance-list.d.ts → peer-distance-list.d.ts} +0 -0
@@ -1,66 +1,86 @@
1
1
  import { TypedEventEmitter } from '@libp2p/interface';
2
- import { PeerQueue } from '@libp2p/utils/peer-queue';
3
- import { KBucket, type PingEventDetails } from './k-bucket.js';
4
- import type { ComponentLogger, Metrics, PeerId, PeerStore, Startable } from '@libp2p/interface';
5
- import type { ConnectionManager } from '@libp2p/interface-internal';
2
+ import { KBucket } from './k-bucket.js';
3
+ import type { Peer } from './k-bucket.js';
4
+ import type { Network } from '../network.js';
5
+ import type { AbortOptions, ComponentLogger, Metrics, PeerId, PeerStore, Startable } from '@libp2p/interface';
6
6
  import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout';
7
- export declare const KAD_CLOSE_TAG_NAME = "kad-close";
8
- export declare const KAD_CLOSE_TAG_VALUE = 50;
9
7
  export declare const KBUCKET_SIZE = 20;
10
- export declare const PREFIX_LENGTH = 32;
11
- export declare const PING_TIMEOUT = 2000;
12
- export declare const PING_CONCURRENCY = 20;
8
+ export declare const PREFIX_LENGTH = 8;
9
+ export declare const PING_NEW_CONTACT_TIMEOUT = 2000;
10
+ export declare const PING_NEW_CONTACT_CONCURRENCY = 20;
11
+ export declare const PING_NEW_CONTACT_MAX_QUEUE_SIZE = 100;
12
+ export declare const PING_OLD_CONTACT_COUNT = 3;
13
+ export declare const PING_OLD_CONTACT_TIMEOUT = 2000;
14
+ export declare const PING_OLD_CONTACT_CONCURRENCY = 20;
15
+ export declare const PING_OLD_CONTACT_MAX_QUEUE_SIZE = 100;
16
+ export declare const KAD_PEER_TAG_NAME = "kad-peer";
17
+ export declare const KAD_PEER_TAG_VALUE = 1;
18
+ export declare const LAST_PING_THRESHOLD = 600000;
19
+ export declare const POPULATE_FROM_DATASTORE_ON_START = true;
20
+ export declare const POPULATE_FROM_DATASTORE_LIMIT = 1000;
13
21
  export interface RoutingTableInit {
14
22
  logPrefix: string;
15
23
  protocol: string;
16
24
  prefixLength?: number;
17
25
  splitThreshold?: number;
18
26
  kBucketSize?: number;
19
- pingTimeout?: AdaptiveTimeoutInit;
20
- pingConcurrency?: number;
21
- tagName?: string;
22
- tagValue?: number;
27
+ pingNewContactTimeout?: AdaptiveTimeoutInit;
28
+ pingNewContactConcurrency?: number;
29
+ pingNewContactMaxQueueSize?: number;
30
+ pingOldContactTimeout?: AdaptiveTimeoutInit;
31
+ pingOldContactConcurrency?: number;
32
+ pingOldContactMaxQueueSize?: number;
33
+ numberOfOldContactsToPing?: number;
34
+ peerTagName?: string;
35
+ peerTagValue?: number;
36
+ closeTagName?: string;
37
+ closeTagValue?: number;
38
+ network: Network;
39
+ populateFromDatastoreOnStart?: boolean;
40
+ populateFromDatastoreLimit?: number;
41
+ lastPingThreshold?: number;
42
+ closestPeerSetSize?: number;
43
+ closestPeerSetRefreshInterval?: number;
23
44
  }
24
45
  export interface RoutingTableComponents {
25
46
  peerId: PeerId;
26
47
  peerStore: PeerStore;
27
- connectionManager: ConnectionManager;
28
48
  metrics?: Metrics;
29
49
  logger: ComponentLogger;
30
50
  }
31
51
  export interface RoutingTableEvents {
32
52
  'peer:add': CustomEvent<PeerId>;
33
53
  'peer:remove': CustomEvent<PeerId>;
54
+ 'peer:ping': CustomEvent<PeerId>;
34
55
  }
35
56
  /**
36
- * A wrapper around `k-bucket`, to provide easy store and
37
- * retrieval for peers.
57
+ * A wrapper around `k-bucket`, to provide easy store and retrieval for peers.
38
58
  */
39
59
  export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implements Startable {
40
60
  kBucketSize: number;
41
- kb?: KBucket;
42
- pingQueue: PeerQueue<boolean>;
61
+ kb: KBucket;
62
+ network: Network;
63
+ private readonly closestPeerTagger;
43
64
  private readonly log;
44
65
  private readonly components;
45
- private readonly prefixLength;
46
- private readonly splitThreshold;
47
- private readonly pingTimeout;
48
- private readonly pingConcurrency;
49
66
  private running;
67
+ private readonly pingNewContactTimeout;
68
+ private readonly pingNewContactQueue;
69
+ private readonly pingOldContactTimeout;
70
+ private readonly pingOldContactQueue;
71
+ private readonly populateFromDatastoreOnStart;
72
+ private readonly populateFromDatastoreLimit;
50
73
  private readonly protocol;
51
- private readonly tagName;
52
- private readonly tagValue;
74
+ private readonly peerTagName;
75
+ private readonly peerTagValue;
53
76
  private readonly metrics?;
54
77
  constructor(components: RoutingTableComponents, init: RoutingTableInit);
55
78
  isStarted(): boolean;
56
79
  start(): Promise<void>;
80
+ afterStart(): Promise<void>;
57
81
  stop(): Promise<void>;
58
- /**
59
- * Keep track of our k-closest peers and tag them in the peer store as such
60
- * - this will lower the chances that connections to them get closed when
61
- * we reach connection limits
62
- */
63
- _tagPeers(kBuck: KBucket): void;
82
+ private peerAdded;
83
+ private peerRemoved;
64
84
  /**
65
85
  * Called on the `ping` event from `k-bucket` when a bucket is full
66
86
  * and cannot split.
@@ -71,7 +91,9 @@ export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents>
71
91
  * `oldContacts` will not be empty and is the list of contacts that
72
92
  * have not been contacted for the longest.
73
93
  */
74
- _onPing(evt: CustomEvent<PingEventDetails>): Promise<void>;
94
+ pingOldContacts(oldContacts: Peer[], options?: AbortOptions): AsyncGenerator<Peer>;
95
+ verifyNewContact(contact: Peer, options?: AbortOptions): Promise<boolean>;
96
+ pingContact(contact: Peer, options?: AbortOptions): Promise<boolean>;
75
97
  /**
76
98
  * Amount of currently stored peers
77
99
  */
@@ -91,7 +113,7 @@ export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents>
91
113
  /**
92
114
  * Add or update the routing table with the given peer
93
115
  */
94
- add(peerId: PeerId): Promise<void>;
116
+ add(peerId: PeerId, options?: AbortOptions): Promise<void>;
95
117
  /**
96
118
  * Remove a given peer from the table
97
119
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}