@libp2p/kad-dht 0.28.6

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.
Files changed (166) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +105 -0
  3. package/dist/src/constants.d.ts +20 -0
  4. package/dist/src/constants.d.ts.map +1 -0
  5. package/dist/src/constants.js +34 -0
  6. package/dist/src/constants.js.map +1 -0
  7. package/dist/src/content-fetching/index.d.ts +55 -0
  8. package/dist/src/content-fetching/index.d.ts.map +1 -0
  9. package/dist/src/content-fetching/index.js +190 -0
  10. package/dist/src/content-fetching/index.js.map +1 -0
  11. package/dist/src/content-routing/index.d.ts +42 -0
  12. package/dist/src/content-routing/index.d.ts.map +1 -0
  13. package/dist/src/content-routing/index.js +129 -0
  14. package/dist/src/content-routing/index.js.map +1 -0
  15. package/dist/src/dual-kad-dht.d.ts +65 -0
  16. package/dist/src/dual-kad-dht.d.ts.map +1 -0
  17. package/dist/src/dual-kad-dht.js +191 -0
  18. package/dist/src/dual-kad-dht.js.map +1 -0
  19. package/dist/src/index.d.ts +4 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +15 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/kad-dht.d.ts +131 -0
  24. package/dist/src/kad-dht.d.ts.map +1 -0
  25. package/dist/src/kad-dht.js +268 -0
  26. package/dist/src/kad-dht.js.map +1 -0
  27. package/dist/src/message/dht.d.ts +297 -0
  28. package/dist/src/message/dht.js +921 -0
  29. package/dist/src/message/index.d.ts +32 -0
  30. package/dist/src/message/index.d.ts.map +1 -0
  31. package/dist/src/message/index.js +81 -0
  32. package/dist/src/message/index.js.map +1 -0
  33. package/dist/src/network.d.ts +60 -0
  34. package/dist/src/network.d.ts.map +1 -0
  35. package/dist/src/network.js +124 -0
  36. package/dist/src/network.js.map +1 -0
  37. package/dist/src/peer-list/index.d.ts +29 -0
  38. package/dist/src/peer-list/index.d.ts.map +1 -0
  39. package/dist/src/peer-list/index.js +44 -0
  40. package/dist/src/peer-list/index.js.map +1 -0
  41. package/dist/src/peer-list/peer-distance-list.d.ts +34 -0
  42. package/dist/src/peer-list/peer-distance-list.d.ts.map +1 -0
  43. package/dist/src/peer-list/peer-distance-list.js +64 -0
  44. package/dist/src/peer-list/peer-distance-list.js.map +1 -0
  45. package/dist/src/peer-routing/index.d.ts +71 -0
  46. package/dist/src/peer-routing/index.d.ts.map +1 -0
  47. package/dist/src/peer-routing/index.js +256 -0
  48. package/dist/src/peer-routing/index.js.map +1 -0
  49. package/dist/src/providers.d.ts +64 -0
  50. package/dist/src/providers.d.ts.map +1 -0
  51. package/dist/src/providers.js +208 -0
  52. package/dist/src/providers.js.map +1 -0
  53. package/dist/src/query/events.d.ts +46 -0
  54. package/dist/src/query/events.d.ts.map +1 -0
  55. package/dist/src/query/events.js +73 -0
  56. package/dist/src/query/events.js.map +1 -0
  57. package/dist/src/query/manager.d.ts +40 -0
  58. package/dist/src/query/manager.d.ts.map +1 -0
  59. package/dist/src/query/manager.js +140 -0
  60. package/dist/src/query/manager.js.map +1 -0
  61. package/dist/src/query/query-path.d.ts +58 -0
  62. package/dist/src/query/query-path.d.ts.map +1 -0
  63. package/dist/src/query/query-path.js +171 -0
  64. package/dist/src/query/query-path.js.map +1 -0
  65. package/dist/src/query/types.d.ts +16 -0
  66. package/dist/src/query/types.d.ts.map +1 -0
  67. package/dist/src/query/types.js +2 -0
  68. package/dist/src/query/types.js.map +1 -0
  69. package/dist/src/query-self.d.ts +31 -0
  70. package/dist/src/query-self.d.ts.map +1 -0
  71. package/dist/src/query-self.js +73 -0
  72. package/dist/src/query-self.js.map +1 -0
  73. package/dist/src/routing-table/generated-prefix-list-browser.d.ts +3 -0
  74. package/dist/src/routing-table/generated-prefix-list-browser.d.ts.map +1 -0
  75. package/dist/src/routing-table/generated-prefix-list-browser.js +1027 -0
  76. package/dist/src/routing-table/generated-prefix-list-browser.js.map +1 -0
  77. package/dist/src/routing-table/generated-prefix-list.d.ts +3 -0
  78. package/dist/src/routing-table/generated-prefix-list.d.ts.map +1 -0
  79. package/dist/src/routing-table/generated-prefix-list.js +4099 -0
  80. package/dist/src/routing-table/generated-prefix-list.js.map +1 -0
  81. package/dist/src/routing-table/index.d.ts +91 -0
  82. package/dist/src/routing-table/index.d.ts.map +1 -0
  83. package/dist/src/routing-table/index.js +183 -0
  84. package/dist/src/routing-table/index.js.map +1 -0
  85. package/dist/src/routing-table/refresh.d.ts +50 -0
  86. package/dist/src/routing-table/refresh.d.ts.map +1 -0
  87. package/dist/src/routing-table/refresh.js +204 -0
  88. package/dist/src/routing-table/refresh.js.map +1 -0
  89. package/dist/src/routing-table/types.d.ts +24 -0
  90. package/dist/src/routing-table/types.d.ts.map +1 -0
  91. package/dist/src/rpc/handlers/add-provider.d.ts +13 -0
  92. package/dist/src/rpc/handlers/add-provider.d.ts.map +1 -0
  93. package/dist/src/rpc/handlers/add-provider.js +42 -0
  94. package/dist/src/rpc/handlers/add-provider.js.map +1 -0
  95. package/dist/src/rpc/handlers/find-node.d.ts +18 -0
  96. package/dist/src/rpc/handlers/find-node.d.ts.map +1 -0
  97. package/dist/src/rpc/handlers/find-node.js +32 -0
  98. package/dist/src/rpc/handlers/find-node.js.map +1 -0
  99. package/dist/src/rpc/handlers/get-providers.d.ts +24 -0
  100. package/dist/src/rpc/handlers/get-providers.d.ts.map +1 -0
  101. package/dist/src/rpc/handlers/get-providers.js +60 -0
  102. package/dist/src/rpc/handlers/get-providers.js.map +1 -0
  103. package/dist/src/rpc/handlers/get-value.d.ts +27 -0
  104. package/dist/src/rpc/handlers/get-value.d.ts.map +1 -0
  105. package/dist/src/rpc/handlers/get-value.js +94 -0
  106. package/dist/src/rpc/handlers/get-value.js.map +1 -0
  107. package/dist/src/rpc/handlers/index.d.ts +13 -0
  108. package/dist/src/rpc/handlers/index.d.ts.map +1 -0
  109. package/dist/src/rpc/handlers/ping.d.ts +7 -0
  110. package/dist/src/rpc/handlers/ping.d.ts.map +1 -0
  111. package/dist/src/rpc/handlers/ping.js +9 -0
  112. package/dist/src/rpc/handlers/ping.js.map +1 -0
  113. package/dist/src/rpc/handlers/put-value.d.ts +18 -0
  114. package/dist/src/rpc/handlers/put-value.d.ts.map +1 -0
  115. package/dist/src/rpc/handlers/put-value.js +35 -0
  116. package/dist/src/rpc/handlers/put-value.js.map +1 -0
  117. package/dist/src/rpc/index.d.ts +38 -0
  118. package/dist/src/rpc/index.d.ts.map +1 -0
  119. package/dist/src/rpc/index.js +75 -0
  120. package/dist/src/rpc/index.js.map +1 -0
  121. package/dist/src/rpc/types.d.ts +6 -0
  122. package/dist/src/rpc/types.d.ts.map +1 -0
  123. package/dist/src/topology-listener.d.ts +33 -0
  124. package/dist/src/topology-listener.d.ts.map +1 -0
  125. package/dist/src/topology-listener.js +50 -0
  126. package/dist/src/topology-listener.js.map +1 -0
  127. package/dist/src/types.d.ts +143 -0
  128. package/dist/src/types.d.ts.map +1 -0
  129. package/dist/src/utils.d.ts +33 -0
  130. package/dist/src/utils.d.ts.map +1 -0
  131. package/dist/src/utils.js +89 -0
  132. package/dist/src/utils.js.map +1 -0
  133. package/package.json +200 -0
  134. package/src/constants.ts +50 -0
  135. package/src/content-fetching/index.ts +276 -0
  136. package/src/content-routing/index.ts +202 -0
  137. package/src/dual-kad-dht.ts +257 -0
  138. package/src/index.ts +21 -0
  139. package/src/kad-dht.ts +396 -0
  140. package/src/message/dht.d.ts +297 -0
  141. package/src/message/dht.js +921 -0
  142. package/src/message/dht.proto +75 -0
  143. package/src/message/index.ts +111 -0
  144. package/src/network.ts +185 -0
  145. package/src/peer-list/index.ts +54 -0
  146. package/src/peer-list/peer-distance-list.ts +93 -0
  147. package/src/peer-routing/index.ts +332 -0
  148. package/src/providers.ts +278 -0
  149. package/src/query/events.ts +126 -0
  150. package/src/query/manager.ts +188 -0
  151. package/src/query/query-path.ts +263 -0
  152. package/src/query/types.ts +22 -0
  153. package/src/query-self.ts +106 -0
  154. package/src/routing-table/generated-prefix-list-browser.ts +1026 -0
  155. package/src/routing-table/generated-prefix-list.ts +4098 -0
  156. package/src/routing-table/index.ts +265 -0
  157. package/src/routing-table/refresh.ts +263 -0
  158. package/src/rpc/handlers/add-provider.ts +63 -0
  159. package/src/rpc/handlers/find-node.ts +57 -0
  160. package/src/rpc/handlers/get-providers.ts +95 -0
  161. package/src/rpc/handlers/get-value.ts +130 -0
  162. package/src/rpc/handlers/ping.ts +13 -0
  163. package/src/rpc/handlers/put-value.ts +58 -0
  164. package/src/rpc/index.ts +118 -0
  165. package/src/topology-listener.ts +78 -0
  166. package/src/utils.ts +108 -0
@@ -0,0 +1,65 @@
1
+ import type { KadDHT } from './kad-dht.js';
2
+ import type { DHT, QueryOptions } from '@libp2p/interfaces/dht';
3
+ import { AbortOptions, EventEmitter } from '@libp2p/interfaces';
4
+ import type { CID } from 'multiformats';
5
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
6
+ import type { PeerDiscoveryEvents } from '@libp2p/interfaces/peer-discovery';
7
+ import type { PeerStore } from '@libp2p/interfaces/peer-store';
8
+ /**
9
+ * A DHT implementation modelled after Kademlia with S/Kademlia modifications.
10
+ * Original implementation in go: https://github.com/libp2p/go-libp2p-kad-dht.
11
+ */
12
+ export declare class DualKadDHT extends EventEmitter<PeerDiscoveryEvents> implements DHT {
13
+ wan: KadDHT;
14
+ lan: KadDHT;
15
+ peerId: PeerId;
16
+ peerStore: PeerStore;
17
+ constructor(wan: KadDHT, lan: KadDHT, peerId: PeerId, peerStore: PeerStore);
18
+ /**
19
+ * Is this DHT running.
20
+ */
21
+ isStarted(): boolean;
22
+ /**
23
+ * If 'server' this node will respond to DHT queries, if 'client' this node will not
24
+ */
25
+ getMode(): Promise<"client" | "server">;
26
+ /**
27
+ * If 'server' this node will respond to DHT queries, if 'client' this node will not
28
+ */
29
+ setMode(mode: 'client' | 'server'): Promise<void>;
30
+ /**
31
+ * Start listening to incoming connections.
32
+ */
33
+ start(): Promise<void>;
34
+ /**
35
+ * Stop accepting incoming connections and sending outgoing
36
+ * messages.
37
+ */
38
+ stop(): Promise<void>;
39
+ /**
40
+ * Store the given key/value pair in the DHT
41
+ */
42
+ put(key: Uint8Array, value: Uint8Array, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").SendingQueryEvent | import("@libp2p/interfaces/dht").PeerResponseEvent | import("@libp2p/interfaces/dht").QueryErrorEvent | import("@libp2p/interfaces/dht").ProviderEvent | import("@libp2p/interfaces/dht").ValueEvent | import("@libp2p/interfaces/dht").AddingPeerEvent | import("@libp2p/interfaces/dht").DialingPeerEvent, void, unknown>;
43
+ /**
44
+ * Get the value that corresponds to the passed key
45
+ */
46
+ get(key: Uint8Array, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, unknown>;
47
+ /**
48
+ * Announce to the network that we can provide given key's value
49
+ */
50
+ provide(key: CID, options?: AbortOptions): AsyncGenerator<import("@libp2p/interfaces/dht").SendingQueryEvent | import("@libp2p/interfaces/dht").PeerResponseEvent | import("@libp2p/interfaces/dht").QueryErrorEvent | import("@libp2p/interfaces/dht").ProviderEvent | import("@libp2p/interfaces/dht").ValueEvent | import("@libp2p/interfaces/dht").AddingPeerEvent | import("@libp2p/interfaces/dht").DialingPeerEvent, void, unknown>;
51
+ /**
52
+ * Search the dht for up to `K` providers of the given CID
53
+ */
54
+ findProviders(key: CID, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, undefined>;
55
+ /**
56
+ * Search for a peer with the given ID
57
+ */
58
+ findPeer(id: PeerId, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, unknown>;
59
+ /**
60
+ * Kademlia 'node lookup' operation
61
+ */
62
+ getClosestPeers(key: Uint8Array, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, undefined>;
63
+ refreshRoutingTable(): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=dual-kad-dht.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dual-kad-dht.d.ts","sourceRoot":"","sources":["../../src/dual-kad-dht.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAA;AAC5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAI9D;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY,CAAC,mBAAmB,CAAE,YAAW,GAAG;IACvE,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;gBAEd,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS;IAqB3E;;OAEG;IACH,SAAS;IAIT;;OAEG;IACG,OAAO;IAIb;;OAEG;IACG,OAAO,CAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAIxC;;OAEG;IACG,KAAK;IAOX;;;OAGG;IACG,IAAI;IAOV;;OAEG;IACK,GAAG,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,YAAiB;IA8B3E;;OAEG;IACK,GAAG,CAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,YAAiB;IAyCxD;;OAEG;IACK,OAAO,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,YAAiB;IAuCrD;;OAEG;IACK,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,YAAiB;IAS3D;;OAEG;IACK,QAAQ,CAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB;IAmBxD;;OAEG;IACK,eAAe,CAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,YAAiB;IAO9D,mBAAmB;CAM1B"}
@@ -0,0 +1,191 @@
1
+ import { logger } from '@libp2p/logger';
2
+ import errCode from 'err-code';
3
+ import merge from 'it-merge';
4
+ import { queryErrorEvent } from './query/events.js';
5
+ import { EventEmitter, CustomEvent } from '@libp2p/interfaces';
6
+ const log = logger('libp2p:kad-dht');
7
+ /**
8
+ * A DHT implementation modelled after Kademlia with S/Kademlia modifications.
9
+ * Original implementation in go: https://github.com/libp2p/go-libp2p-kad-dht.
10
+ */
11
+ export class DualKadDHT extends EventEmitter {
12
+ constructor(wan, lan, peerId, peerStore) {
13
+ super();
14
+ this.wan = wan;
15
+ this.lan = lan;
16
+ this.peerId = peerId;
17
+ this.peerStore = peerStore;
18
+ // handle peers being discovered during processing of DHT messages
19
+ this.wan.addEventListener('peer', (evt) => {
20
+ this.dispatchEvent(new CustomEvent('peer', {
21
+ detail: evt.detail
22
+ }));
23
+ });
24
+ this.lan.addEventListener('peer', (evt) => {
25
+ this.dispatchEvent(new CustomEvent('peer', {
26
+ detail: evt.detail
27
+ }));
28
+ });
29
+ }
30
+ /**
31
+ * Is this DHT running.
32
+ */
33
+ isStarted() {
34
+ return this.wan.isStarted() && this.lan.isStarted();
35
+ }
36
+ /**
37
+ * If 'server' this node will respond to DHT queries, if 'client' this node will not
38
+ */
39
+ async getMode() {
40
+ return await this.wan.getMode();
41
+ }
42
+ /**
43
+ * If 'server' this node will respond to DHT queries, if 'client' this node will not
44
+ */
45
+ async setMode(mode) {
46
+ await this.wan.setMode(mode);
47
+ }
48
+ /**
49
+ * Start listening to incoming connections.
50
+ */
51
+ async start() {
52
+ await Promise.all([
53
+ this.lan.start(),
54
+ this.wan.start()
55
+ ]);
56
+ }
57
+ /**
58
+ * Stop accepting incoming connections and sending outgoing
59
+ * messages.
60
+ */
61
+ async stop() {
62
+ await Promise.all([
63
+ this.lan.stop(),
64
+ this.wan.stop()
65
+ ]);
66
+ }
67
+ /**
68
+ * Store the given key/value pair in the DHT
69
+ */
70
+ async *put(key, value, options = {}) {
71
+ let counterAll = 0;
72
+ let counterSuccess = 0;
73
+ for await (const event of merge(this.lan.put(key, value, options), this.wan.put(key, value, options))) {
74
+ yield event;
75
+ if (event.name === 'SENDING_QUERY' && event.messageName === 'PUT_VALUE') {
76
+ counterAll++;
77
+ }
78
+ if (event.name === 'PEER_RESPONSE' && event.messageName === 'PUT_VALUE') {
79
+ counterSuccess++;
80
+ }
81
+ }
82
+ // Ensure we have a default `minPeers`
83
+ const minPeers = options.minPeers == null ? counterAll ?? 1 : options.minPeers;
84
+ // verify if we were able to put to enough peers
85
+ if (counterSuccess < minPeers) {
86
+ const error = errCode(new Error(`Failed to put value to enough peers: ${counterSuccess}/${minPeers}`), 'ERR_NOT_ENOUGH_PUT_PEERS');
87
+ log.error(error);
88
+ throw error;
89
+ }
90
+ }
91
+ /**
92
+ * Get the value that corresponds to the passed key
93
+ */
94
+ async *get(key, options = {}) {
95
+ let queriedPeers = false;
96
+ let foundValue = false;
97
+ for await (const event of merge(this.lan.get(key, options), this.wan.get(key, options))) {
98
+ yield event;
99
+ if (event.name === 'DIALING_PEER') {
100
+ queriedPeers = true;
101
+ }
102
+ if (event.name === 'VALUE') {
103
+ queriedPeers = true;
104
+ if (event.value != null) {
105
+ foundValue = true;
106
+ }
107
+ }
108
+ if (event.name === 'SENDING_QUERY') {
109
+ queriedPeers = true;
110
+ }
111
+ }
112
+ if (!queriedPeers) {
113
+ throw errCode(new Error('No peers found in routing table!'), 'ERR_NO_PEERS_IN_ROUTING_TABLE');
114
+ }
115
+ if (!foundValue) {
116
+ yield queryErrorEvent({
117
+ from: this.peerId,
118
+ error: errCode(new Error('Not found'), 'ERR_NOT_FOUND')
119
+ });
120
+ }
121
+ }
122
+ // ----------- Content Routing
123
+ /**
124
+ * Announce to the network that we can provide given key's value
125
+ */
126
+ async *provide(key, options = {}) {
127
+ let sent = 0;
128
+ let success = 0;
129
+ const errors = [];
130
+ const dhts = [this.lan];
131
+ // only run provide on the wan if we are in server mode
132
+ if ((await this.wan.getMode()) === 'server') {
133
+ dhts.push(this.wan);
134
+ }
135
+ for await (const event of merge(...dhts.map(dht => dht.provide(key, options)))) {
136
+ yield event;
137
+ if (event.name === 'SENDING_QUERY') {
138
+ sent++;
139
+ }
140
+ if (event.name === 'QUERY_ERROR') {
141
+ errors.push(event.error);
142
+ }
143
+ if (event.name === 'PEER_RESPONSE' && event.messageName === 'ADD_PROVIDER') {
144
+ log('sent provider record for %s to %p', key, event.from);
145
+ success++;
146
+ }
147
+ }
148
+ if (success === 0) {
149
+ if (errors.length > 0) {
150
+ // if all sends failed, throw an error to inform the caller
151
+ throw errCode(new Error(`Failed to provide to ${errors.length} of ${sent} peers`), 'ERR_PROVIDES_FAILED', { errors });
152
+ }
153
+ throw errCode(new Error('Failed to provide - no peers found'), 'ERR_PROVIDES_FAILED');
154
+ }
155
+ }
156
+ /**
157
+ * Search the dht for up to `K` providers of the given CID
158
+ */
159
+ async *findProviders(key, options = {}) {
160
+ yield* merge(this.lan.findProviders(key, options), this.wan.findProviders(key, options));
161
+ }
162
+ // ----------- Peer Routing -----------
163
+ /**
164
+ * Search for a peer with the given ID
165
+ */
166
+ async *findPeer(id, options = {}) {
167
+ let queriedPeers = false;
168
+ for await (const event of merge(this.lan.findPeer(id, options), this.wan.findPeer(id, options))) {
169
+ yield event;
170
+ if (event.name === 'SENDING_QUERY' || event.name === 'FINAL_PEER') {
171
+ queriedPeers = true;
172
+ }
173
+ }
174
+ if (!queriedPeers) {
175
+ throw errCode(new Error('Peer lookup failed'), 'ERR_LOOKUP_FAILED');
176
+ }
177
+ }
178
+ /**
179
+ * Kademlia 'node lookup' operation
180
+ */
181
+ async *getClosestPeers(key, options = {}) {
182
+ yield* merge(this.lan.getClosestPeers(key, options), this.wan.getClosestPeers(key, options));
183
+ }
184
+ async refreshRoutingTable() {
185
+ await Promise.all([
186
+ this.lan.refreshRoutingTable(),
187
+ this.wan.refreshRoutingTable()
188
+ ]);
189
+ }
190
+ }
191
+ //# sourceMappingURL=dual-kad-dht.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dual-kad-dht.js","sourceRoot":"","sources":["../../src/dual-kad-dht.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { KadDHTOptions } from './kad-dht.js';
2
+ import type { DHT } from '@libp2p/interfaces/dht';
3
+ export declare function createKadDHT(opts: KadDHTOptions): DHT;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AAEjD,wBAAgB,YAAY,CAAE,IAAI,EAAE,aAAa,GAAG,GAAG,CAgBtD"}
@@ -0,0 +1,15 @@
1
+ import { KadDHT } from './kad-dht.js';
2
+ import { DualKadDHT } from './dual-kad-dht.js';
3
+ export function createKadDHT(opts) {
4
+ return new DualKadDHT(new KadDHT({
5
+ ...opts,
6
+ protocol: '/ipfs/kad/1.0.0',
7
+ lan: false
8
+ }), new KadDHT({
9
+ ...opts,
10
+ protocol: '/ipfs/lan/kad/1.0.0',
11
+ clientMode: false,
12
+ lan: true
13
+ }), opts.peerId, opts.peerStore);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG9C,MAAM,UAAU,YAAY,CAAE,IAAmB;IAC/C,OAAO,IAAI,UAAU,CACnB,IAAI,MAAM,CAAC;QACT,GAAG,IAAI;QACP,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,EAAE,KAAK;KACX,CAAC,EACF,IAAI,MAAM,CAAC;QACT,GAAG,IAAI;QACP,QAAQ,EAAE,qBAAqB;QAC/B,UAAU,EAAE,KAAK;QACjB,GAAG,EAAE,IAAI;KACV,CAAC,EACF,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CACf,CAAA;AACH,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { RoutingTable } from './routing-table/index.js';
2
+ import { Network } from './network.js';
3
+ import { PeerRouting } from './peer-routing/index.js';
4
+ import { Providers } from './providers.js';
5
+ import type { DHT, QueryOptions, Validators, Selectors } from '@libp2p/interfaces/dht';
6
+ import type { PeerData } from '@libp2p/interfaces/peer-data';
7
+ import { EventEmitter } from '@libp2p/interfaces';
8
+ import type { Addressable, Dialer } from '@libp2p/interfaces';
9
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
10
+ import type { PeerStore } from '@libp2p/interfaces/peer-store';
11
+ import type { ComponentMetricsTracker } from '@libp2p/interfaces/metrics';
12
+ import type { Datastore } from 'interface-datastore';
13
+ import type { Registrar } from '@libp2p/interfaces/registrar';
14
+ import type { CID } from 'multiformats/cid';
15
+ import type { PeerDiscoveryEvents } from '@libp2p/interfaces/peer-discovery';
16
+ export interface KadDHTOptions {
17
+ /**
18
+ * libp2p registrar handle protocol
19
+ */
20
+ protocol: string;
21
+ /**
22
+ * k-bucket size (default 20)
23
+ */
24
+ kBucketSize?: number;
25
+ /**
26
+ * If true, the DHT will not respond to queries. This should be true if your node will not be dialable. (default: false)
27
+ */
28
+ clientMode?: boolean;
29
+ /**
30
+ * validators object with namespace as keys and function(key, record, callback)
31
+ */
32
+ validators: Validators;
33
+ /**
34
+ * selectors object with namespace as keys and function(key, records)
35
+ */
36
+ selectors: Selectors;
37
+ /**
38
+ * how often to search the network for peers close to ourselves
39
+ */
40
+ querySelfInterval: number;
41
+ lan: boolean;
42
+ bootstrapPeers: PeerData[];
43
+ dialer: Dialer;
44
+ addressable: Addressable;
45
+ peerStore: PeerStore;
46
+ peerId: PeerId;
47
+ datastore: Datastore;
48
+ registrar: Registrar;
49
+ metrics?: ComponentMetricsTracker;
50
+ }
51
+ /**
52
+ * A DHT implementation modelled after Kademlia with S/Kademlia modifications.
53
+ * Original implementation in go: https://github.com/libp2p/go-libp2p-kad-dht.
54
+ */
55
+ export declare class KadDHT extends EventEmitter<PeerDiscoveryEvents> implements DHT {
56
+ private readonly log;
57
+ private running;
58
+ protocol: string;
59
+ private readonly kBucketSize;
60
+ private clientMode;
61
+ private readonly bootstrapPeers;
62
+ routingTable: RoutingTable;
63
+ providers: Providers;
64
+ private readonly lan;
65
+ private readonly validators;
66
+ private readonly selectors;
67
+ network: Network;
68
+ private readonly queryManager;
69
+ peerRouting: PeerRouting;
70
+ private readonly contentFetching;
71
+ private readonly contentRouting;
72
+ private readonly routingTableRefresh;
73
+ private readonly rpc;
74
+ private readonly topologyListener;
75
+ private readonly querySelf;
76
+ addressable: Addressable;
77
+ registrar: Registrar;
78
+ private registrarHandleId?;
79
+ /**
80
+ * Create a new KadDHT
81
+ */
82
+ constructor(options: KadDHTOptions);
83
+ onPeerConnect(peerData: PeerData): Promise<void>;
84
+ /**
85
+ * Is this DHT running.
86
+ */
87
+ isStarted(): boolean;
88
+ /**
89
+ * If 'server' this node will respond to DHT queries, if 'client' this node will not
90
+ */
91
+ getMode(): Promise<"client" | "server">;
92
+ /**
93
+ * If 'server' this node will respond to DHT queries, if 'client' this node will not
94
+ */
95
+ setMode(mode: 'client' | 'server'): Promise<void>;
96
+ /**
97
+ * Start listening to incoming connections.
98
+ */
99
+ start(): Promise<void>;
100
+ /**
101
+ * Stop accepting incoming connections and sending outgoing
102
+ * messages.
103
+ */
104
+ stop(): Promise<void>;
105
+ /**
106
+ * Store the given key/value pair in the DHT
107
+ */
108
+ put(key: Uint8Array, value: Uint8Array, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").SendingQueryEvent | import("@libp2p/interfaces/dht").PeerResponseEvent | import("@libp2p/interfaces/dht").QueryErrorEvent | import("@libp2p/interfaces/dht").ProviderEvent | import("@libp2p/interfaces/dht").ValueEvent | import("@libp2p/interfaces/dht").AddingPeerEvent | import("@libp2p/interfaces/dht").DialingPeerEvent, void, undefined>;
109
+ /**
110
+ * Get the value that corresponds to the passed key
111
+ */
112
+ get(key: Uint8Array, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, unknown>;
113
+ /**
114
+ * Announce to the network that we can provide given key's value
115
+ */
116
+ provide(key: CID, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").SendingQueryEvent | import("@libp2p/interfaces/dht").PeerResponseEvent | import("@libp2p/interfaces/dht").QueryErrorEvent | import("@libp2p/interfaces/dht").ProviderEvent | import("@libp2p/interfaces/dht").ValueEvent | import("@libp2p/interfaces/dht").AddingPeerEvent | import("@libp2p/interfaces/dht").DialingPeerEvent, void, undefined>;
117
+ /**
118
+ * Search the dht for providers of the given CID
119
+ */
120
+ findProviders(key: CID, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, unknown>;
121
+ /**
122
+ * Search for a peer with the given ID
123
+ */
124
+ findPeer(id: PeerId, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, unknown>;
125
+ /**
126
+ * Kademlia 'node lookup' operation
127
+ */
128
+ getClosestPeers(key: Uint8Array, options?: QueryOptions): AsyncGenerator<import("@libp2p/interfaces/dht").QueryEvent, void, unknown>;
129
+ refreshRoutingTable(): Promise<void>;
130
+ }
131
+ //# sourceMappingURL=kad-dht.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kad-dht.d.ts","sourceRoot":"","sources":["../../src/kad-dht.ts"],"names":[],"mappings":"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"}