mobiler 0.18.0

Build mobile apps in Rust — one core, native UI on Android, iOS, and the web (CLI)
import SharedTypes
import Network

/// Free bundled plugin: current network connectivity. op "status" → "offline" or
/// "online:<wifi|cellular|other>". One-shot NWPathMonitor read; no permission.
enum ConnectivityPlugin {
    static func handle(op: String, input: String) async -> PluginResponse {
        guard op == "status" else { return PluginResponse(ok: false, output: "unknown op '\(op)'") }
        return await withCheckedContinuation { cont in
            let monitor = NWPathMonitor()
            let queue = DispatchQueue(label: "mobiler.connectivity")
            // pathUpdateHandler fires on `queue` (serial), so this guard is single-threaded.
            var finished = false
            monitor.pathUpdateHandler = { path in
                if finished { return }
                finished = true
                let out: String
                if path.status != .satisfied { out = "offline" }
                else if path.usesInterfaceType(.wifi) { out = "online:wifi" }
                else if path.usesInterfaceType(.cellular) { out = "online:cellular" }
                else { out = "online:other" }
                monitor.cancel()
                cont.resume(returning: PluginResponse(ok: true, output: out))
            }
            monitor.start(queue: queue)
        }
    }
}