punchnet-macos/Tun/Punchnet/SDLTunnelAppNotifier.swift
2026-04-15 14:31:16 +08:00

69 lines
1.8 KiB
Swift

//
// SDLTunnelAppNotifier.swift
// Tun
//
// Created by on 2026/4/15.
//
import Foundation
final class SDLTunnelAppNotifier {
struct Event: Codable, Sendable {
enum Level: String, Codable, Sendable {
case info
case warning
case error
case fatal
}
let id: String
let timestamp: TimeInterval
let level: Level
let code: Int?
let message: String
}
static let shared = SDLTunnelAppNotifier()
private let suiteName: String
private let eventKey: String
init(suiteName: String = SDLNotificationCenter.Configuration.appGroupSuiteName,
eventKey: String = SDLNotificationCenter.Configuration.latestEventKey) {
self.suiteName = suiteName
self.eventKey = eventKey
}
func publish(level: Event.Level = .error, code: Int? = nil, message: String) {
let event = Event(
id: UUID().uuidString,
timestamp: Date().timeIntervalSince1970,
level: level,
code: code,
message: message
)
self.publish(event)
}
func publish(_ event: Event) {
guard let shared = UserDefaults(suiteName: self.suiteName),
let data = try? JSONEncoder().encode(event) else {
return
}
shared.set(data, forKey: self.eventKey)
shared.synchronize()
SDLNotificationCenter.shared.post(.tunnelEventChanged)
}
func clear() {
guard let shared = UserDefaults(suiteName: self.suiteName) else {
return
}
shared.removeObject(forKey: self.eventKey)
shared.synchronize()
SDLNotificationCenter.shared.post(.tunnelEventChanged)
}
}