mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-25 16:00:07 +00:00
* docs: design query result run tabs * feat(query): add result run model helpers * feat(query): persist result run metadata * feat(query): record switchable result runs * feat(query): sync active result run state * feat(query): cache result run payloads * feat(query): render result run tabs * docs: design query result archives * feat(query): add result archive codec * feat(query): restore result archives * feat(query): add result archive actions * fix(query): toggle execution summary view * fix(query): avoid archive compression backpressure * feat(query): remove result runs * chore: remove local spec docs from pr
63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { isTauriRuntime } from "@/lib/tauriRuntime";
|
|
|
|
const ARCHIVE_MIME_TYPE = "application/vnd.dbx.results";
|
|
const ARCHIVE_EXTENSIONS = ["dbxresults"];
|
|
|
|
function downloadArchiveFile(fileName: string, bytes: Uint8Array): string {
|
|
const blob = new Blob([bytes.slice().buffer], { type: ARCHIVE_MIME_TYPE });
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement("a");
|
|
a.href = url;
|
|
a.download = fileName;
|
|
a.click();
|
|
URL.revokeObjectURL(url);
|
|
return fileName;
|
|
}
|
|
|
|
function openArchiveFileInBrowser(): Promise<Uint8Array | undefined> {
|
|
return new Promise((resolve, reject) => {
|
|
const input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".dbxresults,application/octet-stream,application/vnd.dbx.results";
|
|
input.onchange = async () => {
|
|
try {
|
|
const file = input.files?.[0];
|
|
if (!file) {
|
|
resolve(undefined);
|
|
return;
|
|
}
|
|
resolve(new Uint8Array(await file.arrayBuffer()));
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
};
|
|
input.click();
|
|
});
|
|
}
|
|
|
|
export async function saveQueryResultArchiveFile(fileName: string, bytes: Uint8Array): Promise<string | undefined> {
|
|
if (!isTauriRuntime()) return downloadArchiveFile(fileName, bytes);
|
|
|
|
const [{ save }, { writeFile }] = await Promise.all([import("@tauri-apps/plugin-dialog"), import("@tauri-apps/plugin-fs")]);
|
|
const path = await save({
|
|
defaultPath: fileName,
|
|
filters: [{ name: "DBX Result Archive", extensions: ARCHIVE_EXTENSIONS }],
|
|
});
|
|
if (!path) return undefined;
|
|
await writeFile(path, bytes);
|
|
return path;
|
|
}
|
|
|
|
export async function openQueryResultArchiveFile(): Promise<Uint8Array | undefined> {
|
|
if (!isTauriRuntime()) return openArchiveFileInBrowser();
|
|
|
|
const [{ open }, { readFile }] = await Promise.all([import("@tauri-apps/plugin-dialog"), import("@tauri-apps/plugin-fs")]);
|
|
const selected = await open({
|
|
multiple: false,
|
|
filters: [{ name: "DBX Result Archive", extensions: ARCHIVE_EXTENSIONS }],
|
|
});
|
|
const path = Array.isArray(selected) ? selected[0] : selected;
|
|
if (!path) return undefined;
|
|
return readFile(path);
|
|
}
|