2022-02-04 14:12:00 +11:00
|
|
|
import { multiaddr } from "multiaddr";
|
|
|
|
|
import PeerId from "peer-id";
|
|
|
|
|
import { Waku } from "js-waku";
|
2021-04-27 10:48:08 +10:00
|
|
|
|
|
|
|
|
function help(): string[] {
|
|
|
|
|
return [
|
2022-02-04 14:12:00 +11:00
|
|
|
"/nick <nickname>: set a new nickname",
|
|
|
|
|
"/info: some information about the node",
|
|
|
|
|
"/connect <Multiaddr>: connect to the given peer",
|
|
|
|
|
"/help: Display this help",
|
2021-04-27 10:48:08 +10:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function nick(
|
|
|
|
|
nick: string | undefined,
|
|
|
|
|
setNick: (nick: string) => void
|
|
|
|
|
): string[] {
|
|
|
|
|
if (!nick) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["No nick provided"];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
setNick(nick);
|
|
|
|
|
return [`New nick: ${nick}`];
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-28 11:42:42 +10:00
|
|
|
function info(waku: Waku | undefined): string[] {
|
2021-04-27 10:48:08 +10:00
|
|
|
if (!waku) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["Waku node is starting"];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
2021-07-28 11:42:42 +10:00
|
|
|
return [`PeerId: ${waku.libp2p.peerId.toB58String()}`];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function connect(peer: string | undefined, waku: Waku | undefined): string[] {
|
|
|
|
|
if (!waku) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["Waku node is starting"];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
if (!peer) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["No peer provided"];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
const peerMultiaddr = multiaddr(peer);
|
|
|
|
|
const peerId = peerMultiaddr.getPeerId();
|
|
|
|
|
if (!peerId) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["Peer Id needed to dial"];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
2021-05-04 10:23:31 +10:00
|
|
|
waku.addPeerToAddressBook(PeerId.createFromB58String(peerId), [
|
2021-04-27 10:48:08 +10:00
|
|
|
peerMultiaddr,
|
|
|
|
|
]);
|
|
|
|
|
return [
|
|
|
|
|
`${peerId}: ${peerMultiaddr.toString()} added to address book, autodial in progress`,
|
|
|
|
|
];
|
|
|
|
|
} catch (e) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["Invalid multiaddr: " + e];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-02 15:12:08 +11:00
|
|
|
async function peers(waku: Waku | undefined): Promise<string[]> {
|
2021-04-27 10:48:08 +10:00
|
|
|
if (!waku) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["Waku node is starting"];
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
let response: string[] = [];
|
2022-02-02 15:12:08 +11:00
|
|
|
const peers = [];
|
|
|
|
|
|
|
|
|
|
for await (const peer of waku.libp2p.peerStore.getPeers()) {
|
|
|
|
|
peers.push(peer);
|
|
|
|
|
}
|
|
|
|
|
Array.from(peers).forEach((peer) => {
|
2022-02-04 14:12:00 +11:00
|
|
|
response.push(peer.id.toB58String() + ":");
|
|
|
|
|
let addresses = " addresses: [";
|
2021-04-27 10:48:08 +10:00
|
|
|
peer.addresses.forEach(({ multiaddr }) => {
|
2022-02-04 14:12:00 +11:00
|
|
|
addresses += " " + multiaddr.toString() + ",";
|
2021-04-27 10:48:08 +10:00
|
|
|
});
|
2022-02-04 14:12:00 +11:00
|
|
|
addresses = addresses.replace(/,$/, "");
|
|
|
|
|
addresses += "]";
|
2021-04-27 10:48:08 +10:00
|
|
|
response.push(addresses);
|
2022-02-04 14:12:00 +11:00
|
|
|
let protocols = " protocols: [";
|
2021-04-27 10:48:08 +10:00
|
|
|
protocols += peer.protocols;
|
2022-02-04 14:12:00 +11:00
|
|
|
protocols += "]";
|
2021-04-27 10:48:08 +10:00
|
|
|
response.push(protocols);
|
|
|
|
|
});
|
|
|
|
|
if (response.length === 0) {
|
2022-02-04 14:12:00 +11:00
|
|
|
response.push("Not connected to any peer.");
|
2021-04-27 10:48:08 +10:00
|
|
|
}
|
|
|
|
|
return response;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-04 16:38:38 +10:00
|
|
|
function connections(waku: Waku | undefined): string[] {
|
|
|
|
|
if (!waku) {
|
2022-02-04 14:12:00 +11:00
|
|
|
return ["Waku node is starting"];
|
2021-05-04 16:38:38 +10:00
|
|
|
}
|
|
|
|
|
let response: string[] = [];
|
|
|
|
|
waku.libp2p.connections.forEach(
|
|
|
|
|
(
|
2022-02-04 14:12:00 +11:00
|
|
|
connections: import("libp2p-interfaces/src/connection/connection")[],
|
2021-05-04 16:38:38 +10:00
|
|
|
peerId
|
|
|
|
|
) => {
|
2022-02-04 14:12:00 +11:00
|
|
|
response.push(peerId + ":");
|
|
|
|
|
let strConnections = " connections: [";
|
2021-05-04 16:38:38 +10:00
|
|
|
connections.forEach((connection) => {
|
|
|
|
|
strConnections += JSON.stringify(connection.stat);
|
2022-02-04 14:12:00 +11:00
|
|
|
strConnections += "; " + JSON.stringify(connection.streams);
|
2021-05-04 16:38:38 +10:00
|
|
|
});
|
2022-02-04 14:12:00 +11:00
|
|
|
strConnections += "]";
|
2021-05-04 16:38:38 +10:00
|
|
|
response.push(strConnections);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
if (response.length === 0) {
|
2022-02-04 14:12:00 +11:00
|
|
|
response.push("Not connected to any peer.");
|
2021-05-04 16:38:38 +10:00
|
|
|
}
|
|
|
|
|
return response;
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-02 15:12:08 +11:00
|
|
|
export default async function handleCommand(
|
2021-04-27 10:48:08 +10:00
|
|
|
input: string,
|
|
|
|
|
waku: Waku | undefined,
|
2021-07-28 11:42:42 +10:00
|
|
|
setNick: (nick: string) => void
|
2022-02-02 15:12:08 +11:00
|
|
|
): Promise<{ command: string; response: string[] }> {
|
2021-04-27 10:48:08 +10:00
|
|
|
let response: string[] = [];
|
2021-04-27 16:26:32 +10:00
|
|
|
const args = parseInput(input);
|
2021-04-27 10:48:08 +10:00
|
|
|
const command = args.shift()!;
|
|
|
|
|
switch (command) {
|
2022-02-04 14:12:00 +11:00
|
|
|
case "/help":
|
2021-04-27 10:48:08 +10:00
|
|
|
help().map((str) => response.push(str));
|
|
|
|
|
break;
|
2022-02-04 14:12:00 +11:00
|
|
|
case "/nick":
|
2021-04-27 10:48:08 +10:00
|
|
|
nick(args.shift(), setNick).map((str) => response.push(str));
|
|
|
|
|
break;
|
2022-02-04 14:12:00 +11:00
|
|
|
case "/info":
|
2021-07-28 11:42:42 +10:00
|
|
|
info(waku).map((str) => response.push(str));
|
2021-04-27 10:48:08 +10:00
|
|
|
break;
|
2022-02-04 14:12:00 +11:00
|
|
|
case "/connect":
|
2021-04-27 10:48:08 +10:00
|
|
|
connect(args.shift(), waku).map((str) => response.push(str));
|
|
|
|
|
break;
|
2022-02-04 14:12:00 +11:00
|
|
|
case "/peers":
|
2022-02-02 15:12:08 +11:00
|
|
|
(await peers(waku)).map((str) => response.push(str));
|
2021-04-27 10:48:08 +10:00
|
|
|
break;
|
2022-02-04 14:12:00 +11:00
|
|
|
case "/connections":
|
2021-05-04 16:38:38 +10:00
|
|
|
connections(waku).map((str) => response.push(str));
|
|
|
|
|
break;
|
2021-04-27 10:48:08 +10:00
|
|
|
default:
|
|
|
|
|
response.push(`Unknown Command '${command}'`);
|
|
|
|
|
}
|
|
|
|
|
return { command, response };
|
|
|
|
|
}
|
2021-04-27 16:26:32 +10:00
|
|
|
|
|
|
|
|
export function parseInput(input: string): string[] {
|
2022-02-04 14:12:00 +11:00
|
|
|
const clean = input.trim().replaceAll(/\s\s+/g, " ");
|
|
|
|
|
return clean.split(" ");
|
2021-04-27 16:26:32 +10:00
|
|
|
}
|