krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v3.0.0: Hutch/Networking/NetworkMonitor.swift · raw

 1import Foundation
 2import Network
 3
 4/// Observes network connectivity using `NWPathMonitor`.
 5/// Shared singleton injected into the environment.
 6@Observable
 7@MainActor
 8final class NetworkMonitor {
 9
10    private(set) var isConnected = true
11    private(set) var connectionType: ConnectionType = .unknown
12
13    enum ConnectionType: Sendable {
14        case wifi
15        case cellular
16        case wiredEthernet
17        case unknown
18    }
19
20    private let monitor = NWPathMonitor()
21    private let queue = DispatchQueue(label: "net.cleberg.Hutch.NetworkMonitor")
22
23    init() {
24        startMonitoring()
25    }
26
27    private func startMonitoring() {
28        monitor.pathUpdateHandler = { [weak self] path in
29            Task { @MainActor [weak self] in
30                guard let self else { return }
31                self.isConnected = path.status == .satisfied
32                self.connectionType = self.resolveConnectionType(path)
33            }
34        }
35        monitor.start(queue: queue)
36    }
37
38    private nonisolated func resolveConnectionType(_ path: NWPath) -> ConnectionType {
39        if path.usesInterfaceType(.wifi) { return .wifi }
40        if path.usesInterfaceType(.cellular) { return .cellular }
41        if path.usesInterfaceType(.wiredEthernet) { return .wiredEthernet }
42        return .unknown
43    }
44
45    deinit {
46        monitor.cancel()
47    }
48}