@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,18 @@
1
+ import { Message } from '../../message/index.js';
2
+ import type { DHTMessageHandler } from '../index.js';
3
+ import type { PeerRouting } from '../../peer-routing/index.js';
4
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
5
+ export interface FindNodeHandlerOptions {
6
+ peerRouting: PeerRouting;
7
+ lan: boolean;
8
+ }
9
+ export declare class FindNodeHandler implements DHTMessageHandler {
10
+ private readonly peerRouting;
11
+ private readonly lan;
12
+ constructor(options: FindNodeHandlerOptions);
13
+ /**
14
+ * Process `FindNode` DHT messages
15
+ */
16
+ handle(peerId: PeerId, msg: Message): Promise<Message>;
17
+ }
18
+ //# sourceMappingURL=find-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-node.d.ts","sourceRoot":"","sources":["../../../../src/rpc/handlers/find-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAOhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAOxD,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,OAAO,CAAA;CACb;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEhB,OAAO,EAAE,sBAAsB;IAM5C;;OAEG;IACG,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;CAsB3C"}
@@ -0,0 +1,32 @@
1
+ import { Message } from '../../message/index.js';
2
+ import { logger } from '@libp2p/logger';
3
+ import { removePrivateAddresses, removePublicAddresses } from '../../utils.js';
4
+ import { pipe } from 'it-pipe';
5
+ import map from 'it-map';
6
+ import filter from 'it-filter';
7
+ import all from 'it-all';
8
+ const log = logger('libp2p:kad-dht:rpc:handlers:find-node');
9
+ export class FindNodeHandler {
10
+ constructor(options) {
11
+ const { peerRouting, lan } = options;
12
+ this.peerRouting = peerRouting;
13
+ this.lan = Boolean(lan);
14
+ }
15
+ /**
16
+ * Process `FindNode` DHT messages
17
+ */
18
+ async handle(peerId, msg) {
19
+ log('incoming request from %p for peers closer to %b', peerId, msg.key);
20
+ const mapper = this.lan ? removePublicAddresses : removePrivateAddresses;
21
+ const closer = await pipe(await this.peerRouting.getCloserPeersOffline(msg.key, peerId), (source) => map(source, mapper), (source) => filter(source, ({ multiaddrs }) => multiaddrs.length > 0), async (source) => await all(source));
22
+ const response = new Message(msg.type, new Uint8Array(0), msg.clusterLevel);
23
+ if (closer.length > 0) {
24
+ response.closerPeers = closer;
25
+ }
26
+ else {
27
+ log('could not find any peers closer to %b than %p', msg.key, peerId);
28
+ }
29
+ return response;
30
+ }
31
+ }
32
+ //# sourceMappingURL=find-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-node.js","sourceRoot":"","sources":["../../../../src/rpc/handlers/find-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAI9B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,MAAM,GAAG,GAAG,MAAM,CAAC,uCAAuC,CAAC,CAAA;AAO3D,MAAM,OAAO,eAAe;IAI1B,YAAa,OAA+B;QAC1C,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAE,MAAc,EAAE,GAAY;QACxC,GAAG,CAAC,iDAAiD,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;QAEvE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAA;QAExE,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,MAAM,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,EAC7D,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EACrE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CACpC,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;QAE3E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAA;SAC9B;aAAM;YACL,GAAG,CAAC,+CAA+C,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;SACtE;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { Message } from '../../message/index.js';
2
+ import type { DHTMessageHandler } from '../index.js';
3
+ import type { Providers } from '../../providers.js';
4
+ import type { AddressBook } from '@libp2p/interfaces/peer-store';
5
+ import type { PeerRouting } from '../../peer-routing/index.js';
6
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
7
+ import type { PeerData } from '@libp2p/interfaces/peer-data';
8
+ export interface GetProvidersHandlerOptions {
9
+ peerRouting: PeerRouting;
10
+ providers: Providers;
11
+ addressBook: AddressBook;
12
+ lan: boolean;
13
+ }
14
+ export declare class GetProvidersHandler implements DHTMessageHandler {
15
+ private readonly peerRouting;
16
+ private readonly providers;
17
+ private readonly addressBook;
18
+ private readonly lan;
19
+ constructor(options: GetProvidersHandlerOptions);
20
+ handle(peerId: PeerId, msg: Message): Promise<Message>;
21
+ _getAddresses(peerId: PeerId): Promise<import("@multiformats/multiaddr").Multiaddr[]>;
22
+ _getPeers(peerIds: PeerId[]): Promise<PeerData[]>;
23
+ }
24
+ //# sourceMappingURL=get-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-providers.d.ts","sourceRoot":"","sources":["../../../../src/rpc/handlers/get-providers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAMhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAI5D,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,OAAO,CAAA;CACb;AAED,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEhB,OAAO,EAAE,0BAA0B;IAS1C,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;IA+BpC,aAAa,CAAE,MAAM,EAAE,MAAM;IAM7B,SAAS,CAAE,OAAO,EAAE,MAAM,EAAE;CAkBnC"}
@@ -0,0 +1,60 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import errcode from 'err-code';
3
+ import { Message } from '../../message/index.js';
4
+ import { removePrivateAddresses, removePublicAddresses } from '../../utils.js';
5
+ import { logger } from '@libp2p/logger';
6
+ const log = logger('libp2p:kad-dht:rpc:handlers:get-providers');
7
+ export class GetProvidersHandler {
8
+ constructor(options) {
9
+ const { peerRouting, providers, addressBook, lan } = options;
10
+ this.peerRouting = peerRouting;
11
+ this.providers = providers;
12
+ this.addressBook = addressBook;
13
+ this.lan = Boolean(lan);
14
+ }
15
+ async handle(peerId, msg) {
16
+ let cid;
17
+ try {
18
+ cid = CID.decode(msg.key);
19
+ }
20
+ catch (err) {
21
+ throw errcode(new Error('Invalid CID'), 'ERR_INVALID_CID');
22
+ }
23
+ log('%p asking for providers for %s', peerId, cid);
24
+ const [peers, closer] = await Promise.all([
25
+ this.providers.getProviders(cid),
26
+ this.peerRouting.getCloserPeersOffline(msg.key, peerId)
27
+ ]);
28
+ const providerPeers = await this._getPeers(peers);
29
+ const closerPeers = await this._getPeers(closer.map(({ id }) => id));
30
+ const response = new Message(msg.type, msg.key, msg.clusterLevel);
31
+ if (providerPeers.length > 0) {
32
+ response.providerPeers = providerPeers;
33
+ }
34
+ if (closerPeers.length > 0) {
35
+ response.closerPeers = closerPeers;
36
+ }
37
+ log('got %s providers %s closerPeers', providerPeers.length, closerPeers.length);
38
+ return response;
39
+ }
40
+ async _getAddresses(peerId) {
41
+ const addrs = await this.addressBook.get(peerId);
42
+ return addrs.map(address => address.multiaddr);
43
+ }
44
+ async _getPeers(peerIds) {
45
+ const output = [];
46
+ const addrFilter = this.lan ? removePublicAddresses : removePrivateAddresses;
47
+ for (const peerId of peerIds) {
48
+ const peer = addrFilter({
49
+ id: peerId,
50
+ multiaddrs: await this._getAddresses(peerId),
51
+ protocols: []
52
+ });
53
+ if (peer.multiaddrs.length > 0) {
54
+ output.push(peer);
55
+ }
56
+ }
57
+ return output;
58
+ }
59
+ }
60
+ //# sourceMappingURL=get-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-providers.js","sourceRoot":"","sources":["../../../../src/rpc/handlers/get-providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Libp2pRecord } from '@libp2p/record';
2
+ import { Message } from '../../message/index.js';
3
+ import type { DHTMessageHandler } from '../index.js';
4
+ import type { Datastore } from 'interface-datastore';
5
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
6
+ import type { KeyBook } from '@libp2p/interfaces/peer-store';
7
+ import type { PeerRouting } from '../../peer-routing/index.js';
8
+ export interface GetValueHandlerOptions {
9
+ keyBook: KeyBook;
10
+ peerRouting: PeerRouting;
11
+ datastore: Datastore;
12
+ }
13
+ export declare class GetValueHandler implements DHTMessageHandler {
14
+ private readonly keyBook;
15
+ private readonly peerRouting;
16
+ private readonly datastore;
17
+ constructor(options: GetValueHandlerOptions);
18
+ handle(peerId: PeerId, msg: Message): Promise<Message>;
19
+ /**
20
+ * Try to fetch a given record by from the local datastore.
21
+ * Returns the record iff it is still valid, meaning
22
+ * - it was either authored by this node, or
23
+ * - it was received less than `MAX_RECORD_AGE` ago.
24
+ */
25
+ _checkLocalDatastore(key: Uint8Array): Promise<Libp2pRecord | undefined>;
26
+ }
27
+ //# sourceMappingURL=get-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-value.d.ts","sourceRoot":"","sources":["../../../../src/rpc/handlers/get-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,OAAO,EAAgB,MAAM,wBAAwB,CAAA;AAM9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAI9D,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;gBAExB,OAAO,EAAE,sBAAsB;IAQtC,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;IAuD1C;;;;;OAKG;IACG,oBAAoB,CAAE,GAAG,EAAE,UAAU;CAiC5C"}
@@ -0,0 +1,94 @@
1
+ import { Libp2pRecord } from '@libp2p/record';
2
+ import errcode from 'err-code';
3
+ import { Message, MESSAGE_TYPE } from '../../message/index.js';
4
+ import { MAX_RECORD_AGE } from '../../constants.js';
5
+ import { bufferToRecordKey, isPublicKeyKey, fromPublicKeyKey } from '../../utils.js';
6
+ import { logger } from '@libp2p/logger';
7
+ const log = logger('libp2p:kad-dht:rpc:handlers:get-value');
8
+ export class GetValueHandler {
9
+ constructor(options) {
10
+ const { keyBook, peerRouting, datastore } = options;
11
+ this.keyBook = keyBook;
12
+ this.peerRouting = peerRouting;
13
+ this.datastore = datastore;
14
+ }
15
+ async handle(peerId, msg) {
16
+ const key = msg.key;
17
+ log('%p asked for key %b', peerId, key);
18
+ if (key == null || key.length === 0) {
19
+ throw errcode(new Error('Invalid key'), 'ERR_INVALID_KEY');
20
+ }
21
+ const response = new Message(MESSAGE_TYPE.GET_VALUE, key, msg.clusterLevel);
22
+ if (isPublicKeyKey(key)) {
23
+ log('is public key');
24
+ const idFromKey = fromPublicKeyKey(key);
25
+ let pubKey;
26
+ try {
27
+ const key = await this.keyBook.get(idFromKey);
28
+ if (key == null) {
29
+ throw errcode(new Error('No public key found in key book'), 'ERR_NOT_FOUND');
30
+ }
31
+ pubKey = key;
32
+ }
33
+ catch (err) {
34
+ if (err.code !== 'ERR_NOT_FOUND') {
35
+ throw err;
36
+ }
37
+ }
38
+ if (pubKey != null) {
39
+ log('returning found public key');
40
+ response.record = new Libp2pRecord(key, pubKey);
41
+ return response;
42
+ }
43
+ }
44
+ const [record, closer] = await Promise.all([
45
+ this._checkLocalDatastore(key),
46
+ this.peerRouting.getCloserPeersOffline(msg.key, peerId)
47
+ ]);
48
+ if (record != null) {
49
+ log('had record for %b in local datastore', key);
50
+ response.record = record;
51
+ }
52
+ if (closer.length > 0) {
53
+ log('had %s closer peers in routing table', closer.length);
54
+ response.closerPeers = closer;
55
+ }
56
+ return response;
57
+ }
58
+ /**
59
+ * Try to fetch a given record by from the local datastore.
60
+ * Returns the record iff it is still valid, meaning
61
+ * - it was either authored by this node, or
62
+ * - it was received less than `MAX_RECORD_AGE` ago.
63
+ */
64
+ async _checkLocalDatastore(key) {
65
+ log('checkLocalDatastore looking for %b', key);
66
+ const dsKey = bufferToRecordKey(key);
67
+ // Fetch value from ds
68
+ let rawRecord;
69
+ try {
70
+ rawRecord = await this.datastore.get(dsKey);
71
+ }
72
+ catch (err) {
73
+ if (err.code === 'ERR_NOT_FOUND') {
74
+ return undefined;
75
+ }
76
+ throw err;
77
+ }
78
+ // Create record from the returned bytes
79
+ const record = Libp2pRecord.deserialize(rawRecord);
80
+ if (record == null) {
81
+ throw errcode(new Error('Invalid record'), 'ERR_INVALID_RECORD');
82
+ }
83
+ // Check validity: compare time received with max record age
84
+ if (record.timeReceived == null ||
85
+ Date.now() - record.timeReceived.getTime() > MAX_RECORD_AGE) {
86
+ // If record is bad delete it and return
87
+ await this.datastore.delete(dsKey);
88
+ return undefined;
89
+ }
90
+ // Record is valid
91
+ return record;
92
+ }
93
+ }
94
+ //# sourceMappingURL=get-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-value.js","sourceRoot":"","sources":["../../../../src/rpc/handlers/get-value.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ declare function _exports({ peerId, providers, peerStore, addressable, peerRouting, records, validators, lan }: {
2
+ peerId: import('peer-id');
3
+ providers: import('../../providers').Providers;
4
+ peerStore: import('libp2p/src/peer-store/types').PeerStore;
5
+ addressable: import('../../types').Addressable;
6
+ peerRouting: import('../../peer-routing').PeerRouting;
7
+ records: import('interface-datastore').Datastore;
8
+ validators: import('libp2p-interfaces/src/types').DhtValidators;
9
+ lan?: boolean | undefined;
10
+ }): (type: number) => import("../types").DHTMessageHandler;
11
+ export = _exports;
12
+ export type DHTMessageHandler = import('../types').DHTMessageHandler;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/rpc/handlers/index.js"],"names":[],"mappings":"AAyBiB;IAToB,MAAM,EAAhC,OAAO,SAAS,CAAC;IAC2B,SAAS,EAArD,OAAO,iBAAiB,EAAE,SAAS;IACqB,SAAS,EAAjE,OAAO,6BAA6B,EAAE,SAAS;IACL,WAAW,EAArD,OAAO,aAAa,EAAE,WAAW;IACgB,WAAW,EAA5D,OAAO,oBAAoB,EAAE,WAAW;IACQ,OAAO,EAAvD,OAAO,qBAAqB,EAAE,SAAS;IACqB,UAAU,EAAtE,OAAO,6BAA6B,EAAE,aAAa;IAClC,GAAG;WAgBlB,MAAM,0CAOlB;;gCAnCY,OAAO,UAAU,EAAE,iBAAiB"}
@@ -0,0 +1,7 @@
1
+ import type { Message } from '../../message/index.js';
2
+ import type { DHTMessageHandler } from '../index.js';
3
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
4
+ export declare class PingHandler implements DHTMessageHandler {
5
+ handle(peerId: PeerId, msg: Message): Promise<Message>;
6
+ }
7
+ //# sourceMappingURL=ping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../../../src/rpc/handlers/ping.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAIxD,qBAAa,WAAY,YAAW,iBAAiB;IAC7C,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;CAI3C"}
@@ -0,0 +1,9 @@
1
+ import { logger } from '@libp2p/logger';
2
+ const log = logger('libp2p:kad-dht:rpc:handlers:ping');
3
+ export class PingHandler {
4
+ async handle(peerId, msg) {
5
+ log('ping from %p', peerId);
6
+ return msg;
7
+ }
8
+ }
9
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../../src/rpc/handlers/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAKvC,MAAM,GAAG,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAA;AAEtD,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,MAAM,CAAE,MAAc,EAAE,GAAY;QACxC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAC3B,OAAO,GAAG,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { DHTMessageHandler } from '../index.js';
2
+ import type { Validators } from '@libp2p/interfaces/dht';
3
+ import type { Datastore } from 'interface-datastore';
4
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
5
+ import type { Message } from '../../message/index.js';
6
+ export interface PutValueHandlerOptions {
7
+ peerId: PeerId;
8
+ validators: Validators;
9
+ datastore: Datastore;
10
+ }
11
+ export declare class PutValueHandler implements DHTMessageHandler {
12
+ private readonly validators;
13
+ private readonly datastore;
14
+ private readonly log;
15
+ constructor(options: PutValueHandlerOptions);
16
+ handle(peerId: PeerId, msg: Message): Promise<Message>;
17
+ }
18
+ //# sourceMappingURL=put-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"put-value.d.ts","sourceRoot":"","sources":["../../../../src/rpc/handlers/put-value.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAGrD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,OAAO,EAAE,sBAAsB;IAStC,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;CA0B3C"}
@@ -0,0 +1,35 @@
1
+ import { bufferToRecordKey } from '../../utils.js';
2
+ import errcode from 'err-code';
3
+ import { verifyRecord } from '@libp2p/record/validators';
4
+ import { logger } from '@libp2p/logger';
5
+ import { base58btc } from 'multiformats/bases/base58';
6
+ export class PutValueHandler {
7
+ constructor(options) {
8
+ const { validators, datastore, peerId } = options;
9
+ this.log = logger('libp2p:kad-dht:rpc:handlers:put-value:' + peerId.toString());
10
+ this.validators = validators;
11
+ this.datastore = datastore;
12
+ }
13
+ async handle(peerId, msg) {
14
+ const key = msg.key;
15
+ this.log('%p asked us to store value for key %b', peerId, key);
16
+ const record = msg.record;
17
+ if (record == null) {
18
+ const errMsg = `Empty record from: ${peerId.toString(base58btc)}`;
19
+ this.log.error(errMsg);
20
+ throw errcode(new Error(errMsg), 'ERR_EMPTY_RECORD');
21
+ }
22
+ try {
23
+ await verifyRecord(this.validators, record);
24
+ record.timeReceived = new Date();
25
+ const recordKey = bufferToRecordKey(record.key);
26
+ await this.datastore.put(recordKey, record.serialize());
27
+ this.log('put record for %b into datastore under key %k', key, recordKey);
28
+ }
29
+ catch (err) {
30
+ this.log('did not put record for key %b into datastore %o', key, err);
31
+ }
32
+ return msg;
33
+ }
34
+ }
35
+ //# sourceMappingURL=put-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"put-value.js","sourceRoot":"","sources":["../../../../src/rpc/handlers/put-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAU,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAM/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAQrD,MAAM,OAAO,eAAe;IAK1B,YAAa,OAA+B;QAC1C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;QAEjD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,wCAAwC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QAE/E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,MAAc,EAAE,GAAY;QACxC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA;QACnB,IAAI,CAAC,GAAG,CAAC,uCAAuC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QAE9D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;QAEzB,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,MAAM,MAAM,GAAG,sBAAsB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAA;YAEjE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACtB,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAA;SACrD;QAED,IAAI;YACF,MAAM,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YAE3C,MAAM,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAA;YAChC,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC/C,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;YACvD,IAAI,CAAC,GAAG,CAAC,+CAA+C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;SAC1E;QAAC,OAAO,GAAQ,EAAE;YACjB,IAAI,CAAC,GAAG,CAAC,iDAAiD,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;SACtE;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { RoutingTable } from '../routing-table';
2
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
3
+ import { Message } from '../message/index.js';
4
+ import type { IncomingStreamData } from '@libp2p/interfaces/registrar';
5
+ import type { KeyBook, AddressBook } from '@libp2p/interfaces/peer-store';
6
+ import type { Providers } from '../providers';
7
+ import type { PeerRouting } from '../peer-routing';
8
+ import type { Datastore } from 'interface-datastore';
9
+ import type { Validators } from '@libp2p/interfaces/dht';
10
+ export interface DHTMessageHandler {
11
+ handle: (peerId: PeerId, msg: Message) => Promise<Message | undefined>;
12
+ }
13
+ export interface RPCOptions {
14
+ peerId: PeerId;
15
+ routingTable: RoutingTable;
16
+ keyBook: KeyBook;
17
+ addressBook: AddressBook;
18
+ providers: Providers;
19
+ peerRouting: PeerRouting;
20
+ datastore: Datastore;
21
+ validators: Validators;
22
+ lan: boolean;
23
+ }
24
+ export declare class RPC {
25
+ private readonly handlers;
26
+ private readonly routingTable;
27
+ private readonly log;
28
+ constructor(options: RPCOptions);
29
+ /**
30
+ * Process incoming DHT messages
31
+ */
32
+ handleMessage(peerId: PeerId, msg: Message): Promise<Message | undefined>;
33
+ /**
34
+ * Handle incoming streams on the dht protocol
35
+ */
36
+ onIncomingStream(evt: CustomEvent<IncomingStreamData>): void;
37
+ }
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rpc/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,OAAO,EAAqC,MAAM,qBAAqB,CAAA;AAOhF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;CACvE;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,OAAO,CAAA;CACb;AAED,qBAAa,GAAG;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,OAAO,EAAE,UAAU;IAgBhC;;OAEG;IACG,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;IAkBjD;;OAEG;IACH,gBAAgB,CAAE,GAAG,EAAE,WAAW,CAAC,kBAAkB,CAAC;CAqCvD"}
@@ -0,0 +1,75 @@
1
+ import { pipe } from 'it-pipe';
2
+ import * as lp from 'it-length-prefixed';
3
+ import { logger } from '@libp2p/logger';
4
+ import { Message, MESSAGE_TYPE, MESSAGE_TYPE_LOOKUP } from '../message/index.js';
5
+ import { AddProviderHandler } from './handlers/add-provider.js';
6
+ import { FindNodeHandler } from './handlers/find-node.js';
7
+ import { GetProvidersHandler } from './handlers/get-providers.js';
8
+ import { GetValueHandler } from './handlers/get-value.js';
9
+ import { PingHandler } from './handlers/ping.js';
10
+ import { PutValueHandler } from './handlers/put-value.js';
11
+ export class RPC {
12
+ constructor(options) {
13
+ const { keyBook, addressBook, providers, peerRouting, datastore, validators, lan, peerId } = options;
14
+ this.log = logger('libp2p:kad-dht:rpc:' + peerId.toString());
15
+ this.routingTable = options.routingTable;
16
+ this.handlers = {
17
+ [MESSAGE_TYPE.GET_VALUE]: new GetValueHandler({ keyBook, peerRouting, datastore }),
18
+ [MESSAGE_TYPE.PUT_VALUE]: new PutValueHandler({ peerId, validators, datastore }),
19
+ [MESSAGE_TYPE.FIND_NODE]: new FindNodeHandler({ peerRouting, lan }),
20
+ [MESSAGE_TYPE.ADD_PROVIDER]: new AddProviderHandler({ providers }),
21
+ [MESSAGE_TYPE.GET_PROVIDERS]: new GetProvidersHandler({ peerRouting, providers, addressBook, lan }),
22
+ [MESSAGE_TYPE.PING]: new PingHandler()
23
+ };
24
+ }
25
+ /**
26
+ * Process incoming DHT messages
27
+ */
28
+ async handleMessage(peerId, msg) {
29
+ try {
30
+ await this.routingTable.add(peerId);
31
+ }
32
+ catch (err) {
33
+ this.log.error('Failed to update the kbucket store', err);
34
+ }
35
+ // get handler & execute it
36
+ const handler = this.handlers[msg.type];
37
+ if (handler == null) {
38
+ this.log.error(`no handler found for message type: ${msg.type}`);
39
+ return;
40
+ }
41
+ return await handler.handle(peerId, msg);
42
+ }
43
+ /**
44
+ * Handle incoming streams on the dht protocol
45
+ */
46
+ onIncomingStream(evt) {
47
+ Promise.resolve().then(async () => {
48
+ const { stream, connection } = evt.detail;
49
+ const peerId = connection.remotePeer;
50
+ try {
51
+ await this.routingTable.add(peerId);
52
+ }
53
+ catch (err) {
54
+ this.log.error(err);
55
+ }
56
+ const self = this; // eslint-disable-line @typescript-eslint/no-this-alias
57
+ await pipe(stream.source, lp.decode(), source => (async function* () {
58
+ for await (const msg of source) {
59
+ // handle the message
60
+ const desMessage = Message.deserialize(msg.slice());
61
+ self.log('incoming %s from %p', MESSAGE_TYPE_LOOKUP[desMessage.type], peerId);
62
+ const res = await self.handleMessage(peerId, desMessage);
63
+ // Not all handlers will return a response
64
+ if (res != null) {
65
+ yield res.serialize();
66
+ }
67
+ }
68
+ })(), lp.encode(), stream.sink);
69
+ })
70
+ .catch(err => {
71
+ this.log.error(err);
72
+ });
73
+ }
74
+ }
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rpc/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type PeerId from 'peer-id';
2
+ import type { Message } from '../message';
3
+ export interface DHTMessageHandler {
4
+ handle: (peerId: PeerId, msg: Message) => Promise<Message | undefined>;
5
+ }
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/rpc/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,SAAS,CAAA;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;CACvE"}
@@ -0,0 +1,33 @@
1
+ import { EventEmitter } from '@libp2p/interfaces';
2
+ import type { Registrar } from '@libp2p/interfaces/registrar';
3
+ import type { Startable } from '@libp2p/interfaces';
4
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
5
+ export interface TopologyListenerOptions {
6
+ registrar: Registrar;
7
+ protocol: string;
8
+ lan: boolean;
9
+ }
10
+ export interface TopologyListenerEvents {
11
+ 'peer': CustomEvent<PeerId>;
12
+ }
13
+ /**
14
+ * Receives notifications of new peers joining the network that support the DHT protocol
15
+ */
16
+ export declare class TopologyListener extends EventEmitter<TopologyListenerEvents> implements Startable {
17
+ private readonly log;
18
+ private readonly registrar;
19
+ private readonly protocol;
20
+ private running;
21
+ private registrarId?;
22
+ constructor(options: TopologyListenerOptions);
23
+ isStarted(): boolean;
24
+ /**
25
+ * Start the network
26
+ */
27
+ start(): Promise<void>;
28
+ /**
29
+ * Stop all network activity
30
+ */
31
+ stop(): void;
32
+ }
33
+ //# sourceMappingURL=topology-listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology-listener.d.ts","sourceRoot":"","sources":["../../src/topology-listener.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;CACb;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,YAAY,CAAC,sBAAsB,CAAE,YAAW,SAAS;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAQ;gBAEf,OAAO,EAAE,uBAAuB;IAW7C,SAAS;IAIT;;OAEG;IACG,KAAK;IAmBX;;OAEG;IACH,IAAI;CASL"}
@@ -0,0 +1,50 @@
1
+ import { Topology } from '@libp2p/topology';
2
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces';
3
+ import { logger } from '@libp2p/logger';
4
+ /**
5
+ * Receives notifications of new peers joining the network that support the DHT protocol
6
+ */
7
+ export class TopologyListener extends EventEmitter {
8
+ constructor(options) {
9
+ super();
10
+ const { registrar, protocol, lan } = options;
11
+ this.log = logger(`libp2p:kad-dht:topology-listener:${lan ? 'lan' : 'wan'}`);
12
+ this.running = false;
13
+ this.registrar = registrar;
14
+ this.protocol = protocol;
15
+ }
16
+ isStarted() {
17
+ return this.running;
18
+ }
19
+ /**
20
+ * Start the network
21
+ */
22
+ async start() {
23
+ if (this.running) {
24
+ return;
25
+ }
26
+ this.running = true;
27
+ // register protocol with topology
28
+ const topology = new Topology({
29
+ onConnect: (peerId) => {
30
+ this.log('observed peer %p with protocol %s', this.protocol, peerId);
31
+ this.dispatchEvent(new CustomEvent('peer', {
32
+ detail: peerId
33
+ }));
34
+ }
35
+ });
36
+ this.registrarId = await this.registrar.register(this.protocol, topology);
37
+ }
38
+ /**
39
+ * Stop all network activity
40
+ */
41
+ stop() {
42
+ this.running = false;
43
+ // unregister protocol and handlers
44
+ if (this.registrarId != null) {
45
+ this.registrar.unregister(this.registrarId);
46
+ this.registrarId = undefined;
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=topology-listener.js.map