mirror of https://github.com/VERT-sh/VERT.git
parent
06d7cfaad9
commit
23e2601576
|
|
@ -5,6 +5,8 @@ import { ToastManager } from "$lib/util/toast.svelte";
|
||||||
import type { Component } from "svelte";
|
import type { Component } from "svelte";
|
||||||
import { MAX_ARRAY_BUFFER_SIZE } from "$lib/store/index.svelte";
|
import { MAX_ARRAY_BUFFER_SIZE } from "$lib/store/index.svelte";
|
||||||
|
|
||||||
|
const MAX_BLOB_SIZE_LIMIT = 2 * 1024 * 1024 * 1024; // 2GB
|
||||||
|
|
||||||
export class VertFile {
|
export class VertFile {
|
||||||
public id: string = Math.random().toString(36).slice(2, 8);
|
public id: string = Math.random().toString(36).slice(2, 8);
|
||||||
public readonly file: File;
|
public readonly file: File;
|
||||||
|
|
@ -287,15 +289,48 @@ export class VertFile {
|
||||||
.replace(/%extension%/g, originalExtension);
|
.replace(/%extension%/g, originalExtension);
|
||||||
};
|
};
|
||||||
|
|
||||||
const blob = URL.createObjectURL(
|
const filename = `${format(filenameFormat)}${to}`;
|
||||||
new Blob([await this.result.file.arrayBuffer()], {
|
|
||||||
// type: to.slice(1),
|
// larger files (>2gb) requires cache API
|
||||||
type: "application/octet-stream", // use generic type to prevent browsers changing extension
|
// blob constructor can't use arraybuffer above 2gb
|
||||||
}),
|
const useCacheApi = this.result.file.size > MAX_BLOB_SIZE_LIMIT;
|
||||||
);
|
let blob: string;
|
||||||
|
|
||||||
|
if (useCacheApi) {
|
||||||
|
const cache = await caches.open("vert-downloads");
|
||||||
|
const cacheKey = `vert-download-${Date.now()}-${filename}`;
|
||||||
|
|
||||||
|
const response = new Response(this.result.file.stream(), {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/octet-stream",
|
||||||
|
"Content-Length": this.result.file.size.toString(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await cache.put(cacheKey, response);
|
||||||
|
|
||||||
|
const cachedResponse = await cache.match(cacheKey);
|
||||||
|
if (!cachedResponse)
|
||||||
|
throw new Error("Failed to cache file for download");
|
||||||
|
|
||||||
|
const cachedBlob = await cachedResponse.blob();
|
||||||
|
blob = URL.createObjectURL(cachedBlob);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
cache.delete(cacheKey);
|
||||||
|
}, 3000);
|
||||||
|
} else {
|
||||||
|
blob = URL.createObjectURL(
|
||||||
|
new Blob([await this.result.file.arrayBuffer()], {
|
||||||
|
type: "application/octet-stream",
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// download
|
||||||
const a = document.createElement("a");
|
const a = document.createElement("a");
|
||||||
a.href = blob;
|
a.href = blob;
|
||||||
a.download = `${format(filenameFormat)}${to}`;
|
a.download = filename;
|
||||||
// force it to not open in a new tab
|
// force it to not open in a new tab
|
||||||
a.target = "_blank";
|
a.target = "_blank";
|
||||||
a.style.display = "none";
|
a.style.display = "none";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue