@@ -9,56 +9,90 @@ import CryptoKit
99import Foundation
1010
1111actor WebPageImageStore {
12- private let fileManager : FileManager
12+ func cachedImageURL( for url: URL ) async throws -> URL {
13+ return try await Task . detached ( priority: . utility) {
14+ return try Self . cachedImageURL ( for: url)
15+ } . value
16+ }
17+
18+ func saveImage( _ data: Data , for url: URL ) async throws -> URL {
19+ return try await Task . detached ( priority: . utility) {
20+ return try Self . saveImage ( data, for: url)
21+ } . value
22+ }
23+
24+ func dirSizeInBytes( ) async -> Int64 {
25+ do {
26+ return try await Task . detached ( priority: . utility) {
27+ return try Self . dirSizeInBytes ( )
28+ } . value
29+ } catch {
30+ return 0
31+ }
32+ }
33+
34+ func clearDirectory( ) async throws {
35+ try await Task . detached ( priority: . utility) {
36+ try Self . clearDirectory ( )
37+ } . value
38+ }
1339
14- init ( fileManager: FileManager = . default) {
15- self . fileManager = fileManager
40+ func removeImage( for url: URL ) async throws -> Bool {
41+ return try await Task . detached ( priority: . utility) {
42+ return try Self . removeImage ( for: url)
43+ } . value
1644 }
45+ }
1746
18- func cachedImageURL( for url: URL ) throws -> URL {
19- let imageDirectoryURL = try self . imageDirectoryURL ( create: true )
47+ private extension WebPageImageStore {
48+ static func hashedFileName( for url: URL ) -> String {
49+ let hashValue = SHA256 . hash ( data: Data ( url. absoluteString. utf8) )
50+ return hashValue. map { String ( format: " %02x " , $0) } . joined ( )
51+ }
52+
53+ static func cachedImageURL( for url: URL ) throws -> URL {
54+ let fileManager = FileManager . default
55+ let imageDirectoryURL = try imageDirectoryURL ( create: true , fileManager: fileManager)
2056 let fileName = hashedFileName ( for: url)
2157
2258 return imageDirectoryURL
2359 . appendingPathComponent ( fileName)
2460 . appendingPathExtension ( " jpeg " )
2561 }
2662
27- func saveImage( _ data: Data , for url: URL ) throws -> URL {
63+ static func saveImage( _ data: Data , for url: URL ) throws -> URL {
2864 let fileURL = try cachedImageURL ( for: url)
2965 try data. write ( to: fileURL, options: [ . atomic] )
3066 return fileURL
3167 }
3268
33- func dirSizeInBytes( ) -> Int64 {
34- do {
35- let imageDirectoryURL = try self . imageDirectoryURL ( create: false )
36- guard fileManager. fileExists ( atPath: imageDirectoryURL. path) else { return 0 }
37- guard let enumerator = fileManager. enumerator (
38- at: imageDirectoryURL,
39- includingPropertiesForKeys: [ . isRegularFileKey, . fileSizeKey] ,
40- options: [ . skipsHiddenFiles]
41- ) else {
42- return 0
43- }
69+ static func dirSizeInBytes( ) throws -> Int64 {
70+ let fileManager = FileManager . default
71+ let imageDirectoryURL = try imageDirectoryURL ( create: false , fileManager : fileManager )
72+ guard fileManager. fileExists ( atPath: imageDirectoryURL. path) else { return 0 }
73+ guard let enumerator = fileManager. enumerator (
74+ at: imageDirectoryURL,
75+ includingPropertiesForKeys: [ . isRegularFileKey, . fileSizeKey] ,
76+ options: [ . skipsHiddenFiles]
77+ ) else {
78+ return 0
79+ }
4480
45- var total : Int64 = 0
46- for case let fileURL as URL in enumerator {
47- guard let resourceValues = try ? fileURL. resourceValues ( forKeys: [ . isRegularFileKey, . fileSizeKey] ) ,
48- resourceValues. isRegularFile == true ,
49- let fileSize = resourceValues. fileSize else {
50- continue
51- }
52- total += Int64 ( fileSize)
81+ var total : Int64 = 0
82+ for case let fileURL as URL in enumerator {
83+ guard let resourceValues = try ? fileURL. resourceValues ( forKeys: [ . isRegularFileKey, . fileSizeKey] ) ,
84+ resourceValues. isRegularFile == true ,
85+ let fileSize = resourceValues. fileSize else {
86+ continue
5387 }
54- return total
55- } catch {
56- return 0
88+ total += Int64 ( fileSize)
5789 }
90+ return total
5891 }
5992
60- func clearDirectory( ) throws {
61- let imageDirectoryURL = try self . imageDirectoryURL ( create: false )
93+ static func clearDirectory( ) throws {
94+ let fileManager = FileManager . default
95+ let imageDirectoryURL = try imageDirectoryURL ( create: false , fileManager: fileManager)
6296 guard fileManager. fileExists ( atPath: imageDirectoryURL. path) else { return }
6397 let contentURLs = try fileManager. contentsOfDirectory (
6498 at: imageDirectoryURL,
@@ -70,21 +104,15 @@ actor WebPageImageStore {
70104 }
71105 }
72106
73- func removeImage( for url: URL ) throws -> Bool {
107+ static func removeImage( for url: URL ) throws -> Bool {
108+ let fileManager = FileManager . default
74109 let fileURL = try cachedImageURL ( for: url)
75110 guard fileManager. fileExists ( atPath: fileURL. path) else { return false }
76111 try fileManager. removeItem ( at: fileURL)
77112 return true
78113 }
79- }
80-
81- private extension WebPageImageStore {
82- func hashedFileName( for url: URL ) -> String {
83- let hashValue = SHA256 . hash ( data: Data ( url. absoluteString. utf8) )
84- return hashValue. map { String ( format: " %02x " , $0) } . joined ( )
85- }
86114
87- func imageDirectoryURL( create: Bool ) throws -> URL {
115+ static func imageDirectoryURL( create: Bool , fileManager : FileManager ) throws -> URL {
88116 let directory = try fileManager. url (
89117 for: . applicationSupportDirectory,
90118 in: . userDomainMask,
0 commit comments