48 lines
1.7 KiB
Swift
48 lines
1.7 KiB
Swift
//
|
|
// PersistentHistoryTokenStore.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 6/8/24.
|
|
// Copyright © 2024 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import CoreData
|
|
import UserAccounts
|
|
|
|
struct PersistentHistoryTokenStore {
|
|
private static let queue = DispatchQueue(label: "PersistentHistoryTokenStore")
|
|
|
|
private static var tokens: [String: NSPersistentHistoryToken] = (try? load()) ?? [:]
|
|
|
|
private static let applicationSupportDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
|
|
private static let storeURL = applicationSupportDirectory.appendingPathComponent("PersistentHistoryTokenStore.plist")
|
|
|
|
private static func load() throws -> [String: NSPersistentHistoryToken]? {
|
|
let data = try Data(contentsOf: storeURL)
|
|
let unarchived = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSDictionary.self, NSString.self, NSPersistentHistoryToken.self], from: data)
|
|
return unarchived as? [String: NSPersistentHistoryToken]
|
|
}
|
|
|
|
private static func save() throws {
|
|
let data = try NSKeyedArchiver.archivedData(withRootObject: tokens as [NSString: NSPersistentHistoryToken], requiringSecureCoding: true)
|
|
try data.write(to: PersistentHistoryTokenStore.storeURL)
|
|
}
|
|
|
|
static func token(for account: UserAccountInfo, completion: @escaping (NSPersistentHistoryToken?) -> Void) {
|
|
queue.async {
|
|
completion(tokens[account.id])
|
|
}
|
|
}
|
|
|
|
static func setToken(_ token: NSPersistentHistoryToken, for account: UserAccountInfo) {
|
|
queue.async {
|
|
tokens[account.id] = token
|
|
try? save()
|
|
}
|
|
}
|
|
|
|
private init() {}
|
|
|
|
}
|