mirror of https://github.com/kern/filepizza
more progress
parent
102053ea64
commit
6739d187e2
@ -0,0 +1,61 @@
|
||||
import { createZipStream } from '../zip-stream'
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
if (typeof window !== 'undefined') require('web-streams-polyfill/ponyfill')
|
||||
|
||||
const baseURL = process.env.NEXT_PUBLIC_BASE_URL ?? 'http://localhost:3000'
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const streamSaver =
|
||||
typeof window !== 'undefined' ? require('streamsaver') : null
|
||||
if (typeof window !== 'undefined') {
|
||||
streamSaver.mitm = baseURL + '/stream.html'
|
||||
}
|
||||
|
||||
type DownloadFileStream = {
|
||||
name: string
|
||||
size: number
|
||||
stream: () => ReadableStream<Uint8Array>
|
||||
}
|
||||
|
||||
export async function streamDownloadSingleFile(
|
||||
file: DownloadFileStream,
|
||||
filename: string,
|
||||
): Promise<void> {
|
||||
const fileStream = streamSaver.createWriteStream(filename, {
|
||||
size: file.size,
|
||||
})
|
||||
|
||||
const writer = fileStream.getWriter()
|
||||
const reader = file.stream().getReader()
|
||||
|
||||
const pump = async () => {
|
||||
const res = await reader.read()
|
||||
return res.done ? writer.close() : writer.write(res.value).then(pump)
|
||||
}
|
||||
await pump()
|
||||
}
|
||||
|
||||
export function streamDownloadMultipleFiles(
|
||||
files: Array<DownloadFileStream>,
|
||||
filename: string,
|
||||
): Promise<void> {
|
||||
const totalSize = files.reduce((acc, file) => acc + file.size, 0)
|
||||
const fileStream = streamSaver.createWriteStream(filename, {
|
||||
size: totalSize,
|
||||
})
|
||||
|
||||
const readableZipStream = createZipStream({
|
||||
start(ctrl) {
|
||||
for (const file of files) {
|
||||
ctrl.enqueue(file as unknown as ArrayBufferView)
|
||||
}
|
||||
ctrl.close()
|
||||
},
|
||||
async pull(_ctrl) {
|
||||
// Gets executed everytime zip-stream asks for more data
|
||||
},
|
||||
})
|
||||
|
||||
return readableZipStream.pipeTo(fileStream)
|
||||
}
|
||||
Loading…
Reference in New Issue