diff --git a/packages/cli/README.md b/packages/cli/README.md index 8f3e4865..fecfd694 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -17,7 +17,7 @@ A basic CLI to pass messages between peers using `stdin`/`stdout` yarn build ``` -* Run a local signalling server (skip if an already running signalling server is available): +* (Optional) Run a local signalling server: ```bash # In packages/peer @@ -28,9 +28,11 @@ A basic CLI to pass messages between peers using `stdin`/`stdout` ```bash # In packages/peer - yarn relay-node + yarn relay-node --signal-server [SIGNAL_SERVER_URL] ``` + * `signal-server`: multiaddr of a signalling server (default: local signalling server multiaddr) + * Start the node: ```bash diff --git a/packages/cli/src/chat.ts b/packages/cli/src/chat.ts index ee9e76a8..1d8a3927 100644 --- a/packages/cli/src/chat.ts +++ b/packages/cli/src/chat.ts @@ -13,7 +13,7 @@ interface Arguments { async function main (): Promise { const argv: Arguments = _getArgv(); if (!argv.signalServer) { - console.log('Using default signalling server URL'); + console.log('Using the default signalling server URL'); } const peer = new Peer(true); diff --git a/packages/peer-test-app/.env b/packages/peer-test-app/.env index 1b59ca6a..3c8478ec 100644 --- a/packages/peer-test-app/.env +++ b/packages/peer-test-app/.env @@ -1 +1,2 @@ REACT_APP_SIGNAL_SERVER=/ip4/127.0.0.1/tcp/13579/ws/p2p-webrtc-star/ +REACT_APP_RELAY_NODE= diff --git a/packages/peer-test-app/README.md b/packages/peer-test-app/README.md index de70032f..9755498f 100644 --- a/packages/peer-test-app/README.md +++ b/packages/peer-test-app/README.md @@ -4,13 +4,13 @@ This project was bootstrapped with [Create React App](https://github.com/faceboo ## Instructions -* Install dependencies - +* Install dependencies: + ```bash yarn install ``` -* Build the peer package +* Build the peer package: ```bash # From repo root @@ -19,14 +19,30 @@ This project was bootstrapped with [Create React App](https://github.com/faceboo yarn build ``` -* Run the signalling server +* (Optional) Run a local signalling server: ```bash # In packages/peer yarn signal-server ``` -* Start the react app in development mode +* (Optional) Run a local relay node: + + ```bash + # In packages/peer + yarn relay-node --signal-server [SIGNAL_SERVER_URL] + ``` + + * `signal-server`: multiaddr of a signalling server (default: local signalling server multiaddr) + +* Set the signalling server and relay node multiaddrs in the [env](./.env) file: + + ``` + REACT_APP_SIGNAL_SERVER=/ip4/127.0.0.1/tcp/13579/ws/p2p-webrtc-star/ + REACT_APP_RELAY_NODE=/ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star/p2p/12D3KooWRzH3ZRFP6RDbs2EKA8jSrD4Y6VYtLnCRMj3mYCiMHCJP + ``` + +* Start the react app in development mode: ```bash # In packages/peer-test-app diff --git a/packages/peer-test-app/src/App.tsx b/packages/peer-test-app/src/App.tsx index 0f42aed3..6a3c5732 100644 --- a/packages/peer-test-app/src/App.tsx +++ b/packages/peer-test-app/src/App.tsx @@ -10,17 +10,17 @@ declare global { function App() { const [peer, setPeer] = useState() - + useEffect(() => { (async () => { if (peer) { - await peer.init(process.env.REACT_APP_SIGNAL_SERVER) + await peer.init(process.env.REACT_APP_SIGNAL_SERVER, process.env.REACT_APP_RELAY_NODE) console.log(`Peer ID is ${peer.peerId!.toString()}`); peer.subscribeMessage((peerId, message) => { console.log(`${peerId.toString()} > ${message}`) }) - + window.broadcast = (message: string) => { peer.broadcastMessage(message) } diff --git a/packages/peer/.eslintrc.json b/packages/peer/.eslintrc.json index 86f7a209..aa470196 100644 --- a/packages/peer/.eslintrc.json +++ b/packages/peer/.eslintrc.json @@ -16,5 +16,6 @@ "@typescript-eslint" ], "rules": { + "@typescript-eslint/no-explicit-any": "off" } } diff --git a/packages/peer/src/index.ts b/packages/peer/src/index.ts index 4ab89007..b08cd68a 100644 --- a/packages/peer/src/index.ts +++ b/packages/peer/src/index.ts @@ -19,7 +19,7 @@ import { mplex } from '@libp2p/mplex'; import type { Stream as P2PStream, Connection } from '@libp2p/interface-connection'; import type { PeerInfo } from '@libp2p/interface-peer-info'; import { PeerId } from '@libp2p/interface-peer-id'; -import { multiaddr } from '@multiformats/multiaddr'; +import { multiaddr, Multiaddr } from '@multiformats/multiaddr'; export const PROTOCOL = '/chat/1.0.0'; export const DEFAULT_SIGNAL_SERVER_URL = '/ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star'; @@ -107,11 +107,13 @@ export class Peer { // Wait for connection and relay to be bind this._node.peerStore.addEventListener('change:multiaddrs', (evt) => { assert(this._node); - const { peerId } = evt.detail; + const { peerId, multiaddrs } = evt.detail; - // Updated self multiaddrs? + // Log updated self multiaddrs if (peerId.equals(this._node.peerId)) { console.log('Updated self multiaddrs', this._node.getMultiaddrs().map(addr => addr.toString())); + } else { + console.log('Updated other node\'s multiaddrs', multiaddrs.map((addr: Multiaddr) => addr.toString())); } }); } diff --git a/packages/peer/src/relay.ts b/packages/peer/src/relay.ts index 45234b7e..86e46a4f 100644 --- a/packages/peer/src/relay.ts +++ b/packages/peer/src/relay.ts @@ -1,5 +1,7 @@ import { createLibp2p } from 'libp2p'; import wrtc from 'wrtc'; +import { hideBin } from 'yargs/helpers'; +import yargs from 'yargs'; import { noise } from '@chainsafe/libp2p-noise'; import { mplex } from '@libp2p/mplex'; @@ -7,12 +9,21 @@ import { webRTCStar, WebRTCStarTuple } from '@libp2p/webrtc-star'; import { DEFAULT_SIGNAL_SERVER_URL } from './index.js'; +interface Arguments { + signalServer: string; +} + async function main (): Promise { + const argv: Arguments = _getArgv(); + if (!argv.signalServer) { + console.log('Using the default signalling server URL'); + } + const wrtcStar: WebRTCStarTuple = webRTCStar({ wrtc }); const node = await createLibp2p({ addresses: { listen: [ - DEFAULT_SIGNAL_SERVER_URL + argv.signalServer || DEFAULT_SIGNAL_SERVER_URL ] }, transports: [ @@ -36,6 +47,21 @@ async function main (): Promise { node.getMultiaddrs().forEach((ma) => console.log(ma.toString())); } +function _getArgv (): any { + return yargs(hideBin(process.argv)).parserConfiguration({ + 'parse-numbers': false + }).options({ + signalServer: { + type: 'string', + describe: 'Signalling server URL' + }, + relayNode: { + type: 'string', + describe: 'Relay node URL' + } + }).argv; +} + main().catch(err => { console.log(err); });