Files
Meshtastic-Android/gradle
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
..