Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add DHT support #251

Closed
wants to merge 64 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
19cc3f7
Adding the protocol
elielnfinic Oct 28, 2024
0030825
Adding topology_dht
elielnfinic Oct 28, 2024
015a970
Testing connection to DHT
elielnfinic Oct 28, 2024
9ed1eea
Announcing and getting peers
elielnfinic Oct 29, 2024
80a327b
Commenting pubsub discovery
elielnfinic Oct 30, 2024
596d3bb
Testing online before cleaning
elielnfinic Oct 31, 2024
e2022f4
Changing bootstrap ndoe
elielnfinic Oct 31, 2024
2e43495
Applying biome fix
elielnfinic Nov 1, 2024
790e820
Updating grid example
elielnfinic Nov 1, 2024
cebbc84
Updating the grid example
elielnfinic Nov 1, 2024
d2ecb29
Merge branch 'fix-issue-152-dht-1' into main
elielnfinic Nov 1, 2024
d607945
Merge pull request #4 from elielnfinic/main
elielnfinic Nov 1, 2024
6adaef0
Resolving review
elielnfinic Nov 4, 2024
dad86e4
Resolving review
elielnfinic Nov 4, 2024
466e546
Remove nfinic bootstrap
elielnfinic Nov 4, 2024
5a83b62
Optimizing DHT
elielnfinic Nov 5, 2024
885b5bb
Trying WAN DHT only
elielnfinic Nov 5, 2024
bd09c28
Keeping all addresses types
elielnfinic Nov 5, 2024
bf2fa60
Remove private addresses mapper
elielnfinic Nov 5, 2024
75f875c
Updating DHT config
elielnfinic Nov 5, 2024
7695a53
Public mapper
elielnfinic Nov 5, 2024
b4fe317
Remove public address mapper
elielnfinic Nov 5, 2024
1fa8fd8
Rolling back to old config
elielnfinic Nov 5, 2024
606f098
Public & private
elielnfinic Nov 6, 2024
cba5542
internet protocol
elielnfinic Nov 6, 2024
eb2750e
Removing mapper
elielnfinic Nov 6, 2024
93dac32
Rmv private addr mapper
elielnfinic Nov 6, 2024
9bb5f1b
Rmv private addr mapper
elielnfinic Nov 6, 2024
b9fe214
Adding callback on new peers
elielnfinic Nov 6, 2024
408a806
Refactoring Chat Example
elielnfinic Nov 6, 2024
75899ab
Fixing canvas example
elielnfinic Nov 6, 2024
eed1ef3
Research on bad dependencies issue
elielnfinic Nov 8, 2024
ae2a7dc
chore: release v0.2.1
d-roak Nov 1, 2024
e9c4433
feat: initial benchmarking w/ page deployment (#234)
d-roak Nov 6, 2024
722cbac
chore: remove compose in favor of infra repo
d-roak Nov 6, 2024
90abfe1
chore: change the alert threshold for the benchmark
d-roak Nov 6, 2024
329514d
ci: add pull request on the benchmark flow (#235)
d-roak Nov 6, 2024
cd58082
ci: refactor perms and change output summaries (#237)
d-roak Nov 6, 2024
2578216
ci: save benchmark cache
d-roak Nov 6, 2024
a1dae40
ci: use cache restore in the benchmark
d-roak Nov 6, 2024
2ef4864
ci: change how cache is saved/restored
d-roak Nov 6, 2024
f823199
ci: change cache retrieved on docs workflow
d-roak Nov 6, 2024
378e2d1
ci: change benchmark alert threshold to 50%
d-roak Nov 6, 2024
f7331c8
ci: change benchmark alert threshold to 110%
d-roak Nov 6, 2024
7fc3628
ci: change benchmark alert threshold to 130%
d-roak Nov 6, 2024
aa109ce
chore: fix CODEOWNERS
d-roak Nov 6, 2024
3c3d6c2
chore: fix oliver's id
d-roak Nov 6, 2024
15c9a0c
refactor: change relay to bootstrap mode (#239)
d-roak Nov 6, 2024
36f63b0
chore: release v0.3.0
d-roak Nov 6, 2024
5f090f7
fix: lost of CRO context in `resolveConflicts` (#243)
cwkang1998 Nov 7, 2024
2c3b622
chore: rm oliver from codeowners
d-roak Nov 10, 2024
46bb511
rebase el pr
d-roak Nov 13, 2024
fcc1951
chore: release v0.3.1
d-roak Nov 12, 2024
215e905
chore: split folders for code reviewers
d-roak Nov 12, 2024
ab2d699
chore: rm everyone from generic codeowner
d-roak Nov 12, 2024
7cb7b57
fix: paths on codeowners
d-roak Nov 12, 2024
50a1355
fix: paths on codeowners
d-roak Nov 12, 2024
c759fcc
chore: rm el from node package reviewing
d-roak Nov 13, 2024
54884e9
chore: update lock and version
d-roak Nov 13, 2024
efbb254
Merge branch 'main' into feat/dht
d-roak Nov 13, 2024
66eb1ea
rm unused dep and console logs
d-roak Nov 13, 2024
b867fb6
run biome
d-roak Nov 13, 2024
4224440
remove commented stuff, unused code, and irrelevant stuff to the pr
d-roak Nov 13, 2024
fdc11b3
rm unused callbacks; await on the dial
d-roak Nov 14, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion examples/canvas/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
<div style="margin-bottom: 10px">
<p>Connected to <span id="canvasId"></span></p>
<p>peers: <span id="peers"></span></p>
<p>discovery_peers: <span id="discovery_peers"></span></p>
<p>object_peers: <span id="object_peers"></span></p>
<input
id="canvasIdInput"
Expand Down
14 changes: 6 additions & 8 deletions examples/canvas/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,12 @@ const node = new TopologyNode();
let topologyObject: TopologyObject;
let canvasCRO: Canvas;
let peers: string[] = [];
let discoveryPeers: string[] = [];
let objectPeers: string[] = [];

const render = () => {
const peers_element = <HTMLDivElement>document.getElementById("peers");
peers_element.innerHTML = `[${peers.join(", ")}]`;

const discovery_element = <HTMLDivElement>(
document.getElementById("discovery_peers")
);
discovery_element.innerHTML = `[${discoveryPeers.join(", ")}]`;

const object_element = <HTMLDivElement>(
document.getElementById("object_peers")
);
Expand Down Expand Up @@ -84,9 +78,13 @@ async function init() {
}
}

node.addCustomGroupMessageHandler("", (e) => {
node.networkNode.getNode().addEventListener("peer:connect", (peerId) => {
peers = node.networkNode.getAllPeers();
render();
});

node.networkNode.getNode().addEventListener("peer:disconnect", (peerId) => {
peers = node.networkNode.getAllPeers();
discoveryPeers = node.networkNode.getGroupPeers("topology::discovery");
render();
});

Expand Down
1 change: 0 additions & 1 deletion examples/chat/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ <h1>Topology Protocol - Chat</h1>
<p>Current peer ID <span id="peerId"></span></p>
<p>Connected to <span id="chatId"></span></p>
<p>peers: <span id="peers"></span></p>
<p>discovery_peers: <span id="discoveryPeers"></span></p>
<p>object_peers: <span id="objectPeers"></span></p>

<input id="roomInput" type="text" placeholder="Room ID" />
Expand Down
15 changes: 6 additions & 9 deletions examples/chat/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 chatCRO: Chat;
let peers: string[] = [];
let discoveryPeers: string[] = [];
let objectPeers: string[] = [];

const render = () => {
Expand All @@ -20,11 +19,6 @@ const render = () => {
const element_peers = <HTMLDivElement>document.getElementById("peers");
element_peers.innerHTML = `[${peers.join(", ")}]`;

const element_discoveryPeers = <HTMLDivElement>(
document.getElementById("discoveryPeers")
);
element_discoveryPeers.innerHTML = `[${discoveryPeers.join(", ")}]`;

const element_objectPeers = <HTMLDivElement>(
document.getElementById("objectPeers")
);
Expand Down Expand Up @@ -79,10 +73,13 @@ async function main() {
await node.start();
render();

// generic message handler
node.addCustomGroupMessageHandler("", (e) => {
node.networkNode.getNode().addEventListener("peer:connect", (peerId) => {
peers = node.networkNode.getAllPeers();
render();
});

node.networkNode.getNode().addEventListener("peer:disconnect", (peerId) => {
peers = node.networkNode.getAllPeers();
discoveryPeers = node.networkNode.getGroupPeers("topology::discovery");
render();
});

Expand Down
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
22 changes: 13 additions & 9 deletions examples/grid/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import { Grid } from "./objects/grid";
import { hslToRgb, rgbToHex, rgbToHsl } from "./util/color";

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 +65,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 @@ -202,12 +197,22 @@ async function createConnectHandlers() {
}

async function main() {
// node.networkNode.setOnPeerConnect((peerId : any) => {
// console.log("NEW PEER CONNECTED", peerId);
// peers = node.networkNode.getAllPeers();
// render();
// });

await node.start();
render();

node.addCustomGroupMessageHandler("", (e) => {
node.networkNode.getNode().addEventListener("peer:connect", (peerId) => {
peers = node.networkNode.getAllPeers();
render();
});

node.networkNode.getNode().addEventListener("peer:disconnect", (peerId) => {
peers = node.networkNode.getAllPeers();
discoveryPeers = node.networkNode.getGroupPeers("topology::discovery");
render();
});

Expand Down Expand Up @@ -257,7 +262,6 @@ async function main() {
navigator.clipboard
.writeText(gridIdText)
.then(() => {
// alert("Grid CRO ID copied to clipboard!");
console.log("Grid CRO ID copied to clipboard");
})
.catch((err) => {
Expand Down
1 change: 1 addition & 0 deletions packages/network/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"@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/pubsub-peer-discovery": "^11.0.0",
Expand Down
46 changes: 27 additions & 19 deletions packages/network/src/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ import { devToolsMetrics } from "@libp2p/devtools-metrics";
import { identify } from "@libp2p/identify";
import type {
EventCallback,
PeerId,
PubSub,
Stream,
StreamHandler,
} from "@libp2p/interface";
import { pubsubPeerDiscovery } from "@libp2p/pubsub-peer-discovery";
import { kadDHT, removePrivateAddressesMapper } from "@libp2p/kad-dht";
import { webRTC, webRTCDirect } from "@libp2p/webrtc";
import { webSockets } from "@libp2p/websockets";
import * as filters from "@libp2p/websockets/filters";
Expand Down Expand Up @@ -76,28 +77,28 @@ export class TopologyNetworkNode {
"/dns4/bootstrap2.topology.gg/tcp/443/wss/p2p/12D3KooWLGuTtCHLpd1SBHeyvzT3kHVe2dw8P7UdoXsfQHu8qvkf",
];

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",
// both undefined and false should run client mode
clientMode: !this._config?.bootstrap,
peerInfoMapper: removePrivateAddressesMapper,
}),
};

const _bootstrap_services = {
const _bootstrap_node_services = {
..._node_services,
relay: circuitRelayServer(),
};
Expand All @@ -115,7 +116,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 Down Expand Up @@ -145,10 +148,16 @@ export class TopologyNetworkNode {
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", (e) => {
log.info("::peer:connect", e.detail);
});

this._node.addEventListener("peer:disconnect", (e) => {
log.info("::peer:disconnect", e.detail);
});

this._node.addEventListener("peer:discovery", async (e) => {
log.info("::start::peer::discovery", e.detail);
// current bug in v11.0.0 requires manual dial (https://github.com/libp2p/js-libp2p-pubsub-peer-discovery/issues/149)
const sortedAddrs = e.detail.multiaddrs.sort((a, b) => {
const localRegex =
Expand All @@ -166,14 +175,13 @@ export class TopologyNetworkNode {

// Dial non-local multiaddrs, then WebRTC multiaddrs
for (const address of sortedAddrs) {
this._node?.dial(address);
await this._node?.dial(address);
}
});

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

subscribe(topic: string) {
Expand Down
53 changes: 53 additions & 0 deletions pnpm-lock.yaml

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