From dec8e10857a7d66944a15a5c404834553a940338 Mon Sep 17 00:00:00 2001 From: droak Date: Mon, 15 Jul 2024 11:20:30 +0900 Subject: [PATCH 1/4] basic commander stuff --- packages/node/configs/node.json | 0 packages/node/configs/relay.json | 0 packages/node/package.json | 6 ++++-- packages/node/src/cli/index.ts | 11 +++++++++++ packages/node/src/run.ts | 9 +++++++++ packages/node/src/run_node.ts | 3 ++- packages/node/src/version.ts | 1 + yarn.lock | 5 +++++ 8 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 packages/node/configs/node.json create mode 100644 packages/node/configs/relay.json create mode 100644 packages/node/src/cli/index.ts create mode 100644 packages/node/src/run.ts create mode 100644 packages/node/src/version.ts diff --git a/packages/node/configs/node.json b/packages/node/configs/node.json new file mode 100644 index 00000000..e69de29b diff --git a/packages/node/configs/relay.json b/packages/node/configs/relay.json new file mode 100644 index 00000000..e69de29b diff --git a/packages/node/package.json b/packages/node/package.json index 2ffde1af..2a0fe643 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -23,10 +23,11 @@ "scripts": { "build": "tsc -b", "clean": "rm -rf dist/ node_modules/", + "cli": "tsx ./src/index.ts", "node": "tsx ./src/run_node.ts", + "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "prepack": "tsc -b", "relay": "tsx ./src/run_relay.ts", - "start": "tsx ./src/index.ts", "test": "vitest" }, "devDependencies": { @@ -38,6 +39,7 @@ "dependencies": { "@topology-foundation/crdt": "0.0.20", "@topology-foundation/network": "0.0.20", - "@topology-foundation/object": "0.0.20" + "@topology-foundation/object": "0.0.20", + "commander": "^12.1.0" } } diff --git a/packages/node/src/cli/index.ts b/packages/node/src/cli/index.ts new file mode 100644 index 00000000..d8fe40df --- /dev/null +++ b/packages/node/src/cli/index.ts @@ -0,0 +1,11 @@ +import { Command } from "commander"; +import { VERSION } from "../version"; + +export const program = new Command(); + +program.version(VERSION); +program.command("start").action(async () => { + // const { start } = await import("./run_node"); + // await start(); + console.log("start"); +}); diff --git a/packages/node/src/run.ts b/packages/node/src/run.ts new file mode 100644 index 00000000..f12b7eae --- /dev/null +++ b/packages/node/src/run.ts @@ -0,0 +1,9 @@ +import { program } from "./cli"; +import { TopologyNode } from "."; + +export async function start() { + const node = new TopologyNode(); + node.start(); +} + +program.parse(process.argv); diff --git a/packages/node/src/run_node.ts b/packages/node/src/run_node.ts index 5c7550d3..f12b7eae 100644 --- a/packages/node/src/run_node.ts +++ b/packages/node/src/run_node.ts @@ -1,3 +1,4 @@ +import { program } from "./cli"; import { TopologyNode } from "."; export async function start() { @@ -5,4 +6,4 @@ export async function start() { node.start(); } -start(); +program.parse(process.argv); diff --git a/packages/node/src/version.ts b/packages/node/src/version.ts new file mode 100644 index 00000000..e40071be --- /dev/null +++ b/packages/node/src/version.ts @@ -0,0 +1 @@ +export const VERSION = "0.0.20"; diff --git a/yarn.lock b/yarn.lock index 95e3eba4..de71136b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2108,6 +2108,11 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" From 4f0e7c94f1038703ee2016122a641df60f66494f Mon Sep 17 00:00:00 2001 From: droak Date: Mon, 15 Jul 2024 11:44:01 +0900 Subject: [PATCH 2/4] preliminary run script --- packages/node/package.json | 4 +--- packages/node/src/cli/index.ts | 17 +++++++++-------- packages/node/src/run.ts | 18 +++++++++++++++++- packages/node/src/run_node.ts | 9 --------- packages/node/src/run_relay.ts | 16 ---------------- 5 files changed, 27 insertions(+), 37 deletions(-) delete mode 100644 packages/node/src/run_node.ts delete mode 100644 packages/node/src/run_relay.ts diff --git a/packages/node/package.json b/packages/node/package.json index 2a0fe643..562a9ae9 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -23,11 +23,9 @@ "scripts": { "build": "tsc -b", "clean": "rm -rf dist/ node_modules/", - "cli": "tsx ./src/index.ts", - "node": "tsx ./src/run_node.ts", + "cli": "tsx ./src/run.ts", "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "prepack": "tsc -b", - "relay": "tsx ./src/run_relay.ts", "test": "vitest" }, "devDependencies": { diff --git a/packages/node/src/cli/index.ts b/packages/node/src/cli/index.ts index d8fe40df..d1f45a54 100644 --- a/packages/node/src/cli/index.ts +++ b/packages/node/src/cli/index.ts @@ -1,11 +1,12 @@ -import { Command } from "commander"; -import { VERSION } from "../version"; +import { Command, Option } from "commander"; +import { VERSION } from "../version.js"; export const program = new Command(); - program.version(VERSION); -program.command("start").action(async () => { - // const { start } = await import("./run_node"); - // await start(); - console.log("start"); -}); + +program.addOption(new Option("-c, --config ", "config file")); +program.addOption( + new Option("-m, --mode ", "mode to run in") + .default("node") + .choices(["node", "relay"]), +); diff --git a/packages/node/src/run.ts b/packages/node/src/run.ts index f12b7eae..b65e875d 100644 --- a/packages/node/src/run.ts +++ b/packages/node/src/run.ts @@ -1,9 +1,25 @@ import { program } from "./cli"; import { TopologyNode } from "."; +import { createRelayNode } from "@topology-foundation/network"; -export async function start() { +async function startNode() { const node = new TopologyNode(); node.start(); } +async function startRelay() { + const node = await createRelayNode(); + console.log("peer_id:", node.peerId.toString()); + for (let ma of node.getMultiaddrs()) { + console.log(ma); + } +} + program.parse(process.argv); +const opts = program.opts(); + +if (opts.mode === "node") { + startNode(); +} else if (opts.mode === "relay") { + startRelay(); +} diff --git a/packages/node/src/run_node.ts b/packages/node/src/run_node.ts deleted file mode 100644 index f12b7eae..00000000 --- a/packages/node/src/run_node.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { program } from "./cli"; -import { TopologyNode } from "."; - -export async function start() { - const node = new TopologyNode(); - node.start(); -} - -program.parse(process.argv); diff --git a/packages/node/src/run_relay.ts b/packages/node/src/run_relay.ts deleted file mode 100644 index 1c0c2ebc..00000000 --- a/packages/node/src/run_relay.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { createRelayNode } from "@topology-foundation/network"; - -export async function start() { - try { - const node = await createRelayNode(); - console.log("peer_id:", node.peerId.toString()); - for (let ma of node.getMultiaddrs()) { - console.log(ma); - } - } catch (e) { - console.error(e); - start(); - } -} - -start(); From ea1e6ec279a1e093c00e4ab4f74e80ff438d69f8 Mon Sep 17 00:00:00 2001 From: droak Date: Thu, 18 Jul 2024 11:25:00 +0900 Subject: [PATCH 3/4] adjust docker to run the cli by default --- docker-compose.yml | 2 +- packages/node/Dockerfile | 1 + packages/node/entrypoint.sh | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4fd21b73..c12e0e13 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: dockerfile: Dockerfile ports: - 50000:50000 - command: relay + command: -m relay volumes: ssl_data: diff --git a/packages/node/Dockerfile b/packages/node/Dockerfile index 1f4bd908..b7004972 100644 --- a/packages/node/Dockerfile +++ b/packages/node/Dockerfile @@ -3,6 +3,7 @@ FROM node:22.3-bookworm-slim WORKDIR /node COPY . . +RUN yarn RUN chmod +x /node/entrypoint.sh ENTRYPOINT ["/bin/bash", "/node/entrypoint.sh"] diff --git a/packages/node/entrypoint.sh b/packages/node/entrypoint.sh index 15ea7051..30805840 100644 --- a/packages/node/entrypoint.sh +++ b/packages/node/entrypoint.sh @@ -1,3 +1,2 @@ #!/bin/bash -yarn -exec yarn run "$@" +exec yarn cli "$@" From 09624cf6c7ee290e6d4d8ff5e5d4be3cc9996145 Mon Sep 17 00:00:00 2001 From: droak Date: Thu, 18 Jul 2024 12:27:35 +0900 Subject: [PATCH 4/4] add config files and parser; add network config --- packages/network/src/node.ts | 16 +++++++++++----- packages/network/src/relay.ts | 7 +++++-- packages/node/configs/node.json | 8 ++++++++ packages/node/configs/relay.json | 8 ++++++++ packages/node/src/index.ts | 5 +++-- packages/node/src/run.ts | 20 +++++++++++++------- packages/node/src/version.ts | 2 +- 7 files changed, 49 insertions(+), 17 deletions(-) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 13fc17f4..788eca14 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -18,7 +18,11 @@ import { stringToStream } from "./stream.js"; import { bootstrap } from "@libp2p/bootstrap"; import { webTransport } from "@libp2p/webtransport"; -export interface TopologyNetworkNodeConfig {} +// snake_casing to match the JSON config +export interface TopologyNetworkNodeConfig { + addresses: string[]; + bootstrap_peers: string[]; +} export class TopologyNetworkNode { private _config?: TopologyNetworkNodeConfig; @@ -34,7 +38,7 @@ export class TopologyNetworkNode { async start() { this._node = await createLibp2p({ addresses: { - listen: ["/webrtc"], + listen: this._config ? this._config.addresses : ["/webrtc"], }, connectionEncryption: [noise()], connectionGater: { @@ -48,9 +52,11 @@ export class TopologyNetworkNode { topics: ["topology::discovery"], }), bootstrap({ - list: [ - "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP", - ], + list: this._config + ? this._config.bootstrap_peers + : [ + "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP", + ], }), ], services: { diff --git a/packages/network/src/relay.ts b/packages/network/src/relay.ts index 60be820f..431636cc 100644 --- a/packages/network/src/relay.ts +++ b/packages/network/src/relay.ts @@ -10,17 +10,20 @@ import { createLibp2p } from "libp2p"; import relayerJson from "./peer-id-relayer.js"; import { autoNAT } from "@libp2p/autonat"; +import { TopologyNetworkNodeConfig } from "./node.js"; // TODO: // - remove the peer-id-relayer in favor of static configs // - create a "relay" mode that can be activated in the main node.ts logic // - improve the circuit-relay setup -export const createRelayNode = async () => { +export const createRelayNode = async (config?: TopologyNetworkNodeConfig) => { const idRelayer = await createFromJSON(relayerJson); const node = await createLibp2p({ peerId: idRelayer, addresses: { - listen: ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], + listen: config + ? config.addresses + : ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], }, connectionEncryption: [noise()], peerDiscovery: [ diff --git a/packages/node/configs/node.json b/packages/node/configs/node.json index e69de29b..0408bf4e 100644 --- a/packages/node/configs/node.json +++ b/packages/node/configs/node.json @@ -0,0 +1,8 @@ +{ + "network_config": { + "addresses": ["/webrtc"], + "bootstrap_peers": [ + "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP" + ] + } +} diff --git a/packages/node/configs/relay.json b/packages/node/configs/relay.json index e69de29b..bb57fd23 100644 --- a/packages/node/configs/relay.json +++ b/packages/node/configs/relay.json @@ -0,0 +1,8 @@ +{ + "network_config": { + "addresses": ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], + "bootstrap_peers": [ + "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP" + ] + } +} diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 3f664d0f..16151b85 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -10,8 +10,9 @@ import { TopologyObjectStore } from "./store.js"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; import { toString as uint8ArrayToString } from "uint8arrays/to-string"; +// snake_casing to match the JSON config export interface TopologyNodeConfig { - networkConfig?: TopologyNetworkNodeConfig; + network_config?: TopologyNetworkNodeConfig; } export class TopologyNode { @@ -21,7 +22,7 @@ export class TopologyNode { constructor(config?: TopologyNodeConfig) { this._config = config; - this._networkNode = new TopologyNetworkNode(config?.networkConfig); + this._networkNode = new TopologyNetworkNode(config?.network_config); this._objectStore = new TopologyObjectStore(); } diff --git a/packages/node/src/run.ts b/packages/node/src/run.ts index b65e875d..6fc4b78f 100644 --- a/packages/node/src/run.ts +++ b/packages/node/src/run.ts @@ -1,14 +1,15 @@ import { program } from "./cli"; -import { TopologyNode } from "."; +import { TopologyNode, TopologyNodeConfig } from "."; import { createRelayNode } from "@topology-foundation/network"; +import fs from "fs"; -async function startNode() { - const node = new TopologyNode(); +async function startNode(config?: TopologyNodeConfig) { + const node = new TopologyNode(config); node.start(); } -async function startRelay() { - const node = await createRelayNode(); +async function startRelay(config?: TopologyNodeConfig) { + const node = await createRelayNode(config?.network_config); console.log("peer_id:", node.peerId.toString()); for (let ma of node.getMultiaddrs()) { console.log(ma); @@ -18,8 +19,13 @@ async function startRelay() { program.parse(process.argv); const opts = program.opts(); +let config: TopologyNodeConfig | undefined; +if (opts.config) { + config = JSON.parse(fs.readFileSync(opts.config, "utf8")); +} + if (opts.mode === "node") { - startNode(); + startNode(config); } else if (opts.mode === "relay") { - startRelay(); + startRelay(config); } diff --git a/packages/node/src/version.ts b/packages/node/src/version.ts index e40071be..a0994a6a 100644 --- a/packages/node/src/version.ts +++ b/packages/node/src/version.ts @@ -1 +1 @@ -export const VERSION = "0.0.20"; +export const VERSION = "0.0.22-2";