@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.
- package/LICENSE +4 -0
- package/README.md +105 -0
- package/dist/src/constants.d.ts +20 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +34 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/content-fetching/index.d.ts +55 -0
- package/dist/src/content-fetching/index.d.ts.map +1 -0
- package/dist/src/content-fetching/index.js +190 -0
- package/dist/src/content-fetching/index.js.map +1 -0
- package/dist/src/content-routing/index.d.ts +42 -0
- package/dist/src/content-routing/index.d.ts.map +1 -0
- package/dist/src/content-routing/index.js +129 -0
- package/dist/src/content-routing/index.js.map +1 -0
- package/dist/src/dual-kad-dht.d.ts +65 -0
- package/dist/src/dual-kad-dht.d.ts.map +1 -0
- package/dist/src/dual-kad-dht.js +191 -0
- package/dist/src/dual-kad-dht.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kad-dht.d.ts +131 -0
- package/dist/src/kad-dht.d.ts.map +1 -0
- package/dist/src/kad-dht.js +268 -0
- package/dist/src/kad-dht.js.map +1 -0
- package/dist/src/message/dht.d.ts +297 -0
- package/dist/src/message/dht.js +921 -0
- package/dist/src/message/index.d.ts +32 -0
- package/dist/src/message/index.d.ts.map +1 -0
- package/dist/src/message/index.js +81 -0
- package/dist/src/message/index.js.map +1 -0
- package/dist/src/network.d.ts +60 -0
- package/dist/src/network.d.ts.map +1 -0
- package/dist/src/network.js +124 -0
- package/dist/src/network.js.map +1 -0
- package/dist/src/peer-list/index.d.ts +29 -0
- package/dist/src/peer-list/index.d.ts.map +1 -0
- package/dist/src/peer-list/index.js +44 -0
- package/dist/src/peer-list/index.js.map +1 -0
- package/dist/src/peer-list/peer-distance-list.d.ts +34 -0
- package/dist/src/peer-list/peer-distance-list.d.ts.map +1 -0
- package/dist/src/peer-list/peer-distance-list.js +64 -0
- package/dist/src/peer-list/peer-distance-list.js.map +1 -0
- package/dist/src/peer-routing/index.d.ts +71 -0
- package/dist/src/peer-routing/index.d.ts.map +1 -0
- package/dist/src/peer-routing/index.js +256 -0
- package/dist/src/peer-routing/index.js.map +1 -0
- package/dist/src/providers.d.ts +64 -0
- package/dist/src/providers.d.ts.map +1 -0
- package/dist/src/providers.js +208 -0
- package/dist/src/providers.js.map +1 -0
- package/dist/src/query/events.d.ts +46 -0
- package/dist/src/query/events.d.ts.map +1 -0
- package/dist/src/query/events.js +73 -0
- package/dist/src/query/events.js.map +1 -0
- package/dist/src/query/manager.d.ts +40 -0
- package/dist/src/query/manager.d.ts.map +1 -0
- package/dist/src/query/manager.js +140 -0
- package/dist/src/query/manager.js.map +1 -0
- package/dist/src/query/query-path.d.ts +58 -0
- package/dist/src/query/query-path.d.ts.map +1 -0
- package/dist/src/query/query-path.js +171 -0
- package/dist/src/query/query-path.js.map +1 -0
- package/dist/src/query/types.d.ts +16 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/types.js +2 -0
- package/dist/src/query/types.js.map +1 -0
- package/dist/src/query-self.d.ts +31 -0
- package/dist/src/query-self.d.ts.map +1 -0
- package/dist/src/query-self.js +73 -0
- package/dist/src/query-self.js.map +1 -0
- package/dist/src/routing-table/generated-prefix-list-browser.d.ts +3 -0
- package/dist/src/routing-table/generated-prefix-list-browser.d.ts.map +1 -0
- package/dist/src/routing-table/generated-prefix-list-browser.js +1027 -0
- package/dist/src/routing-table/generated-prefix-list-browser.js.map +1 -0
- package/dist/src/routing-table/generated-prefix-list.d.ts +3 -0
- package/dist/src/routing-table/generated-prefix-list.d.ts.map +1 -0
- package/dist/src/routing-table/generated-prefix-list.js +4099 -0
- package/dist/src/routing-table/generated-prefix-list.js.map +1 -0
- package/dist/src/routing-table/index.d.ts +91 -0
- package/dist/src/routing-table/index.d.ts.map +1 -0
- package/dist/src/routing-table/index.js +183 -0
- package/dist/src/routing-table/index.js.map +1 -0
- package/dist/src/routing-table/refresh.d.ts +50 -0
- package/dist/src/routing-table/refresh.d.ts.map +1 -0
- package/dist/src/routing-table/refresh.js +204 -0
- package/dist/src/routing-table/refresh.js.map +1 -0
- package/dist/src/routing-table/types.d.ts +24 -0
- package/dist/src/routing-table/types.d.ts.map +1 -0
- package/dist/src/rpc/handlers/add-provider.d.ts +13 -0
- package/dist/src/rpc/handlers/add-provider.d.ts.map +1 -0
- package/dist/src/rpc/handlers/add-provider.js +42 -0
- package/dist/src/rpc/handlers/add-provider.js.map +1 -0
- package/dist/src/rpc/handlers/find-node.d.ts +18 -0
- package/dist/src/rpc/handlers/find-node.d.ts.map +1 -0
- package/dist/src/rpc/handlers/find-node.js +32 -0
- package/dist/src/rpc/handlers/find-node.js.map +1 -0
- package/dist/src/rpc/handlers/get-providers.d.ts +24 -0
- package/dist/src/rpc/handlers/get-providers.d.ts.map +1 -0
- package/dist/src/rpc/handlers/get-providers.js +60 -0
- package/dist/src/rpc/handlers/get-providers.js.map +1 -0
- package/dist/src/rpc/handlers/get-value.d.ts +27 -0
- package/dist/src/rpc/handlers/get-value.d.ts.map +1 -0
- package/dist/src/rpc/handlers/get-value.js +94 -0
- package/dist/src/rpc/handlers/get-value.js.map +1 -0
- package/dist/src/rpc/handlers/index.d.ts +13 -0
- package/dist/src/rpc/handlers/index.d.ts.map +1 -0
- package/dist/src/rpc/handlers/ping.d.ts +7 -0
- package/dist/src/rpc/handlers/ping.d.ts.map +1 -0
- package/dist/src/rpc/handlers/ping.js +9 -0
- package/dist/src/rpc/handlers/ping.js.map +1 -0
- package/dist/src/rpc/handlers/put-value.d.ts +18 -0
- package/dist/src/rpc/handlers/put-value.d.ts.map +1 -0
- package/dist/src/rpc/handlers/put-value.js +35 -0
- package/dist/src/rpc/handlers/put-value.js.map +1 -0
- package/dist/src/rpc/index.d.ts +38 -0
- package/dist/src/rpc/index.d.ts.map +1 -0
- package/dist/src/rpc/index.js +75 -0
- package/dist/src/rpc/index.js.map +1 -0
- package/dist/src/rpc/types.d.ts +6 -0
- package/dist/src/rpc/types.d.ts.map +1 -0
- package/dist/src/topology-listener.d.ts +33 -0
- package/dist/src/topology-listener.d.ts.map +1 -0
- package/dist/src/topology-listener.js +50 -0
- package/dist/src/topology-listener.js.map +1 -0
- package/dist/src/types.d.ts +143 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/utils.d.ts +33 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +89 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +200 -0
- package/src/constants.ts +50 -0
- package/src/content-fetching/index.ts +276 -0
- package/src/content-routing/index.ts +202 -0
- package/src/dual-kad-dht.ts +257 -0
- package/src/index.ts +21 -0
- package/src/kad-dht.ts +396 -0
- package/src/message/dht.d.ts +297 -0
- package/src/message/dht.js +921 -0
- package/src/message/dht.proto +75 -0
- package/src/message/index.ts +111 -0
- package/src/network.ts +185 -0
- package/src/peer-list/index.ts +54 -0
- package/src/peer-list/peer-distance-list.ts +93 -0
- package/src/peer-routing/index.ts +332 -0
- package/src/providers.ts +278 -0
- package/src/query/events.ts +126 -0
- package/src/query/manager.ts +188 -0
- package/src/query/query-path.ts +263 -0
- package/src/query/types.ts +22 -0
- package/src/query-self.ts +106 -0
- package/src/routing-table/generated-prefix-list-browser.ts +1026 -0
- package/src/routing-table/generated-prefix-list.ts +4098 -0
- package/src/routing-table/index.ts +265 -0
- package/src/routing-table/refresh.ts +263 -0
- package/src/rpc/handlers/add-provider.ts +63 -0
- package/src/rpc/handlers/find-node.ts +57 -0
- package/src/rpc/handlers/get-providers.ts +95 -0
- package/src/rpc/handlers/get-value.ts +130 -0
- package/src/rpc/handlers/ping.ts +13 -0
- package/src/rpc/handlers/put-value.ts +58 -0
- package/src/rpc/index.ts +118 -0
- package/src/topology-listener.ts +78 -0
- 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":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAQvC,MAAM,GAAG,GAAG,MAAM,CAAC,2CAA2C,CAAC,CAAA;AAS/D,MAAM,OAAO,mBAAmB;IAM9B,YAAa,OAAmC;QAC9C,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QAE5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,MAAc,EAAE,GAAY;QACxC,IAAI,GAAG,CAAA;QACP,IAAI;YACF,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SAC1B;QAAC,OAAO,GAAQ,EAAE;YACjB,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC,CAAA;SAC3D;QAED,GAAG,CAAC,gCAAgC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QAElD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;SACxD,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACpE,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;QAEjE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAA;SACvC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAA;SACnC;QAED,GAAG,CAAC,iCAAiC,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QAChF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CAAE,MAAc;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEhD,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,SAAS,CAAE,OAAiB;QAChC,MAAM,MAAM,GAAe,EAAE,CAAA;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAA;QAE5E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,MAAM,IAAI,GAAG,UAAU,CAAC;gBACtB,EAAE,EAAE,MAAM;gBACV,UAAU,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC5C,SAAS,EAAE,EAAE;aACd,CAAC,CAAA;YAEF,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aAClB;SACF;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|