Skip to content

Commit

Permalink
fix: limit connections, UI fixes for displaying peers, added flag for…
Browse files Browse the repository at this point in the history
… certs for rust peer (#35)
  • Loading branch information
maschad committed Apr 12, 2023
1 parent 6097f5a commit 1a3f719
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 227 deletions.
5 changes: 2 additions & 3 deletions packages/frontend/src/lib/constants.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
export const CHAT_TOPIC = "universal-connectivity"

// export const DEFAULT_APP_PEER = '12D3KooWBdmLJjhpgJ9KZgLM3f894ff9xyBfPvPjFNn7MKJpyrC2'
export const DEFAULT_APP_PEER = '12D3KooWRBy97UB99e3J6hiPesre1MZeuNQvfan4gBziswrRJsNK'
export const CIRCUIT_RELAY_CODE = 290


export const CIRCUIT_RELAY_CODE = 290
export const BOOTSTRAP_NODE = "/ip4/18.195.246.16/udp/9090/webrtc-direct/certhash/uEiBy_U1UNQ0IDvot_PKlQM_QeU3yx-zCAVaMxxVm2JxWBg/p2p/12D3KooWGTDZj1zAjMCJ8XXx9Z88zAAd6vn3krQYLwZ67S4vMUxz"
10 changes: 9 additions & 1 deletion packages/frontend/src/lib/libp2p.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,19 @@ export async function startLibp2p(options: {} = {}) {
discoverRelays: 1,
}),],
connectionEncryption: [noise()],
connectionManager: {
maxConnections: 10,
minConnections: 1,
},
streamMuxers: [yamux()],
peerDiscovery: [
bootstrap({
// #TODO: change to remote address
// list: [
// '/ip4/18.195.246.16/udp/9090/webrtc-direct/certhash/uEiBy_U1UNQ0IDvot_PKlQM_QeU3yx-zCAVaMxxVm2JxWBg/p2p/12D3KooWGTDZj1zAjMCJ8XXx9Z88zAAd6vn3krQYLwZ67S4vMUxz',
// ],
list: [
'/ip4/18.195.246.16/udp/9090/webrtc-direct/certhash/uEiBy_U1UNQ0IDvot_PKlQM_QeU3yx-zCAVaMxxVm2JxWBg/p2p/12D3KooWGTDZj1zAjMCJ8XXx9Z88zAAd6vn3krQYLwZ67S4vMUxz',
'/ip4/127.0.0.1/udp/9090/webrtc-direct/certhash/uEiBy_U1UNQ0IDvot_PKlQM_QeU3yx-zCAVaMxxVm2JxWBg/p2p/12D3KooWA3nM2DyNTTJSPVdPzz7gvg8PHNNHPdNHxQm7KmvMbywM'
],
}),
],
Expand Down
228 changes: 14 additions & 214 deletions packages/frontend/src/pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,21 @@ import Head from 'next/head'
import { CheckCircleIcon, XCircleIcon } from '@heroicons/react/20/solid'
import Nav from '@/components/nav'
import { useLibp2pContext } from '@/context/ctx'
import { useCallback, useState } from 'react'
import { useState } from 'react'
import { useInterval } from 'usehooks-ts'

import {
connectToMultiaddr,
connectToMultiaddrs,
filterPublicMultiaddrs,
getPeerMultiaddrs,
Libp2pDialError,
} from '@/lib/libp2p'
import type { Multiaddr } from '@multiformats/multiaddr'
import { multiaddr } from '@multiformats/multiaddr'
import { peerIdFromString } from '@libp2p/peer-id'
import { PeerId } from '@libp2p/interface-peer-id'
import type { Connection } from '@libp2p/interface-connection'

import { DEFAULT_APP_PEER } from '../lib/constants'

export default function Home() {
const { libp2p } = useLibp2pContext()
const [isConnected, setIsConnected] = useState(false)
const [peerID, setPeerID] = useState(DEFAULT_APP_PEER)
const [maddr, setMultiaddr] = useState('')
const [peers, setPeers] = useState<PeerId[]>([])
const [connections, setConnections] = useState<Connection[]>([])
const [latency, setLatency] = useState<number>()
const [multiaddrs, setMultiaddrs] = useState<Multiaddr[]>()

useInterval(() => {
const getConnectedPeers = async () => {
Expand All @@ -38,25 +26,22 @@ export default function Home() {
return await libp2p.getConnections()
}

// const ping = async () => {
// if (maddr) {
// return libp2p.ping(multiaddr(maddr))
// }
// }
const ping = async () => {
if (maddr) {
return libp2p.ping(multiaddr(maddr))
}
}

// ping()
// .then((lat) => {
// setLatency(lat)
// })
// .catch((e) => {
// console.error(e, e?.error)
// })
ping()
.then((lat) => {
setLatency(lat)
})
.catch((e) => {
console.error(e, e?.error)
})

getConnectedPeers().then((peers) => {
// If one of the connected peers matches the one in input we're connected
if (peers.some((pID) => multiaddr(maddr).getPeerId() === pID.toString())) {
setIsConnected(true)
}
setIsConnected(true)
setPeers(peers)
})
getConnections().then((conns) => {
Expand All @@ -65,109 +50,6 @@ export default function Home() {
})
}, 10000)

// Effect hook to connect to a specific peer when the page loads
// useEffect(() => {
// const connect = async () => {
// await connectToMultiaddrs(libp2p)([
// multiaddr(
// '/dns4/ny5.bootstrap.libp2p.io/tcp/443/wss/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa',
// ),
// ])
// }

// connect()
// .then(() => {
// setIsConnected(true)
// })
// .catch((e) => {
// console.error(e, e?.error)
// setIsConnected(false)
// })
// }, [setIsConnected, setMultiaddrs, libp2p])

const handleGetMultiaddrs = useCallback(
async (e: React.MouseEvent<HTMLButtonElement>) => {
try {
// 👇 Peer routing (DHT/DELEGATED)
setMultiaddrs(undefined)
const addrs = await getPeerMultiaddrs(libp2p)(peerID)

setMultiaddrs(addrs)

} catch (e) {
console.error(e)
}
},
[libp2p, setMultiaddrs, peerID],
)

const handleFilterMultiaddrs = useCallback(
(e: React.MouseEvent<HTMLButtonElement>) => {
if (multiaddrs) {
setMultiaddrs(filterPublicMultiaddrs(multiaddrs))
}
},
[setMultiaddrs, multiaddrs],
)

const handleConnectToMultiaddrs = useCallback(
async (e: React.MouseEvent<HTMLButtonElement>) => {
try {
if (multiaddrs) {
const connections = await connectToMultiaddrs(libp2p)(
multiaddrs,
peerID,
)
console.log('connections: ', connections)

if (
connections.find((conn) => {
return conn.remotePeer.toString() === peerID
})
) {
setIsConnected(true)
}
}
} catch (e) {
console.error(e)
}
},
[libp2p, multiaddrs, peerID],
)

const handleConnectToMultiaddr = useCallback(
async (e: React.MouseEvent<HTMLButtonElement>) => {
if (!maddr) {
return
}

try {
const connection = await connectToMultiaddr(libp2p)(multiaddr(maddr))
console.log('connection: ', connection)

return connection
} catch (e) {
console.error(e)
}
},
[libp2p, maddr],
)

// handleConnectToMultiaddr

const handleMultiaddrChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
setMultiaddr(e.target.value)
},
[setMultiaddr],
)

const handlePeerIdChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
setPeerID(e.target.value)
},
[setPeerID],
)

return (
<>
Expand All @@ -193,89 +75,7 @@ export default function Home() {
<li className="">This PeerID: {libp2p.peerId.toString()}</li>
</ul>

<div className="my-6 w-1/2">
<label
htmlFor="peer-id"
className="block text-sm font-medium leading-6 text-gray-900"
>
PeerID to connect to
</label>
<div className="mt-2">
<input
value={peerID}
type="text"
name="peer-id"
id="peer-id"
className="block w-full rounded-md border-0 py-1.5 px-3 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
placeholder="12D3Koo..."
aria-describedby="peer-id-description"
onChange={handlePeerIdChange}
/>
</div>
{/* <p
className="mt-2 text-sm text-gray-500"
id="peer-id-description"
></p> */}
<button
type="button"
className="rounded-md bg-indigo-600 my-2 py-2 px-3 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
onClick={handleGetMultiaddrs}
>
Get Multiaddrs
</button>
</div>

<div>
{multiaddrs && multiaddrs.length > 0 ? (
<>
<h3> Multiaddrs for {peerID} 👇</h3>
<pre className="px-2">
{multiaddrs.map((peer) => peer.toString()).join('\n')}
</pre>
<button
type="button"
className="rounded-md bg-teal-500 mx-2 my-2 py-2 px-3 text-sm font-semibold text-white shadow-sm hover:bg-teal-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
onClick={handleFilterMultiaddrs}
>
Filter Public WebTransport
</button>
<button
type="button"
className="rounded-md bg-teal-500 my-2 py-2 px-3 text-sm font-semibold text-white shadow-sm hover:bg-teal-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
onClick={handleConnectToMultiaddrs}
>
Connect to Peer
</button>
</>
) : null}
</div>
<div className="my-6 w-1/2">
<label
htmlFor="peer-id"
className="block text-sm font-medium leading-6 text-gray-900"
>
multiaddr to connect to
</label>
<div className="mt-2">
<input
value={maddr}
type="text"
name="peer-id"
id="peer-id"
className="block w-full rounded-md border-0 py-1.5 px-3 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
placeholder="12D3Koo..."
aria-describedby="multiaddr-id-description"
onChange={handleMultiaddrChange}
/>
</div>
<button
type="button"
className="rounded-md bg-indigo-600 my-2 py-2 px-3 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
onClick={handleConnectToMultiaddr}
>
Connect to multiaddr
</button>
</div>
<p className="my-4 inline-flex items-center text-xl">
Connected:{' '}
{isConnected ? (
Expand Down
29 changes: 20 additions & 9 deletions rust-peer/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use std::{
fs::File,
hash::{Hash, Hasher},
io::{BufReader, Read},
time::{Duration, Instant},
time::Duration,
};

const TICK_INTERVAL: Duration = Duration::from_secs(15);
Expand Down Expand Up @@ -77,6 +77,10 @@ struct Opt {
/// Address of a remote peer to connect to.
#[clap(long)]
remote_address: Option<Multiaddr>,

// use certificate path
#[clap(long)]
use_cert: Option<String>,
}

/// An example WebRTC peer that will accept connections
Expand All @@ -103,7 +107,6 @@ async fn main() -> Result<()> {

let mut tick = futures_timer::Delay::new(TICK_INTERVAL);

let now = Instant::now();
loop {
match futures::future::select(swarm.next(), &mut tick).await {
futures::future::Either::Left((event, _)) => match event.unwrap() {
Expand Down Expand Up @@ -223,18 +226,26 @@ struct Behaviour {
identify: identify::Behaviour,
kademlia: Kademlia<MemoryStore>,
keep_alive: keep_alive::Behaviour,
// ping: ping::Behaviour,
ping: ping::Behaviour,
relay: relay::Behaviour,
}

fn create_swarm() -> Result<Swarm<Behaviour>> {
let f = File::open("/home/ec2-user/private_key")?;
let mut reader = BufReader::new(f);
let mut buffer = Vec::new();
let local_key;

let opt = Opt::parse();

if let Some(use_cert) = opt.use_cert {
let f = File::open(use_cert)?;
let mut reader = BufReader::new(f);
let mut buffer = Vec::new();

reader.read_to_end(&mut buffer)?;
reader.read_to_end(&mut buffer)?;

let local_key = identity::Keypair::ed25519_from_bytes(&mut buffer)?;
local_key = identity::Keypair::ed25519_from_bytes(&mut buffer)?;
} else {
local_key = identity::Keypair::generate_ed25519();
}

let local_peer_id = PeerId::from(local_key.public());
debug!("Local peer id: {local_peer_id}");
Expand Down Expand Up @@ -294,7 +305,7 @@ fn create_swarm() -> Result<Swarm<Behaviour>> {
identify: identify_config,
kademlia: kad_behaviour,
keep_alive: keep_alive::Behaviour::default(),
// ping: ping::Behaviour::default(),
ping: ping::Behaviour::default(),
relay: relay::Behaviour::new(local_peer_id, Default::default()),
};
Ok(SwarmBuilder::with_tokio_executor(transport, behaviour, local_peer_id).build())
Expand Down

0 comments on commit 1a3f719

Please sign in to comment.