mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-09-21 19:25:10 -04:00
core:network is the largest module tackled so far in this effort: BLE radio transport, TCP radio transport, MQTT (TCP + WebSocket transports), USB/Serial, mDNS/NSD discovery, and HTTP data sources for api.meshtastic.org all live here. BLE and Mock/Replay radio transports already work unchanged -- BaseRadioTransportFactory handles BLE directly via core:ble's Web Bluetooth actuals, and Mock/Replay are already commonMain-portable. A new WasmJsRadioTransportFactory implements the platform seam, failing loudly for TCP and Serial/USB addresses (no browser equivalent for raw sockets; WebSerial/WebUSB out of scope this pass). Raw TCP sockets are a permanent browser sandbox limitation, not a library gap (confirmed via Ktor's own docs/KTOR-6690, recorded earlier this session). TcpTransport/TcpRadioTransport move to nonWebMain. MQTT's transport composition becomes a real per-platform expect/actual (MqttTransportSelection.kt): nonWebMain composes TCP+WebSocket as before, wasmJs registers WebSocket only -- mqtt-client-transport-ws publishes a wasmJs Gradle variant, mqtt-client-transport-tcp does not (confirmed via Maven Central's module metadata directly, not assumed). New wasmJs actuals: WebNetworkMonitor (real navigator.onLine plus window online/offline events, via kotlinx-browser -- no custom JS interop needed), MqttTlsTrust.wasmJs.kt (null -- a browser page cannot influence TLS trust at all, the platform decision is the only one available), ConnectionFailures.wasmJs.kt (false -- Ktor's Js engine surfaces failures through the same IOException family the shared predicate already covers). CoreNetworkWasmJsModule wires a real HttpClient(Js) engine for the HTTP data sources; deliberately no @ComponentScan since commonMain's CoreNetworkModule scan already reaches this target's @Single classes. Like core:database's SingleDatabaseProvider and core:prefs's CorePrefsWasmJsModule, it's not registered anywhere yet -- no webApp module exists this pass. core:network's own applyHierarchyTemplate call (needed for the nonWeb/wasmJs split) can't coexist with the separate meshtastic.kmp.jvm.android convention plugin, which makes its own call -- Gradle only allows one per project. Replaced with a nested jvmAndroid group inside the custom nonWeb group; ConnectionFailures's existing jvmAndroidMain source set needed no changes. One small upstream fix: core:ble's classifyBleException() had no wasmJs counterpart, blocking core:network's commonMain BleRadioTransport.kt. Added as an honest `= null` (Kable doesn't exist on wasmJs at all, so nothing is ever a recognized Kable exception there) -- same disjoint-compilation shape as BleServiceExtensions.kt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
:core:network
Overview
The :core:network module handles all internet-based communication, including fetching firmware metadata, device hardware definitions, and map tiles (in the fdroid flavor). It also provides the shared radio transport layer (TcpTransport/TcpRadioTransport, SerialTransport, BleRadioTransport).
Key Components
1. Ktor Client
The module uses Ktor as its primary HTTP client for high-performance, asynchronous networking.
2. Remote Data Sources
FirmwareReleaseRemoteDataSource: Fetches the latest firmware versions from GitHub or Meshtastic's metadata servers.DeviceHardwareRemoteDataSource: Fetches definitions for supported Meshtastic hardware devices.
3. Shared Transports
TcpTransport(transport/) +TcpRadioTransport(radio/): Multiplatform TCP transport and itsRadioTransportadapter.SerialTransport: JVM-shared USB/Serial transport powered by jSerialComm.BleRadioTransport(radio/): TheRadioTransportimplementation for Bluetooth devices.BaseRadioTransportFactory: Common factory for instantiating the KMP transports.
BLE: the
RadioTransportimplementation (BleRadioTransport) lives here inradio/; it delegates to the lower-level Kable connection primitives (BleConnection,BleScanner,BluetoothRepository, …) provided by:core:ble.BaseRadioTransportFactoryinstantiates it when an address with thex(or!) prefix is resolved.
Dependency Graph
graph TB
:core:network[network]:::kmp-library
:core:network --> :core:repository
:core:network -.-> :core:common
:core:network -.-> :core:di
:core:network -.-> :core:model
:core:network -.-> :core:ble
:core:network -.-> :core:testing
classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000;
classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000;