Fix model, delete if necessary
This commit is contained in:
37
Sesame/Common/Extensions/App+Extensions.swift
Normal file
37
Sesame/Common/Extensions/App+Extensions.swift
Normal file
@ -0,0 +1,37 @@
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
extension App {
|
||||
|
||||
static func loadModelContainer() -> ModelContainer {
|
||||
do {
|
||||
return try ModelContainer(for: HistoryItem.self)
|
||||
} catch {
|
||||
print("[WARNING] Removing default SwiftData storage")
|
||||
removeDefaultModelContainer()
|
||||
}
|
||||
// Try again to load an empty container
|
||||
do {
|
||||
return try ModelContainer(for: HistoryItem.self)
|
||||
} catch {
|
||||
fatalError("Failed to create empty model container: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
private static func removeDefaultModelContainer() {
|
||||
guard let appSupportDir = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).last else {
|
||||
fatalError("Failed to get application support directory")
|
||||
}
|
||||
do {
|
||||
try FileManager.default.contentsOfDirectory(at: appSupportDir, includingPropertiesForKeys: nil)
|
||||
.filter { $0.lastPathComponent.hasPrefix("default") }
|
||||
.forEach {
|
||||
try FileManager.default.removeItem(at: $0)
|
||||
}
|
||||
} catch {
|
||||
print(error)
|
||||
fatalError("Failed to remove default SwiftData database files")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -6,7 +6,7 @@ final class HistoryItem {
|
||||
|
||||
let startDate: Date
|
||||
|
||||
let message: Message
|
||||
let message: HistoryMessage
|
||||
|
||||
let route: TransmissionType
|
||||
|
||||
@ -14,7 +14,11 @@ final class HistoryItem {
|
||||
|
||||
init(message: Message, startDate: Date, route: TransmissionType, finishDate: Date) {
|
||||
self.startDate = startDate
|
||||
self.message = message
|
||||
self.message = .init(
|
||||
messageType: message.messageType,
|
||||
clientChallenge: Int(message.clientChallenge),
|
||||
serverChallenge: Int(message.serverChallenge),
|
||||
result: message.result)
|
||||
self.finishDate = finishDate
|
||||
self.route = route
|
||||
}
|
||||
@ -28,6 +32,59 @@ final class HistoryItem {
|
||||
}
|
||||
}
|
||||
|
||||
struct HistoryMessage {
|
||||
|
||||
/// The type of message being sent.
|
||||
let messageType: MessageType
|
||||
|
||||
/**
|
||||
* The random nonce created by the remote
|
||||
*
|
||||
* This nonce is a random number created by the remote, different for each unlock request.
|
||||
* It is set for all message types.
|
||||
*/
|
||||
let clientChallenge: Int
|
||||
|
||||
/**
|
||||
* A random number to sign by the remote
|
||||
*
|
||||
* This nonce is set by the server after receiving an initial message.
|
||||
* It is set for the message types `challenge`, `request`, and `response`.
|
||||
*/
|
||||
let serverChallenge: Int
|
||||
|
||||
/**
|
||||
* The response status for the previous message.
|
||||
*
|
||||
* It is set only for messages from the server, e.g. the `challenge` and `response` message types.
|
||||
* Must be set to `MessageAccepted` for other messages.
|
||||
*/
|
||||
let result: MessageResult
|
||||
}
|
||||
|
||||
extension HistoryMessage: Encodable {
|
||||
|
||||
func encode(to encoder: Encoder) throws {
|
||||
var container = encoder.unkeyedContainer()
|
||||
try container.encode(messageType)
|
||||
try container.encode(clientChallenge)
|
||||
try container.encode(serverChallenge)
|
||||
try container.encode(result)
|
||||
}
|
||||
}
|
||||
|
||||
extension HistoryMessage: Decodable {
|
||||
|
||||
init(from decoder: Decoder) throws {
|
||||
var container = try decoder.unkeyedContainer()
|
||||
self.messageType = try container.decode(MessageType.self)
|
||||
self.clientChallenge = try container.decode(Int.self)
|
||||
self.serverChallenge = try container.decode(Int.self)
|
||||
self.result = try container.decode(MessageResult.self)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extension HistoryItem: Identifiable {
|
||||
|
||||
var id: Double {
|
||||
|
@ -8,11 +8,7 @@ struct SesameApp: App {
|
||||
var modelContainer: ModelContainer
|
||||
|
||||
init() {
|
||||
do {
|
||||
self.modelContainer = try ModelContainer(for: HistoryItem.self)
|
||||
} catch {
|
||||
fatalError("Failed to create model container: \(error)")
|
||||
}
|
||||
self.modelContainer = SesameApp.loadModelContainer()
|
||||
}
|
||||
|
||||
var body: some Scene {
|
||||
|
Reference in New Issue
Block a user