Files
Meshtastic-Android/core/network
James RichandClaude Sonnet 5 e95cc396c5 feat(network): enable wasmJs with WebSocket-only MQTT and real HTTP client
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>
2026-08-30 22:17:51 -05:00
..

: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 its RadioTransport adapter.
  • SerialTransport: JVM-shared USB/Serial transport powered by jSerialComm.
  • BleRadioTransport (radio/): The RadioTransport implementation for Bluetooth devices.
  • BaseRadioTransportFactory: Common factory for instantiating the KMP transports.

BLE: the RadioTransport implementation (BleRadioTransport) lives here in radio/; it delegates to the lower-level Kable connection primitives (BleConnection, BleScanner, BluetoothRepository, …) provided by :core:ble. BaseRadioTransportFactory instantiates it when an address with the x (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;