Move DataStream to a new function

This commit is contained in:
Balazs Perlaki-Horvath 2024-06-04 21:51:20 +02:00
parent 6226415653
commit c6730875df

View File

@ -86,31 +86,7 @@ final class KiwixURLSchemeHandler: NSObject, WKURLSchemeHandler {
return
}
let dataProvider: any DataProvider<URLContent>
let ranges: [ClosedRange<UInt>] // the list of ranges we should use to stream data
let size2MB: UInt = 2097152
if metaData.isMediaType, let directAccess = await directAccessInfo(for: url) {
dataProvider = ZimDirectContentProvider(directAccess: directAccess,
contentSize: metaData.size)
ranges = ByteRanges.rangesFor(
contentLength: metaData.size,
rangeSize: size2MB
)
} else {
dataProvider = ZimContentProvider(for: url)
// if the data is larger than 2MB, read it "in chunks"
if metaData.size > size2MB {
ranges = ByteRanges.rangesFor(
contentLength: metaData.size,
rangeSize: size2MB
)
} else { // use the full range and read it in one go
ranges = [0...metaData.size]
}
}
guard let dataStream = DataStream(dataProvider: dataProvider, ranges: ranges)
else {
guard let dataStream = await dataStream(for: url, metaData: metaData) else {
sendHTTP404Response(urlSchemeTask, url: url)
return
}
@ -138,6 +114,32 @@ final class KiwixURLSchemeHandler: NSObject, WKURLSchemeHandler {
// MARK: Reading content
private func dataStream(for url: URL, metaData: URLContentMetaData) async -> DataStream<URLContent>? {
let dataProvider: any DataProvider<URLContent>
let ranges: [ClosedRange<UInt>] // the list of ranges we should use to stream data
let size2MB: UInt = 2097152 // 2MB
if metaData.isMediaType, let directAccess = await directAccessInfo(for: url) {
dataProvider = ZimDirectContentProvider(directAccess: directAccess,
contentSize: metaData.size)
ranges = ByteRanges.rangesFor(
contentLength: metaData.size,
rangeSize: size2MB
)
} else {
dataProvider = ZimContentProvider(for: url)
// if the data is larger than 2MB, read it "in chunks"
if metaData.size > size2MB {
ranges = ByteRanges.rangesFor(
contentLength: metaData.size,
rangeSize: size2MB
)
} else { // use the full range and read it in one go
ranges = [0...metaData.size]
}
}
return DataStream(dataProvider: dataProvider, ranges: ranges)
}
private func contentMetaData(for url: URL) async -> URLContentMetaData? {
return await withCheckedContinuation { continuation in
Task.detached(priority: .utility) {