149 lines
3.9 KiB
TypeScript
Raw Normal View History

2022-02-04 14:12:00 +11:00
import { multiaddr } from "multiaddr";
import PeerId from "peer-id";
import { Waku } from "js-waku";
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",
];
}
function nick(
nick: string | undefined,
setNick: (nick: string) => void
): string[] {
if (!nick) {
2022-02-04 14:12:00 +11:00
return ["No nick provided"];
}
setNick(nick);
return [`New nick: ${nick}`];
}
function info(waku: Waku | undefined): string[] {
if (!waku) {
2022-02-04 14:12:00 +11:00
return ["Waku node is starting"];
}
return [`PeerId: ${waku.libp2p.peerId.toB58String()}`];
}
function connect(peer: string | undefined, waku: Waku | undefined): string[] {
if (!waku) {
2022-02-04 14:12:00 +11:00
return ["Waku node is starting"];
}
if (!peer) {
2022-02-04 14:12:00 +11:00
return ["No peer provided"];
}
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-05-04 10:23:31 +10:00
waku.addPeerToAddressBook(PeerId.createFromB58String(peerId), [
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];
}
}
async function peers(waku: Waku | undefined): Promise<string[]> {
if (!waku) {
2022-02-04 14:12:00 +11:00
return ["Waku node is starting"];
}
let response: string[] = [];
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: [";
peer.addresses.forEach(({ multiaddr }) => {
2022-02-04 14:12:00 +11:00
addresses += " " + multiaddr.toString() + ",";
});
2022-02-04 14:12:00 +11:00
addresses = addresses.replace(/,$/, "");
addresses += "]";
response.push(addresses);
2022-02-04 14:12:00 +11:00
let protocols = " protocols: [";
protocols += peer.protocols;
2022-02-04 14:12:00 +11:00
protocols += "]";
response.push(protocols);
});
if (response.length === 0) {
2022-02-04 14:12:00 +11:00
response.push("Not connected to any peer.");
}
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;
}
export default async function handleCommand(
input: string,
waku: Waku | undefined,
setNick: (nick: string) => void
): Promise<{ command: string; response: string[] }> {
let response: string[] = [];
2021-04-27 16:26:32 +10:00
const args = parseInput(input);
const command = args.shift()!;
switch (command) {
2022-02-04 14:12:00 +11:00
case "/help":
help().map((str) => response.push(str));
break;
2022-02-04 14:12:00 +11:00
case "/nick":
nick(args.shift(), setNick).map((str) => response.push(str));
break;
2022-02-04 14:12:00 +11:00
case "/info":
info(waku).map((str) => response.push(str));
break;
2022-02-04 14:12:00 +11:00
case "/connect":
connect(args.shift(), waku).map((str) => response.push(str));
break;
2022-02-04 14:12:00 +11:00
case "/peers":
(await peers(waku)).map((str) => response.push(str));
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;
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
}