From ea9b8b509a435172090295c19369a637df86d9be Mon Sep 17 00:00:00 2001 From: duskflower Date: Fri, 24 Jan 2025 17:40:16 +0100 Subject: [PATCH] perf: load database parallel to decrypting --- bun.lock | 84 +++++++++---------- package.json | 6 +- src/lib/{decryptor.ts => backup-decryptor.ts} | 10 +-- src/pages/home.tsx | 16 ++-- 4 files changed, 60 insertions(+), 56 deletions(-) rename src/lib/{decryptor.ts => backup-decryptor.ts} (80%) diff --git a/bun.lock b/bun.lock index 0591354..b31794b 100644 --- a/bun.lock +++ b/bun.lock @@ -4,49 +4,49 @@ "": { "name": "signalstats", "dependencies": { - "@duskflower/signal-decrypt-backup-wasm": "^0.2.1", - "@kobalte/core": "^0.13.7", - "@kobalte/tailwindcss": "^0.9.0", - "@solid-primitives/refs": "^1.1.0", - "@solid-primitives/storage": "^4.3.0", - "@solid-primitives/upload": "^0.1.0", - "@solid-primitives/workers": "^0.4.0", - "@solidjs/meta": "^0.29.4", - "@solidjs/router": "^0.15.3", - "@sqlite.org/sqlite-wasm": "3.48.0-build3", - "@tanstack/solid-table": "^8.20.5", - "@types/umami": "^2.10.0", - "chart.js": "^4.4.7", - "chartjs-chart-wordcloud": "^4.4.4", - "chartjs-plugin-deferred": "^2.0.0", - "chartjs-plugin-zoom": "^2.2.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "date-fns": "^4.1.0", - "kysely": "^0.27.5", - "kysely-wasm": "^0.7.0", - "lucide-solid": "^0.474.0", - "seroval": "^1.2.0", - "solid-js": "^1.9.4", - "tailwind-merge": "^2.6.0", - "tailwindcss-animate": "^1.0.7", - "zen-mitt": "^3.0.0", + "@duskflower/signal-decrypt-backup-wasm": "latest", + "@kobalte/core": "latest", + "@kobalte/tailwindcss": "latest", + "@solid-primitives/refs": "latest", + "@solid-primitives/storage": "latest", + "@solid-primitives/upload": "latest", + "@solid-primitives/workers": "latest", + "@solidjs/meta": "latest", + "@solidjs/router": "latest", + "@sqlite.org/sqlite-wasm": "latest", + "@tanstack/solid-table": "latest", + "@types/umami": "latest", + "chart.js": "latest", + "chartjs-chart-wordcloud": "latest", + "chartjs-plugin-deferred": "latest", + "chartjs-plugin-zoom": "latest", + "class-variance-authority": "latest", + "clsx": "latest", + "date-fns": "latest", + "kysely": "latest", + "kysely-wasm": "latest", + "lucide-solid": "latest", + "seroval": "latest", + "solid-js": "latest", + "tailwind-merge": "latest", + "tailwindcss-animate": "latest", + "zen-mitt": "latest", }, "devDependencies": { - "@biomejs/biome": "1.9.4", - "@commitlint/cli": "^19.6.1", - "@commitlint/config-conventional": "^19.6.0", - "@tailwindcss/vite": "^4.0.0", - "@types/node": "^22.10.9", - "better-sqlite3": "^11.8.1", - "husky": "^9.1.7", - "kysely-codegen": "^0.17.0", - "lint-staged": "^15.4.2", - "tailwindcss": "^4.0.0", - "typescript": "^5.7.3", - "vite": "^6.0.11", - "vite-plugin-solid": "^2.11.0", - "vite-plugin-wasm": "^3.4.1", + "@biomejs/biome": "latest", + "@commitlint/cli": "latest", + "@commitlint/config-conventional": "latest", + "@tailwindcss/vite": "latest", + "@types/node": "latest", + "better-sqlite3": "latest", + "husky": "latest", + "kysely-codegen": "latest", + "lint-staged": "latest", + "tailwindcss": "latest", + "typescript": "latest", + "vite": "latest", + "vite-plugin-solid": "latest", + "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=="], - "@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=="], diff --git a/package.json b/package.json index 64c8aaa..eac0529 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@commitlint/cli": "^19.6.1", "@commitlint/config-conventional": "^19.6.0", "@tailwindcss/vite": "^4.0.0", - "@types/node": "^22.10.9", + "@types/node": "^22.10.10", "better-sqlite3": "^11.8.1", "husky": "^9.1.7", "kysely-codegen": "^0.17.0", @@ -28,11 +28,11 @@ "vite-plugin-wasm": "^3.4.1" }, "dependencies": { - "@duskflower/signal-decrypt-backup-wasm": "^0.2.1", + "@duskflower/signal-decrypt-backup-wasm": "^0.3.0", "@kobalte/core": "^0.13.7", "@kobalte/tailwindcss": "^0.9.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/workers": "^0.4.0", "@solidjs/meta": "^0.29.4", diff --git a/src/lib/decryptor.ts b/src/lib/backup-decryptor.ts similarity index 80% rename from src/lib/decryptor.ts rename to src/lib/backup-decryptor.ts index 1ad2d8f..86c13e5 100644 --- a/src/lib/decryptor.ts +++ b/src/lib/backup-decryptor.ts @@ -1,7 +1,4 @@ -import { - BackupDecryptor, - type DecryptionResult, -} from "@duskflower/signal-decrypt-backup-wasm"; +import { BackupDecryptor } from "@duskflower/signal-decrypt-backup-wasm"; const CHUNK_SIZE = 1024 * 1024 * 40; // 40MB chunks @@ -9,7 +6,8 @@ export async function decryptBackup( file: File, passphrase: string, progressCallback: (progress: number) => void, -): Promise { + statementsCallback?: (statements: string[]) => void | Promise, +): Promise { const fileSize = file.size; const decryptor = new BackupDecryptor(); decryptor.set_progress_callback(fileSize, progressCallback); @@ -34,6 +32,8 @@ export async function decryptBackup( } } + await statementsCallback?.(decryptor.get_new_decrypted_statements()); + offset += CHUNK_SIZE; } diff --git a/src/pages/home.tsx b/src/pages/home.tsx index fa27c30..125426a 100644 --- a/src/pages/home.tsx +++ b/src/pages/home.tsx @@ -7,7 +7,7 @@ import { Flex } from "~/components/ui/flex"; import { Progress, ProgressLabel, ProgressValueLabel } from "~/components/ui/progress"; import { loadDb } from "~/db"; -import { decryptBackup } from "~/lib/decryptor"; +import { decryptBackup } from "~/lib/backup-decryptor"; import { createDropzone, createFileUploader } from "@solid-primitives/upload"; import { Button } from "~/components/ui/button"; import { TextField, TextFieldInput, TextFieldLabel } from "~/components/ui/text-field"; @@ -53,19 +53,23 @@ export const Home: Component = () => { // setDbHash(hash); - decryptBackup(currentBackupFile, currentPassphrase, setDecryptionProgress) - .then(async (decrypted) => { + console.time(); + decryptBackup(currentBackupFile, currentPassphrase, setDecryptionProgress, async (statements) => { + await loadDb(statements); + }) + .then(() => { umami.track("Decrypt backup"); setDecryptionProgress(undefined); // setIsLoadingDatabase(true); - setLoadingProgress(0); + // setLoadingProgress(0); - await loadDb(decrypted.database_statements, setLoadingProgress); + // await loadDb(decrypted.database_statements, setLoadingProgress); umami.track("Load database"); // setIsLoadingDatabase(false); - setLoadingProgress(undefined); + // setLoadingProgress(undefined); + console.timeEnd(); navigate("/overview"); }) .catch((error) => {