import Foundation struct LocalLayerCache { struct DigestInfo { let range: Range let compressedDigest: String let uncompressedContentDigest: String? } let name: String let deduplicatedBytes: UInt64 let diskURL: URL private let mappedDisk: Data private var digestToRange: [String: DigestInfo] = [:] private var offsetToRange: [UInt64: DigestInfo] = [:] init?(_ name: String, _ deduplicatedBytes: UInt64, _ diskURL: URL, _ manifest: OCIManifest) throws { self.name = name self.deduplicatedBytes = deduplicatedBytes self.diskURL = diskURL // mmap(2) the disk that contains the layers from the manifest self.mappedDisk = try Data(contentsOf: diskURL, options: [.alwaysMapped]) // Record the ranges of the disk layers listed in the manifest var offset: UInt64 = 0 for layer in manifest.layers.filter({ $0.mediaType == diskV2MediaType }) { guard let uncompressedSize = layer.uncompressedSize() else { return nil } let info = DigestInfo( range: Int(offset).. DigestInfo? { // Layers can have the same digests, for example, empty ones. Let's use the offset hint to make a better guess. if let info = self.offsetToRange[offsetHint], info.compressedDigest == digest { return info } return self.digestToRange[digest] } func subdata(_ range: Range) -> Data { return self.mappedDisk.subdata(in: range) } }