diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 8c048f480..fb6d9b92a 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -195,8 +195,11 @@ export class DRPNetworkNode { webTransport(), ], }); + log.info( + "::start: running on:", + this._node.getMultiaddrs().map((addr) => addr.toString()) + ); - log.info("running on:", this._node.getMultiaddrs()); if (!this._config?.bootstrap) { for (const addr of this._config?.bootstrap_peers || []) { try { @@ -238,6 +241,25 @@ export class DRPNetworkNode { await this.start(); } + async isDialable(callback?: () => void | Promise) { + let dialable = await this._node?.isDialable(this._node.getMultiaddrs()); + if (dialable && callback) { + await callback(); + return true; + } + if (!callback) return false; + + const checkDialable = async () => { + dialable = await this._node?.isDialable(this._node.getMultiaddrs()); + if (dialable) { + await callback(); + } + }; + + this._node?.addEventListener("transport:listening", checkDialable); + return false; + } + private _sortAddresses(a: Address, b: Address) { const localRegex = /(^\/ip4\/127\.)|(^\/ip4\/10\.)|(^\/ip4\/172\.1[6-9]\.)|(^\/ip4\/172\.2[0-9]\.)|(^\/ip4\/172\.3[0-1]\.)|(^\/ip4\/192\.168\.)/; diff --git a/packages/network/tests/index.test.ts b/packages/network/tests/index.test.ts index 59f99d4c7..eb185c207 100644 --- a/packages/network/tests/index.test.ts +++ b/packages/network/tests/index.test.ts @@ -1,3 +1,55 @@ -import { test } from "vitest"; +import { beforeAll, describe, expect, test } from "vitest"; -test("mock", () => {}); +import { DRPNetworkNode } from "../src/node.js"; + +describe("isDialable", () => { + let btNode: DRPNetworkNode; + beforeAll(async () => { + btNode = new DRPNetworkNode({ + bootstrap: true, + listen_addresses: ["/ip4/0.0.0.0/tcp/0/ws"], + bootstrap_peers: [], + private_key_seed: "bootstrap_is_dialable", + }); + await btNode.start(); + }); + + const isDialable = async (node: DRPNetworkNode, timeout = false) => { + let resolver: (value: boolean) => void; + const promise = new Promise((resolve) => { + resolver = resolve; + }); + + if (timeout) { + setTimeout(() => { + resolver(false); + }, 10); + } + + const callback = () => { + resolver(true); + }; + + await node.isDialable(callback); + return await promise; + }; + + test("should return true if the node is dialable", async () => { + const node = new DRPNetworkNode({ + bootstrap_peers: btNode.getMultiaddrs()?.map((addr) => addr.toString()) || [], + private_key_seed: "is_dialable_node_1", + }); + await node.start(); + expect(await isDialable(node)).toBe(true); + }); + + test("should return false if the node is not dialable", async () => { + const node = new DRPNetworkNode({ + bootstrap_peers: btNode.getMultiaddrs()?.map((addr) => addr.toString()) || [], + private_key_seed: "is_dialable_node_2", + listen_addresses: [], + }); + await node.start(); + expect(await isDialable(node, true)).toBe(false); + }); +}); diff --git a/packages/node/src/version.ts b/packages/node/src/version.ts index 72a311182..909cf14de 100644 --- a/packages/node/src/version.ts +++ b/packages/node/src/version.ts @@ -1 +1 @@ -export const VERSION = "0.6.1"; +export const VERSION = "0.7.0";