mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-27 15:17:38 +00:00
85 lines
2.1 KiB
Swift
85 lines
2.1 KiB
Swift
import Combine
|
|
import Foundation
|
|
|
|
/// Common interface for server implementations.
|
|
///
|
|
/// Defines the contract that all VibeTunnel server implementations must follow.
|
|
/// This protocol ensures consistent behavior across different server backends
|
|
/// (Hummingbird, Rust) while allowing for implementation-specific details.
|
|
@MainActor
|
|
protocol ServerProtocol: AnyObject {
|
|
/// Current running state of the server
|
|
var isRunning: Bool { get }
|
|
|
|
/// Port the server is configured to use
|
|
var port: String { get set }
|
|
|
|
/// Server type identifier
|
|
var serverType: ServerMode { get }
|
|
|
|
/// Start the server
|
|
func start() async throws
|
|
|
|
/// Stop the server
|
|
func stop() async
|
|
|
|
/// Restart the server
|
|
func restart() async throws
|
|
|
|
/// Publisher for streaming log messages
|
|
var logPublisher: AnyPublisher<ServerLogEntry, Never> { get }
|
|
}
|
|
|
|
/// Server mode options.
|
|
///
|
|
/// Represents the available server implementations that VibeTunnel can use.
|
|
/// Each mode corresponds to a different backend technology with its own
|
|
/// performance characteristics and feature set.
|
|
enum ServerMode: String, CaseIterable {
|
|
case hummingbird
|
|
case rust
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .hummingbird:
|
|
"Hummingbird"
|
|
case .rust:
|
|
"Rust"
|
|
}
|
|
}
|
|
|
|
var description: String {
|
|
switch self {
|
|
case .hummingbird:
|
|
"Built-in Swift server"
|
|
case .rust:
|
|
"External tty-fwd binary"
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Log entry from server.
|
|
///
|
|
/// Represents a single log message from a server implementation,
|
|
/// including severity level, timestamp, and source identification.
|
|
struct ServerLogEntry {
|
|
/// Severity level of the log entry.
|
|
enum Level {
|
|
case debug
|
|
case info
|
|
case warning
|
|
case error
|
|
}
|
|
|
|
let timestamp: Date
|
|
let level: Level
|
|
let message: String
|
|
let source: ServerMode
|
|
|
|
init(level: Level = .info, message: String, source: ServerMode) {
|
|
self.timestamp = Date()
|
|
self.level = level
|
|
self.message = message
|
|
self.source = source
|
|
}
|
|
}
|