RadrootsInMemorySecureStore.swift (2253B)
1 import Foundation 2 import RadrootsKit 3 4 public final class RadrootsInMemorySecureStore: RadrootsSecureStore, @unchecked Sendable { 5 private struct Entry: Sendable { 6 let value: Data 7 let policy: RadrootsSecretAccessPolicy 8 } 9 10 private let lock = NSLock() 11 private var entries: [RadrootsSecureStoreKey: Entry] 12 13 public init() { 14 self.entries = [:] 15 } 16 17 public func put( 18 _ value: Data, 19 for key: RadrootsSecureStoreKey, 20 policy: RadrootsSecretAccessPolicy 21 ) throws { 22 let normalizedKey = try key.normalized() 23 lock.lock() 24 defer { lock.unlock() } 25 entries[normalizedKey] = Entry(value: value, policy: policy) 26 } 27 28 public func contains(_ key: RadrootsSecureStoreKey) throws -> Bool { 29 let normalizedKey = try key.normalized() 30 lock.lock() 31 defer { lock.unlock() } 32 return entries[normalizedKey] != nil 33 } 34 35 public func get(_ key: RadrootsSecureStoreKey) throws -> Data? { 36 let normalizedKey = try key.normalized() 37 lock.lock() 38 defer { lock.unlock() } 39 return entries[normalizedKey]?.value 40 } 41 42 public func delete(_ key: RadrootsSecureStoreKey) throws { 43 let normalizedKey = try key.normalized() 44 lock.lock() 45 defer { lock.unlock() } 46 entries.removeValue(forKey: normalizedKey) 47 } 48 49 public func deleteNamespace(_ namespace: String) throws { 50 let normalizedNamespace = try RadrootsSecureStoreKey.normalizedNamespace(namespace) 51 lock.lock() 52 defer { lock.unlock() } 53 entries = entries.filter { key, _ in 54 key.namespace != normalizedNamespace 55 } 56 } 57 58 public func policy(for key: RadrootsSecureStoreKey) throws -> RadrootsSecretAccessPolicy? { 59 let normalizedKey = try key.normalized() 60 lock.lock() 61 defer { lock.unlock() } 62 return entries[normalizedKey]?.policy 63 } 64 65 public func keys() -> [RadrootsSecureStoreKey] { 66 lock.lock() 67 defer { lock.unlock() } 68 return entries.keys.sorted { 69 if $0.namespace == $1.namespace { 70 return $0.name < $1.name 71 } 72 return $0.namespace < $1.namespace 73 } 74 } 75 }