Signal-iOS/SignalServiceKit/Util/StreamTransform/MetadataStreamTransform.swift
2024-05-17 10:40:21 -07:00

45 lines
1.2 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public class MetadataStreamTransform: StreamTransform, FinalizableStreamTransform {
public var hasFinalized: Bool = false
private var digestContext: SHA256DigestContext?
private var _digest: Data?
public func digest() throws -> Data {
guard calculateDigest else {
throw OWSAssertionError("Not configured to calculate digest")
}
guard hasFinalized, let digest = _digest else {
throw OWSAssertionError("Reading digest before finalized")
}
return digest
}
private let calculateDigest: Bool
init(calculateDigest: Bool) {
self.calculateDigest = calculateDigest
if calculateDigest {
self.digestContext = SHA256DigestContext()
}
}
public private(set) var count: Int = 0
public func transform(data: Data) throws -> Data {
try digestContext?.update(data)
count += data.count
return data
}
public func finalize() throws -> Data {
self.hasFinalized = true
self._digest = try self.digestContext?.finalize()
return Data()
}
}