burrow/Apple/UI/Tunnel.swift
Conrad Kramer 85640ffce1
Some checks are pending
Build AppImage / Build AppImage (push) Waiting to run
Build Apple Apps / Build App (iOS) (push) Waiting to run
Build Apple Apps / Build App (iOS Simulator) (push) Waiting to run
Build Apple Apps / Build App (macOS) (push) Waiting to run
Build Docker / Build Docker Image (push) Waiting to run
Build Rust Crate / Build Crate (macOS (Intel)) (push) Waiting to run
Build Rust Crate / Build Crate (macOS) (push) Waiting to run
Build Rust Crate / Build Crate (Linux) (push) Waiting to run
Build Rust Crate / Build Crate (Windows) (push) Waiting to run
Switch to gRPC client in Swift app
2024-09-09 10:38:13 -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