Skip to content

Commit

Permalink
Merge branch 'fix-issue-152-dht-1' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
elielnfinic authored Nov 1, 2024
2 parents a89a50f + cebbc84 commit d2ecb29
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 42 deletions.
Binary file added examples/.DS_Store
Binary file not shown.
1 change: 0 additions & 1 deletion examples/grid/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
<h1>A 2D grid made with CRO</h1>
<p>Your Peer ID: <span id="peerId"></span></p>
<p>Peers on dRAM: <span id="peers"></span></p>
<p>Discovery Peers: <span id="discoveryPeers"></span></p>

<button id="createGrid">Spawn a new Grid CRO</button>
<span style="margin: 0 10px;">|</span>
Expand Down
17 changes: 6 additions & 11 deletions examples/grid/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ const node = new TopologyNode();
let topologyObject: TopologyObject;
let gridCRO: Grid;
let peers: string[] = [];
let discoveryPeers: string[] = [];
let objectPeers: string[] = [];

const formatNodeId = (id: string): string => {
Expand Down Expand Up @@ -65,11 +64,6 @@ const render = () => {
const element_peers = <HTMLDivElement>document.getElementById("peers");
element_peers.innerHTML = `[${peers.map((peer) => `<strong style="color: ${getColorForNodeId(peer)};">${formatNodeId(peer)}</strong>`).join(", ")}]`;

const element_discoveryPeers = <HTMLDivElement>(
document.getElementById("discoveryPeers")
);
element_discoveryPeers.innerHTML = `[${discoveryPeers.map((peer) => `<strong style="color: ${getColorForNodeId(peer)};">${formatNodeId(peer)}</strong>`).join(", ")}]`;

const element_objectPeers = <HTMLDivElement>(
document.getElementById("objectPeers")
);
Expand Down Expand Up @@ -205,11 +199,12 @@ async function main() {
await node.start();
render();

node.addCustomGroupMessageHandler("", (e) => {
peers = node.networkNode.getAllPeers();
discoveryPeers = node.networkNode.getGroupPeers("topology::discovery");
render();
});
setInterval(() => {
if (node.networkNode.checkNodeReady()) {
peers = node.networkNode.getAllPeers();
render();
}
}, 1000);

const button_create = <HTMLButtonElement>(
document.getElementById("createGrid")
Expand Down
1 change: 1 addition & 0 deletions examples/grid/vite.config.mts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import path from "node:path";
import { fs } from "memfs";
import { defineConfig } from "vite";
import { nodePolyfills } from "vite-plugin-node-polyfills";

Expand Down
2 changes: 2 additions & 0 deletions packages/network/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,10 @@
"@libp2p/dcutr": "^2.0.6",
"@libp2p/devtools-metrics": "^1.1.5",
"@libp2p/identify": "^3.0.6",
"@libp2p/kad-dht": "14.0.0",
"@libp2p/mdns": "^11.0.8",
"@libp2p/peer-id": "^5.0.4",
"@libp2p/peer-store": "11.0.7",
"@libp2p/pubsub-peer-discovery": "^11.0.0",
"@libp2p/webrtc": "^5.0.9",
"@libp2p/websockets": "^9.0.7",
Expand Down
66 changes: 47 additions & 19 deletions packages/network/src/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ import type {
Stream,
StreamHandler,
} from "@libp2p/interface";
import {
type KadDHT,
kadDHT,
removePrivateAddressesMapper,
removePublicAddressesMapper,
} from "@libp2p/kad-dht";
import { pubsubPeerDiscovery } from "@libp2p/pubsub-peer-discovery";
import { webRTC, webRTCDirect } from "@libp2p/webrtc";
import { webSockets } from "@libp2p/websockets";
Expand Down Expand Up @@ -72,31 +78,36 @@ export class TopologyNetworkNode {
const _bootstrapNodesList = this._config?.bootstrap_peers
? this._config.bootstrap_peers
: [
"/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP",
// "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP",
"/ip4/127.0.0.1/tcp/50000/ws/p2p/12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ",
// "/dns4/topology-1.nfinic.com/tcp/4430/wss/p2p/12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ",
];

const _pubsubPeerDiscovery = pubsubPeerDiscovery({
interval: 10_000,
topics: ["topology::discovery"],
});

const _peerDiscovery = _bootstrapNodesList.length
? [
_pubsubPeerDiscovery,
bootstrap({
list: _bootstrapNodesList,
}),
]
: [_pubsubPeerDiscovery];
: [];

const _node_services = {
autonat: autoNAT(),
dcutr: dcutr(),
identify: identify(),
pubsub: gossipsub(),
dht: kadDHT({
protocol: "/topology/dht/1.0.0",
kBucketSize: this._config?.bootstrap ? 40 : 20,
clientMode: false,
peerInfoMapper: removePublicAddressesMapper,
querySelfInterval: 20000,
initialQuerySelfInterval: 10000,
allowQueryWithZeroPeers: false,
}),
};

const _bootstrap_services = {
const _bootstrap_node_services = {
..._node_services,
relay: circuitRelayServer(),
};
Expand All @@ -114,7 +125,9 @@ export class TopologyNetworkNode {
},
metrics: this._config?.browser_metrics ? devToolsMetrics() : undefined,
peerDiscovery: _peerDiscovery,
services: this._config?.bootstrap ? _bootstrap_services : _node_services,
services: this._config?.bootstrap
? _bootstrap_node_services
: _node_services,
streamMuxers: [yamux()],
transports: [
circuitRelayTransport({
Expand All @@ -132,31 +145,34 @@ export class TopologyNetworkNode {

if (!this._config?.bootstrap) {
for (const addr of this._config?.bootstrap_peers || []) {
this._node.dial(multiaddr(addr));
const stream = await this._node.dial(multiaddr(addr));
}
}

this._pubsub = this._node.services.pubsub as PubSub<GossipsubEvents>;

this.peerId = this._node.peerId.toString();

log.info(
"::start: Successfuly started topology network w/ peer_id",
this.peerId,
);

this._node.addEventListener("peer:connect", (e) =>
log.info("::start::peer::connect", e.detail),
);
this._node.addEventListener("peer:discovery", (e) => {
this._node.addEventListener("peer:connect", async (e) => {
console.log("::start::peer::connect", e.detail);
});

this._node.addEventListener("peer:discovery", async (e) => {
// current bug in v11.0.0 requires manual dial (https://github.com/libp2p/js-libp2p-pubsub-peer-discovery/issues/149)
for (const ma of e.detail.multiaddrs) {
this._node?.dial(ma);
}
log.info("::start::peer::discovery", e.detail);
console.log("::start::peer::discovery", e.detail.id);
});

this._node.addEventListener("peer:identify", (e) => {
console.log("::start::peer::identify", e.detail.peerId);
});
this._node.addEventListener("peer:identify", (e) =>
log.info("::start::peer::identify", e.detail),
);
}

subscribe(topic: string) {
Expand Down Expand Up @@ -257,4 +273,16 @@ export class TopologyNetworkNode {
addMessageHandler(protocol: string | string[], handler: StreamHandler) {
this._node?.handle(protocol, handler);
}

/**
* This function allows to check if the node is ready to be used on the network
* We check if the node has any multiaddrs as for /webrtc it takes a while to get them assigned from the relay server node.
* @returns boolean
*/
checkNodeReady(): boolean {
if (this._node?.getMultiaddrs().length) {
return true;
}
return false;
}
}
99 changes: 88 additions & 11 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit d2ecb29

Please sign in to comment.