From b58bf8af6d4e60a8c551c009f63f996e8ce0bedf Mon Sep 17 00:00:00 2001 From: cupcakearmy Date: Sun, 13 Sep 2026 21:51:13 +0200 Subject: [PATCH] feat: move calculation intensive part into a web worker --- packages/frontend/package.json | 15 +- packages/frontend/src/lib/views/Create.svelte | 24 +- packages/frontend/src/lib/worker/index.ts | 14 ++ packages/frontend/src/lib/worker/worker.ts | 19 ++ .../src/routes/note/[id]/+page.svelte | 37 ++- pnpm-lock.yaml | 222 +++++++++--------- 6 files changed, 182 insertions(+), 149 deletions(-) create mode 100644 packages/frontend/src/lib/worker/index.ts create mode 100644 packages/frontend/src/lib/worker/worker.ts diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 94a7078..b60951b 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -13,21 +13,22 @@ "type": "module", "devDependencies": { "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.61.1", - "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@sveltejs/kit": "^2.70.3", + "@sveltejs/vite-plugin-svelte": "^7.3.0", "@zerodevx/svelte-toast": "^0.9.6", "license-checker-rseidelsohn": "^5.0.1", - "svelte": "^5.55.9", - "svelte-check": "^4.4.8", + "svelte": "^5.57.0", + "svelte-check": "^4.7.6", "svelte-intl-precompile": "^0.12.3", "tslib": "^2.8.1", "typescript": "^6.0.3", - "vite": "^8.0.14" + "vite": "^8.2.2" }, "dependencies": { "@cryptgeon/shared": "workspace:*", - "@fontsource/fira-mono": "^5.2.7", - "pretty-bytes": "^7.1.0", + "@fontsource/fira-mono": "^5.3.0", + "comlink": "^4.4.2", + "pretty-bytes": "^7.1.3", "uqr": "^0.1.3" } } diff --git a/packages/frontend/src/lib/views/Create.svelte b/packages/frontend/src/lib/views/Create.svelte index 5af4352..5eb4701 100644 --- a/packages/frontend/src/lib/views/Create.svelte +++ b/packages/frontend/src/lib/views/Create.svelte @@ -130,20 +130,16 @@ throw new EmptyContentError() } - const filesInput: NoteInput = { - type: 'files', - files: $state.snapshot(files), - } - - const payload = await worker.pack( - isFile - ? transfer( - filesInput, - filesInput.files.map((f) => f.data.buffer) - ) - : { type: 'text', text: textContent }, - customPassword || undefined - ) + const noteInput: NoteInput = isFile + ? transfer( + { + type: 'files', + files: $state.snapshot(files), + }, + files.map((f) => f.data.buffer) + ) + : { type: 'text', text: textContent } + const payload = await worker.pack(noteInput, customPassword || undefined) const serverNote: ServerNote = { meta: { ...(timeExpiration diff --git a/packages/frontend/src/lib/worker/index.ts b/packages/frontend/src/lib/worker/index.ts new file mode 100644 index 0000000..bf840f9 --- /dev/null +++ b/packages/frontend/src/lib/worker/index.ts @@ -0,0 +1,14 @@ +import { wrap } from 'comlink' + +import CryptWorker from './worker?worker' +import type { packContent, unpackContent } from '@cryptgeon/shared' + +export function createWorker() { + const worker = new CryptWorker() + return wrap(worker) +} + +export type WorkerConract = { + pack: typeof packContent + unpack: typeof unpackContent +} diff --git a/packages/frontend/src/lib/worker/worker.ts b/packages/frontend/src/lib/worker/worker.ts new file mode 100644 index 0000000..c19ec27 --- /dev/null +++ b/packages/frontend/src/lib/worker/worker.ts @@ -0,0 +1,19 @@ +import type { WorkerConract } from '$lib/worker' +import { packContent, unpackContent } from '@cryptgeon/shared' +import { expose, transfer } from 'comlink' + +const contract: WorkerConract = { + pack(input, password) { + const content = packContent(input, password) + return transfer(content, [content.data.buffer, content.extra.buffer, content.key.buffer]) + }, + unpack(data, key) { + const content = unpackContent(data, key) + return transfer( + content, + typeof content.data === 'string' ? [] : content.data.map((f) => f.data.buffer) + ) + }, +} + +expose(contract) diff --git a/packages/frontend/src/routes/note/[id]/+page.svelte b/packages/frontend/src/routes/note/[id]/+page.svelte index 2d56f3f..f9364da 100644 --- a/packages/frontend/src/routes/note/[id]/+page.svelte +++ b/packages/frontend/src/routes/note/[id]/+page.svelte @@ -1,5 +1,13 @@