mirror of https://github.com/waku-org/js-waku.git
Merge pull request #156 from status-im/55-auto-select
This commit is contained in:
commit
cab9be4782
|
@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- `getStatusFleetNodes` to connect to Status' nim-waku nodes.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Clarify content topic format in README.md.
|
- Clarify content topic format in README.md.
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ npm install # Install dependencies for js-waku
|
||||||
npm run build # Build js-waku
|
npm run build # Build js-waku
|
||||||
cd examples/cli-chat
|
cd examples/cli-chat
|
||||||
npm install # Install dependencies for the cli app
|
npm install # Install dependencies for the cli app
|
||||||
npm run start -- --staticNode /ip4/134.209.139.210/tcp/30303/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ
|
npm run start -- --autoDial
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also specify an optional `listenAddr` parameter (.e.g `--listenAddr /ip4/0.0.0.0/tcp/7777/ws`).
|
You can also specify an optional `listenAddr` parameter (.e.g `--listenAddr /ip4/0.0.0.0/tcp/7777/ws`).
|
||||||
|
|
|
@ -1,14 +1,24 @@
|
||||||
import readline from 'readline';
|
import readline from 'readline';
|
||||||
import util from 'util';
|
import util from 'util';
|
||||||
|
|
||||||
import { ChatMessage, StoreCodec, Waku, WakuMessage } from 'js-waku';
|
import {
|
||||||
|
ChatMessage,
|
||||||
|
getStatusFleetNodes,
|
||||||
|
StoreCodec,
|
||||||
|
Waku,
|
||||||
|
WakuMessage,
|
||||||
|
} from 'js-waku';
|
||||||
import TCP from 'libp2p-tcp';
|
import TCP from 'libp2p-tcp';
|
||||||
import { multiaddr, Multiaddr } from 'multiaddr';
|
import { multiaddr, Multiaddr } from 'multiaddr';
|
||||||
|
|
||||||
const ChatContentTopic = 'dingpu';
|
const ChatContentTopic = 'dingpu';
|
||||||
|
|
||||||
export default async function startChat(): Promise<void> {
|
export default async function startChat(): Promise<void> {
|
||||||
const opts = processArguments();
|
let opts = processArguments();
|
||||||
|
|
||||||
|
if (opts.autoDial) {
|
||||||
|
opts = await addFleetNodes(opts);
|
||||||
|
}
|
||||||
|
|
||||||
const waku = await Waku.create({
|
const waku = await Waku.create({
|
||||||
listenAddresses: [opts.listenAddr],
|
listenAddresses: [opts.listenAddr],
|
||||||
|
@ -49,10 +59,12 @@ export default async function startChat(): Promise<void> {
|
||||||
[ChatContentTopic]
|
[ChatContentTopic]
|
||||||
);
|
);
|
||||||
|
|
||||||
if (opts.staticNode) {
|
await Promise.all(
|
||||||
console.log(`Dialing ${opts.staticNode}`);
|
opts.staticNodes.map((addr) => {
|
||||||
await waku.dial(opts.staticNode);
|
console.log(`Dialing ${addr}`);
|
||||||
}
|
return waku.dial(addr);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
// If we connect to a peer with WakuStore, we run the protocol
|
// If we connect to a peer with WakuStore, we run the protocol
|
||||||
// TODO: Instead of doing it `once` it should always be done but
|
// TODO: Instead of doing it `once` it should always be done but
|
||||||
|
@ -89,26 +101,32 @@ export default async function startChat(): Promise<void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
staticNode?: Multiaddr;
|
staticNodes: Multiaddr[];
|
||||||
listenAddr: string;
|
listenAddr: string;
|
||||||
|
autoDial: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
function processArguments(): Options {
|
function processArguments(): Options {
|
||||||
const passedArgs = process.argv.slice(2);
|
const passedArgs = process.argv.slice(2);
|
||||||
|
|
||||||
let opts: Options = { listenAddr: '/ip4/0.0.0.0/tcp/0' };
|
let opts: Options = {
|
||||||
|
listenAddr: '/ip4/0.0.0.0/tcp/0',
|
||||||
|
staticNodes: [],
|
||||||
|
autoDial: false,
|
||||||
|
};
|
||||||
|
|
||||||
while (passedArgs.length) {
|
while (passedArgs.length) {
|
||||||
const arg = passedArgs.shift();
|
const arg = passedArgs.shift();
|
||||||
switch (arg) {
|
switch (arg) {
|
||||||
case '--staticNode':
|
case '--staticNode':
|
||||||
opts = Object.assign(opts, {
|
opts.staticNodes.push(multiaddr(passedArgs.shift()!));
|
||||||
staticNode: multiaddr(passedArgs.shift()!),
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case '--listenAddr':
|
case '--listenAddr':
|
||||||
opts = Object.assign(opts, { listenAddr: passedArgs.shift() });
|
opts = Object.assign(opts, { listenAddr: passedArgs.shift() });
|
||||||
break;
|
break;
|
||||||
|
case '--autoDial':
|
||||||
|
opts.autoDial = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.log(`Unsupported argument: ${arg}`);
|
console.log(`Unsupported argument: ${arg}`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
@ -128,3 +146,12 @@ export function formatMessage(chatMsg: ChatMessage): string {
|
||||||
});
|
});
|
||||||
return `<${timestamp}> ${chatMsg.nick}: ${chatMsg.payloadAsUtf8}`;
|
return `<${timestamp}> ${chatMsg.nick}: ${chatMsg.payloadAsUtf8}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function addFleetNodes(opts: Options): Promise<Options> {
|
||||||
|
await getStatusFleetNodes().then((nodes) =>
|
||||||
|
nodes.map((addr) => {
|
||||||
|
opts.staticNodes.push(multiaddr(addr));
|
||||||
|
})
|
||||||
|
);
|
||||||
|
return opts;
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
import PeerId from 'peer-id';
|
import PeerId from 'peer-id';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import './App.css';
|
import './App.css';
|
||||||
import { ChatMessage, WakuMessage, StoreCodec, Waku } from 'js-waku';
|
import {
|
||||||
|
ChatMessage,
|
||||||
|
WakuMessage,
|
||||||
|
StoreCodec,
|
||||||
|
Waku,
|
||||||
|
getStatusFleetNodes,
|
||||||
|
} from 'js-waku';
|
||||||
import handleCommand from './command';
|
import handleCommand from './command';
|
||||||
import Room from './Room';
|
import Room from './Room';
|
||||||
import { WakuContext } from './WakuContext';
|
import { WakuContext } from './WakuContext';
|
||||||
|
@ -146,13 +152,11 @@ async function initWaku(setter: (waku: Waku) => void) {
|
||||||
|
|
||||||
setter(waku);
|
setter(waku);
|
||||||
|
|
||||||
waku.addPeerToAddressBook(
|
const nodes = await getStatusFleetNodes();
|
||||||
'16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ',
|
await Promise.all(
|
||||||
['/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/443/wss']
|
nodes.map((addr) => {
|
||||||
);
|
return waku.dial(addr);
|
||||||
waku.addPeerToAddressBook(
|
})
|
||||||
'16Uiu2HAmSyrYVycqBCWcHyNVQS6zYQcdQbwyov1CDijboVRsQS37',
|
|
||||||
['/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/443/wss']
|
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log('Issue starting waku ', e);
|
console.log('Issue starting waku ', e);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
"license": "MIT OR Apache-2.0",
|
"license": "MIT OR Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@bitauth/libauth": "^1.17.1",
|
"@bitauth/libauth": "^1.17.1",
|
||||||
|
"axios": "^0.21.1",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"it-concat": "^2.0.0",
|
"it-concat": "^2.0.0",
|
||||||
"it-length-prefixed": "^5.0.2",
|
"it-length-prefixed": "^5.0.2",
|
||||||
|
@ -38,7 +39,6 @@
|
||||||
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
||||||
"@typescript-eslint/parser": "^4.0.1",
|
"@typescript-eslint/parser": "^4.0.1",
|
||||||
"app-root-path": "^3.0.0",
|
"app-root-path": "^3.0.0",
|
||||||
"axios": "^0.21.1",
|
|
||||||
"chai": "^4.3.4",
|
"chai": "^4.3.4",
|
||||||
"codecov": "^3.5.0",
|
"codecov": "^3.5.0",
|
||||||
"cspell": "^4.1.0",
|
"cspell": "^4.1.0",
|
||||||
|
@ -1570,7 +1570,6 @@
|
||||||
"version": "0.21.1",
|
"version": "0.21.1",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.10.0"
|
"follow-redirects": "^1.10.0"
|
||||||
}
|
}
|
||||||
|
@ -5200,7 +5199,6 @@
|
||||||
"version": "1.13.3",
|
"version": "1.13.3",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
|
||||||
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
|
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4.0"
|
"node": ">=4.0"
|
||||||
}
|
}
|
||||||
|
@ -14995,7 +14993,6 @@
|
||||||
"version": "0.21.1",
|
"version": "0.21.1",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.10.0"
|
"follow-redirects": "^1.10.0"
|
||||||
}
|
}
|
||||||
|
@ -17954,8 +17951,7 @@
|
||||||
"follow-redirects": {
|
"follow-redirects": {
|
||||||
"version": "1.13.3",
|
"version": "1.13.3",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
|
||||||
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
|
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"for-in": {
|
"for-in": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@bitauth/libauth": "^1.17.1",
|
"@bitauth/libauth": "^1.17.1",
|
||||||
|
"axios": "^0.21.1",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"it-concat": "^2.0.0",
|
"it-concat": "^2.0.0",
|
||||||
"it-length-prefixed": "^5.0.2",
|
"it-length-prefixed": "^5.0.2",
|
||||||
|
@ -84,7 +85,6 @@
|
||||||
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
||||||
"@typescript-eslint/parser": "^4.0.1",
|
"@typescript-eslint/parser": "^4.0.1",
|
||||||
"app-root-path": "^3.0.0",
|
"app-root-path": "^3.0.0",
|
||||||
"axios": "^0.21.1",
|
|
||||||
"chai": "^4.3.4",
|
"chai": "^4.3.4",
|
||||||
"codecov": "^3.5.0",
|
"codecov": "^3.5.0",
|
||||||
"cspell": "^4.1.0",
|
"cspell": "^4.1.0",
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
export { getStatusFleetNodes } from './lib/discover';
|
||||||
|
|
||||||
export { Waku } from './lib/waku';
|
export { Waku } from './lib/waku';
|
||||||
export { WakuMessage } from './lib/waku_message';
|
export { WakuMessage } from './lib/waku_message';
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/**
|
||||||
|
* Returns multiaddrs (inc. ip) of nim-waku nodes ran by Status.
|
||||||
|
* Used as a temporary discovery helper until more parties run their own nodes.
|
||||||
|
*/
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
export enum Protocol {
|
||||||
|
websocket = 'websocket',
|
||||||
|
tcp = 'tcp',
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum Environment {
|
||||||
|
Test = 'test',
|
||||||
|
Prod = 'prod',
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getStatusFleetNodes(
|
||||||
|
env: Environment = Environment.Test,
|
||||||
|
protocol: Protocol = Protocol.websocket
|
||||||
|
): Promise<string[]> {
|
||||||
|
const res = await axios.get('https://fleets.status.im/', {
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const wakuFleet = res.data.fleets[`wakuv2.${env}`];
|
||||||
|
|
||||||
|
switch (protocol) {
|
||||||
|
case Protocol.tcp:
|
||||||
|
return Object.values(wakuFleet['waku']);
|
||||||
|
default:
|
||||||
|
return Object.values(wakuFleet['waku-websocket']);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue