burrow/Apple/UI/Tunnel.swift
2024-09-08 16:51:17 -07:00

61 lines
1.2 KiB
Swift

import BurrowConfiguration
import NetworkExtension
import SwiftUI
protocol Tunnel: Sendable {
@MainActor var status: TunnelStatus { get }
func start()
func stop()
func enable()
}
public enum TunnelStatus: Sendable, Equatable, Hashable {
case unknown
case permissionRequired
case disabled
case connecting
case connected(Date)
case disconnecting
case disconnected
case reasserting
case invalid
case configurationReadWriteFailed
}
struct TunnelKey: EnvironmentKey {
static var defaultValue: any Tunnel {
NetworkExtensionTunnel(bundleIdentifier: Constants.networkExtensionBundleIdentifier)
}
}
extension EnvironmentValues {
var tunnel: any Tunnel {
get { self[TunnelKey.self] }
set { self[TunnelKey.self] = newValue }
}
}
#if DEBUG
@Observable
@MainActor
final class PreviewTunnel: Tunnel {
private(set) var status: TunnelStatus = .permissionRequired
nonisolated func start() {
set(.connected(.now))
}
nonisolated func stop() {
set(.disconnected)
}
nonisolated func enable() {
set(.disconnected)
}
nonisolated private func set(_ status: TunnelStatus) {
Task { @MainActor in self.status = status }
}
}
#endif