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