ReadKeep/readeck/Data/TokenProvider.swift
Ilyas Hallak 99ef722e7d perf: Add simple caching to KeychainTokenProvider
- Cache token and endpoint in memory to avoid repeated keychain access
- First call reads from keychain, subsequent calls use cached values
- Significantly improves performance for frequent API calls
- Simple implementation without unnecessary locking or complexity

fix: Properly URL-encode labels parameter for API requests

- Add quotes around label values to match API requirements
- Fix label filtering for labels with spaces (e.g. 'aa aa')
- Ensure proper URL encoding as required by server
- Maintains existing pagination and filtering functionality
2025-10-01 21:51:34 +02:00

48 lines
1.1 KiB
Swift

import Foundation
protocol TokenProvider {
func getToken() async -> String?
func getEndpoint() async -> String?
func setToken(_ token: String) async
func clearToken() async
}
class KeychainTokenProvider: TokenProvider {
private let keychainHelper = KeychainHelper.shared
// Cache to avoid repeated keychain access
private var cachedToken: String?
private var cachedEndpoint: String?
func getToken() async -> String? {
if let cached = cachedToken {
return cached
}
let token = keychainHelper.loadToken()
cachedToken = token
return token
}
func getEndpoint() async -> String? {
if let cached = cachedEndpoint {
return cached
}
let endpoint = keychainHelper.loadEndpoint()
cachedEndpoint = endpoint
return endpoint
}
func setToken(_ token: String) async {
keychainHelper.saveToken(token)
cachedToken = token
}
func clearToken() async {
keychainHelper.clearCredentials()
cachedToken = nil
cachedEndpoint = nil
}
}