Files
smartnetwork/readme.hints.md

4.4 KiB

Project Analysis

Architecture Overview

This is a comprehensive network diagnostics toolkit. The main entry point is the SmartNetwork class which orchestrates all functionality. System-dependent operations are delegated to a Rust binary via JSON-over-stdin/stdout IPC using @push.rocks/smartrust.

Key features:

  • Speed testing via Cloudflare (parallelizable with duration support) — pure TS
  • ICMP ping with statistics — Rust binary (surge-ping)
  • Port availability checks (local and remote) — Rust binary (tokio TCP / socket2)
  • Network gateway discovery — Rust binary (parses /proc/net/route on Linux)
  • Public IP retrieval — pure TS
  • DNS resolution via smartdns — pure TS
  • HTTP endpoint health checks — pure TS
  • Traceroute — Rust binary (raw ICMP sockets via socket2)

Rust Binary Architecture (v4.5.0+)

Binary: rustnetwork

  • Located in rust/crates/rustnetwork/
  • Cross-compiled for linux_amd64 and linux_arm64 via @git.zone/tsrust
  • Output: dist_rust/rustnetwork_linux_amd64, dist_rust/rustnetwork_linux_arm64
  • IPC mode: --management flag for JSON-over-stdin/stdout

IPC Commands

Method Description
healthPing Liveness check (returns { pong: true })
ping ICMP ping with count/timeout, returns stats
traceroute Hop-by-hop latency via raw ICMP sockets
tcpPortCheck TCP connect probe to remote host:port
isLocalPortFree Bind test on IPv4 + IPv6
defaultGateway Parse /proc/net/route for default interface

TypeScript Bridge

  • ts/smartnetwork.classes.rustbridge.ts — Singleton RustNetworkBridge wrapping smartrust.RustBridge
  • SmartNetwork class has start()/stop() lifecycle for the bridge
  • ensureBridge() auto-starts on first use

Build Pipeline

  • pnpm build = tsbuild tsfolders --allowimplicitany && tsrust
  • Targets configured in .smartconfig.json under @git.zone/tsrust

Key Components

SmartNetwork Class

  • Central orchestrator for all network operations
  • Requires start() before using ping/traceroute/port/gateway operations
  • Supports caching via cacheTtl option for gateway and public IP lookups
  • Plugin architecture for extensibility

RustNetworkBridge Class

  • Singleton pattern via getInstance()
  • Binary search: dist_rust/ (platform-suffixed) > rust/target/release/ > rust/target/debug/
  • searchSystemPath: false — only looks in local paths

CloudflareSpeed Class

  • Handles internet speed testing using Cloudflare's infrastructure
  • Supports parallel streams and customizable test duration
  • Upload speed measurement uses server-timing header with client-side timing fallback

Error Handling

  • Custom NetworkError and TimeoutError classes for better error context
  • Error codes follow Node.js conventions (ENOTSUP, EINVAL, ETIMEOUT)
  • Ping/port methods gracefully degrade on errors (return alive=false / false)

Logging

  • Global logger interface for consistent logging across the codebase
  • Replaceable logger implementation (defaults to console)

Statistics Helpers

  • Utility functions for statistical calculations (average, median, quartile, jitter)
  • Used by speed testing; ping statistics now computed server-side in Rust

Dependencies

  • Runtime: @push.rocks/smartrust (IPC bridge), @push.rocks/smartdns (DNS resolution)
  • Removed in v4.5.0: @push.rocks/smartping, @push.rocks/smartstring, isopen, systeminformation
  • Dev: @git.zone/tsrust (Rust cross-compilation)

Testing

  • test/test.ts — Core smoke tests (speed, ports, gateways, public IPs)
  • test/test.ping.ts — ICMP ping tests (requires CAP_NET_RAW for alive=true)
  • test/test.ports.ts — Comprehensive port testing (27 tests)
  • test/test.features.ts — DNS, HTTP health check, traceroute, multi-ping, plugins, caching
  • All tests require start()/stop() lifecycle for the Rust bridge

Technical Details

  • ESM-only package (module type)
  • TypeScript with strict typing
  • Node built-in imports use node: prefix throughout
  • Uses native Node.js modules for HTTP/HTTPS and os.networkInterfaces()
  • Rust binary requires no elevated privileges for port checks; ICMP ping needs CAP_NET_RAW or appropriate ping_group_range

Design Patterns

  • Singleton pattern for RustNetworkBridge
  • Factory pattern for plugin registration
  • Caching pattern with TTL for expensive operations
  • Promise-based async/await throughout
  • Error propagation with custom error types
  • Graceful degradation when ICMP permissions unavailable