perf: load database parallel to decrypting
This commit is contained in:
parent
e84e3c3f70
commit
ea9b8b509a
4 changed files with 60 additions and 56 deletions
84
bun.lock
84
bun.lock
|
@ -4,49 +4,49 @@
|
||||||
"": {
|
"": {
|
||||||
"name": "signalstats",
|
"name": "signalstats",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@duskflower/signal-decrypt-backup-wasm": "^0.2.1",
|
"@duskflower/signal-decrypt-backup-wasm": "latest",
|
||||||
"@kobalte/core": "^0.13.7",
|
"@kobalte/core": "latest",
|
||||||
"@kobalte/tailwindcss": "^0.9.0",
|
"@kobalte/tailwindcss": "latest",
|
||||||
"@solid-primitives/refs": "^1.1.0",
|
"@solid-primitives/refs": "latest",
|
||||||
"@solid-primitives/storage": "^4.3.0",
|
"@solid-primitives/storage": "latest",
|
||||||
"@solid-primitives/upload": "^0.1.0",
|
"@solid-primitives/upload": "latest",
|
||||||
"@solid-primitives/workers": "^0.4.0",
|
"@solid-primitives/workers": "latest",
|
||||||
"@solidjs/meta": "^0.29.4",
|
"@solidjs/meta": "latest",
|
||||||
"@solidjs/router": "^0.15.3",
|
"@solidjs/router": "latest",
|
||||||
"@sqlite.org/sqlite-wasm": "3.48.0-build3",
|
"@sqlite.org/sqlite-wasm": "latest",
|
||||||
"@tanstack/solid-table": "^8.20.5",
|
"@tanstack/solid-table": "latest",
|
||||||
"@types/umami": "^2.10.0",
|
"@types/umami": "latest",
|
||||||
"chart.js": "^4.4.7",
|
"chart.js": "latest",
|
||||||
"chartjs-chart-wordcloud": "^4.4.4",
|
"chartjs-chart-wordcloud": "latest",
|
||||||
"chartjs-plugin-deferred": "^2.0.0",
|
"chartjs-plugin-deferred": "latest",
|
||||||
"chartjs-plugin-zoom": "^2.2.0",
|
"chartjs-plugin-zoom": "latest",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "latest",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "latest",
|
||||||
"date-fns": "^4.1.0",
|
"date-fns": "latest",
|
||||||
"kysely": "^0.27.5",
|
"kysely": "latest",
|
||||||
"kysely-wasm": "^0.7.0",
|
"kysely-wasm": "latest",
|
||||||
"lucide-solid": "^0.474.0",
|
"lucide-solid": "latest",
|
||||||
"seroval": "^1.2.0",
|
"seroval": "latest",
|
||||||
"solid-js": "^1.9.4",
|
"solid-js": "latest",
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "latest",
|
||||||
"tailwindcss-animate": "^1.0.7",
|
"tailwindcss-animate": "latest",
|
||||||
"zen-mitt": "^3.0.0",
|
"zen-mitt": "latest",
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "1.9.4",
|
"@biomejs/biome": "latest",
|
||||||
"@commitlint/cli": "^19.6.1",
|
"@commitlint/cli": "latest",
|
||||||
"@commitlint/config-conventional": "^19.6.0",
|
"@commitlint/config-conventional": "latest",
|
||||||
"@tailwindcss/vite": "^4.0.0",
|
"@tailwindcss/vite": "latest",
|
||||||
"@types/node": "^22.10.9",
|
"@types/node": "latest",
|
||||||
"better-sqlite3": "^11.8.1",
|
"better-sqlite3": "latest",
|
||||||
"husky": "^9.1.7",
|
"husky": "latest",
|
||||||
"kysely-codegen": "^0.17.0",
|
"kysely-codegen": "latest",
|
||||||
"lint-staged": "^15.4.2",
|
"lint-staged": "latest",
|
||||||
"tailwindcss": "^4.0.0",
|
"tailwindcss": "latest",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "latest",
|
||||||
"vite": "^6.0.11",
|
"vite": "latest",
|
||||||
"vite-plugin-solid": "^2.11.0",
|
"vite-plugin-solid": "latest",
|
||||||
"vite-plugin-wasm": "^3.4.1",
|
"vite-plugin-wasm": "latest",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -141,7 +141,7 @@
|
||||||
|
|
||||||
"@corvu/utils": ["@corvu/utils@0.4.2", "", { "dependencies": { "@floating-ui/dom": "^1.6.11" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA=="],
|
"@corvu/utils": ["@corvu/utils@0.4.2", "", { "dependencies": { "@floating-ui/dom": "^1.6.11" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA=="],
|
||||||
|
|
||||||
"@duskflower/signal-decrypt-backup-wasm": ["@duskflower/signal-decrypt-backup-wasm@0.2.1", "https://git.duskflower.dev/api/packages/duskflower/npm/%40duskflower%2Fsignal-decrypt-backup-wasm/-/0.2.1/signal-decrypt-backup-wasm-0.2.1.tgz", {}, "sha512-lYwtubVOUU4kuJNw28Ns8N9Gh2nZB4j6BJz/vLpxF0Vc7zww3VIGnMCQToFWWSAwCs5+cABadeZMkv87SGfyQg=="],
|
"@duskflower/signal-decrypt-backup-wasm": ["@duskflower/signal-decrypt-backup-wasm@0.3.0", "https://git.duskflower.dev/api/packages/duskflower/npm/%40duskflower%2Fsignal-decrypt-backup-wasm/-/0.3.0/signal-decrypt-backup-wasm-0.3.0.tgz", {}, "sha512-1IMNFGz4bV4o29eXVelNbancqovsljmM0iZRrtau81gSy8bFE1lgwGFN05NAOFWlX/aZYzeUEeZVBrjUYIM0/w=="],
|
||||||
|
|
||||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="],
|
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="],
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
"@commitlint/cli": "^19.6.1",
|
"@commitlint/cli": "^19.6.1",
|
||||||
"@commitlint/config-conventional": "^19.6.0",
|
"@commitlint/config-conventional": "^19.6.0",
|
||||||
"@tailwindcss/vite": "^4.0.0",
|
"@tailwindcss/vite": "^4.0.0",
|
||||||
"@types/node": "^22.10.9",
|
"@types/node": "^22.10.10",
|
||||||
"better-sqlite3": "^11.8.1",
|
"better-sqlite3": "^11.8.1",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"kysely-codegen": "^0.17.0",
|
"kysely-codegen": "^0.17.0",
|
||||||
|
@ -28,11 +28,11 @@
|
||||||
"vite-plugin-wasm": "^3.4.1"
|
"vite-plugin-wasm": "^3.4.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@duskflower/signal-decrypt-backup-wasm": "^0.2.1",
|
"@duskflower/signal-decrypt-backup-wasm": "^0.3.0",
|
||||||
"@kobalte/core": "^0.13.7",
|
"@kobalte/core": "^0.13.7",
|
||||||
"@kobalte/tailwindcss": "^0.9.0",
|
"@kobalte/tailwindcss": "^0.9.0",
|
||||||
"@solid-primitives/refs": "^1.1.0",
|
"@solid-primitives/refs": "^1.1.0",
|
||||||
"@solid-primitives/storage": "^4.3.0",
|
"@solid-primitives/storage": "^4.3.1",
|
||||||
"@solid-primitives/upload": "^0.1.0",
|
"@solid-primitives/upload": "^0.1.0",
|
||||||
"@solid-primitives/workers": "^0.4.0",
|
"@solid-primitives/workers": "^0.4.0",
|
||||||
"@solidjs/meta": "^0.29.4",
|
"@solidjs/meta": "^0.29.4",
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
import {
|
import { BackupDecryptor } from "@duskflower/signal-decrypt-backup-wasm";
|
||||||
BackupDecryptor,
|
|
||||||
type DecryptionResult,
|
|
||||||
} from "@duskflower/signal-decrypt-backup-wasm";
|
|
||||||
|
|
||||||
const CHUNK_SIZE = 1024 * 1024 * 40; // 40MB chunks
|
const CHUNK_SIZE = 1024 * 1024 * 40; // 40MB chunks
|
||||||
|
|
||||||
|
@ -9,7 +6,8 @@ export async function decryptBackup(
|
||||||
file: File,
|
file: File,
|
||||||
passphrase: string,
|
passphrase: string,
|
||||||
progressCallback: (progress: number) => void,
|
progressCallback: (progress: number) => void,
|
||||||
): Promise<DecryptionResult> {
|
statementsCallback?: (statements: string[]) => void | Promise<void>,
|
||||||
|
): Promise<string[]> {
|
||||||
const fileSize = file.size;
|
const fileSize = file.size;
|
||||||
const decryptor = new BackupDecryptor();
|
const decryptor = new BackupDecryptor();
|
||||||
decryptor.set_progress_callback(fileSize, progressCallback);
|
decryptor.set_progress_callback(fileSize, progressCallback);
|
||||||
|
@ -34,6 +32,8 @@ export async function decryptBackup(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await statementsCallback?.(decryptor.get_new_decrypted_statements());
|
||||||
|
|
||||||
offset += CHUNK_SIZE;
|
offset += CHUNK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import { Flex } from "~/components/ui/flex";
|
||||||
|
|
||||||
import { Progress, ProgressLabel, ProgressValueLabel } from "~/components/ui/progress";
|
import { Progress, ProgressLabel, ProgressValueLabel } from "~/components/ui/progress";
|
||||||
import { loadDb } from "~/db";
|
import { loadDb } from "~/db";
|
||||||
import { decryptBackup } from "~/lib/decryptor";
|
import { decryptBackup } from "~/lib/backup-decryptor";
|
||||||
import { createDropzone, createFileUploader } from "@solid-primitives/upload";
|
import { createDropzone, createFileUploader } from "@solid-primitives/upload";
|
||||||
import { Button } from "~/components/ui/button";
|
import { Button } from "~/components/ui/button";
|
||||||
import { TextField, TextFieldInput, TextFieldLabel } from "~/components/ui/text-field";
|
import { TextField, TextFieldInput, TextFieldLabel } from "~/components/ui/text-field";
|
||||||
|
@ -53,19 +53,23 @@ export const Home: Component<RouteSectionProps> = () => {
|
||||||
|
|
||||||
// setDbHash(hash);
|
// setDbHash(hash);
|
||||||
|
|
||||||
decryptBackup(currentBackupFile, currentPassphrase, setDecryptionProgress)
|
console.time();
|
||||||
.then(async (decrypted) => {
|
decryptBackup(currentBackupFile, currentPassphrase, setDecryptionProgress, async (statements) => {
|
||||||
|
await loadDb(statements);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
umami.track("Decrypt backup");
|
umami.track("Decrypt backup");
|
||||||
setDecryptionProgress(undefined);
|
setDecryptionProgress(undefined);
|
||||||
// setIsLoadingDatabase(true);
|
// setIsLoadingDatabase(true);
|
||||||
setLoadingProgress(0);
|
// setLoadingProgress(0);
|
||||||
|
|
||||||
await loadDb(decrypted.database_statements, setLoadingProgress);
|
// await loadDb(decrypted.database_statements, setLoadingProgress);
|
||||||
umami.track("Load database");
|
umami.track("Load database");
|
||||||
|
|
||||||
// setIsLoadingDatabase(false);
|
// setIsLoadingDatabase(false);
|
||||||
setLoadingProgress(undefined);
|
// setLoadingProgress(undefined);
|
||||||
|
|
||||||
|
console.timeEnd();
|
||||||
navigate("/overview");
|
navigate("/overview");
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue