Add HTMLMetadataCache.

This commit is contained in:
Brent Simmons
2024-10-14 22:32:48 -07:00
parent 779d24ee22
commit a0b4fedd76
2 changed files with 49 additions and 1 deletions

View File

@@ -21,7 +21,7 @@ public extension Date {
}
}
private extension TimeInterval {
public extension TimeInterval {
init(days: Int) {
self.init(days * 24 * 60 * 60)

View File

@@ -0,0 +1,48 @@
//
// HTMLMetadataCache.swift
//
//
// Created by Brent Simmons on 10/13/24.
//
import Foundation
import Core
import Parser
import FoundationExtras
extension Notification.Name {
// Sent when HTMLMetadata is cached. Posted on any thread.
static let htmlMetadataAvailable = Notification.Name("htmlMetadataAvailable")
}
final class HTMLMetadataCache: Sendable {
static let shared = HTMLMetadataCache()
// Sent along with .htmlMetadataAvailable notification
struct UserInfoKey {
static let htmlMetadata = "htmlMetadata"
static let url = "url" // String value
}
private struct HTMLMetadataCacheRecord: CacheRecord {
let metadata: HTMLMetadata
let dateCreated = Date()
}
private let cache = Cache<HTMLMetadataCacheRecord>(timeToLive: TimeInterval(days: 2), timeBetweenCleanups: TimeInterval(days: 1))
subscript(_ url: String) -> HTMLMetadata? {
get {
return cache[url]?.metadata
}
set {
guard let htmlMetadata = newValue else {
return
}
let cacheRecord = HTMLMetadataCacheRecord(metadata: htmlMetadata)
cache[url] = cacheRecord
NotificationCenter.default.post(name: .htmlMetadataAvailable, object: self, userInfo: [UserInfoKey.htmlMetadata: htmlMetadata, UserInfoKey.url: url])
}
}
}