51 lines
1.2 KiB
TypeScript
51 lines
1.2 KiB
TypeScript
import { dirAsync } from "fs-jetpack";
|
|
import { dirname } from "path";
|
|
|
|
export const downloadFile = async (
|
|
url: string,
|
|
filePath: string,
|
|
progress?: (rec: number, total: number) => void
|
|
) => {
|
|
try {
|
|
const _url = new URL(url);
|
|
if (_url.hostname === "localhost") {
|
|
_url.hostname = "127.0.0.1";
|
|
}
|
|
const res = await fetch(_url as any);
|
|
if (res.body) {
|
|
await dirAsync(dirname(filePath));
|
|
const file = Bun.file(filePath);
|
|
|
|
const writer = file.writer();
|
|
const reader = res.body.getReader();
|
|
|
|
// Step 3: read the data
|
|
let receivedLength = 0; // received that many bytes at the moment
|
|
let chunks = []; // array of received binary chunks (comprises the body)
|
|
while (true) {
|
|
const { done, value } = await reader.read();
|
|
|
|
if (done) {
|
|
writer.end();
|
|
break;
|
|
}
|
|
|
|
chunks.push(value);
|
|
writer.write(value);
|
|
receivedLength += value.length;
|
|
|
|
if (progress) {
|
|
progress(
|
|
receivedLength,
|
|
parseInt(res.headers.get("content-length") || "0")
|
|
);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
} catch (e) {
|
|
console.log(e);
|
|
return false;
|
|
}
|
|
};
|