krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v2.3.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}