From 13d465c1c45e649a702457d67476694aeb553704 Mon Sep 17 00:00:00 2001 From: Matt Strapp Date: Wed, 27 Sep 2023 16:16:10 -0500 Subject: Get rid of crc32, truncate instead Signed-off-by: Matt Strapp --- app/package.json | 1 + app/src/lib/svelte/Navigation.svelte | 2 +- app/src/lib/ts/crc32.worker.ts | 10 ----- app/src/lib/ts/download.ts | 33 ++++++++++++++++ app/src/lib/ts/truncate.worker.ts | 10 +++++ app/src/lib/types/truncate-worker.ts | 8 ++++ app/src/routes/crc32/+page.svelte | 55 -------------------------- app/src/routes/truncate/+page.svelte | 75 ++++++++++++++++++++++++++++++++++++ app/tsconfig.json | 2 +- 9 files changed, 129 insertions(+), 67 deletions(-) delete mode 100644 app/src/lib/ts/crc32.worker.ts create mode 100644 app/src/lib/ts/download.ts create mode 100644 app/src/lib/ts/truncate.worker.ts create mode 100644 app/src/lib/types/truncate-worker.ts delete mode 100644 app/src/routes/crc32/+page.svelte create mode 100644 app/src/routes/truncate/+page.svelte (limited to 'app') diff --git a/app/package.json b/app/package.json index dce4f60..2905c41 100644 --- a/app/package.json +++ b/app/package.json @@ -14,6 +14,7 @@ "@tailwindcss/typography": "0.5.10", "@types/html-minifier-terser": "^7.0.0", "@types/node": "20.6.0", + "@types/wicg-file-system-access": "^2020.9.8", "@typescript-eslint/eslint-plugin": "^6.7.3", "@typescript-eslint/parser": "^6.7.3", "@vite-pwa/sveltekit": "^0.2.7", diff --git a/app/src/lib/svelte/Navigation.svelte b/app/src/lib/svelte/Navigation.svelte index 20c7d8b..fd3c914 100644 --- a/app/src/lib/svelte/Navigation.svelte +++ b/app/src/lib/svelte/Navigation.svelte @@ -7,5 +7,5 @@ Home! - CRC32 + Truncate! diff --git a/app/src/lib/ts/crc32.worker.ts b/app/src/lib/ts/crc32.worker.ts deleted file mode 100644 index 57c1bc9..0000000 --- a/app/src/lib/ts/crc32.worker.ts +++ /dev/null @@ -1,10 +0,0 @@ -// TODO: Think about using a WebAssembly implementation of CRC32 instead of JavaScript. -// WHY? The JavaScript implementation is not very extensible and is not very fast. -import crc32 from 'crc/crc32'; - -onmessage = async (message: MessageEvent) => { - const file = message.data; - const buffer = await file.arrayBuffer(); - const crc = crc32(buffer); - postMessage(crc); -}; diff --git a/app/src/lib/ts/download.ts b/app/src/lib/ts/download.ts new file mode 100644 index 0000000..a6167d7 --- /dev/null +++ b/app/src/lib/ts/download.ts @@ -0,0 +1,33 @@ +// Yoinked from https://web.dev/patterns/files/save-a-file/ for the polyfill + +export default async function saveFile(blob: ArrayBuffer, suggestedName: string | undefined) { + const supportsFSAccess = 'showSaveFilePicker' in window && + (() => { + try { + return window.self === window.top; + } catch { + return false; + } + })(); + + if (supportsFSAccess) { + try { + const handle = await window.showSaveFilePicker({ + suggestedName: suggestedName, + }) + const writable = await handle.createWritable(); + await writable.write(blob); + await writable.close(); + } catch (err: unknown) { + // TypeScript + if ((err as Error)?.name !== 'AbortError') { + console.error(err); + } + } + } else { + const anchor = document.createElement('a'); + anchor.download = suggestedName ?? 'truncated'; + anchor.href = URL.createObjectURL(new Blob([blob])); + anchor.click(); + } +} \ No newline at end of file diff --git a/app/src/lib/ts/truncate.worker.ts b/app/src/lib/ts/truncate.worker.ts new file mode 100644 index 0000000..52eebb7 --- /dev/null +++ b/app/src/lib/ts/truncate.worker.ts @@ -0,0 +1,10 @@ +import type { TruncateRequest, TruncateResponse } from '../types/truncate-worker'; + + +onmessage = async (message: MessageEvent) => { + const file = message.data.file; + const buffer = await file.arrayBuffer(); + const truncated = buffer.slice(0, message.data.size); + + postMessage({ file: truncated } as TruncateResponse); +} \ No newline at end of file diff --git a/app/src/lib/types/truncate-worker.ts b/app/src/lib/types/truncate-worker.ts new file mode 100644 index 0000000..9b1872f --- /dev/null +++ b/app/src/lib/types/truncate-worker.ts @@ -0,0 +1,8 @@ +export type TruncateRequest = { + file: File, + size: number, +}; + +export type TruncateResponse = { + file: ArrayBuffer, +}; diff --git a/app/src/routes/crc32/+page.svelte b/app/src/routes/crc32/+page.svelte deleted file mode 100644 index b88e52e..0000000 --- a/app/src/routes/crc32/+page.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - - - CRC32 - - -
-
-
- form.requestSubmit()} - required - disabled={disableInput} - > - -

Drop a file here to get its CRC32 checksum.

-
-
-
- - {#if disableInput} -

Calculating the checksum, this may take time!


- - {/if} - -
-
diff --git a/app/src/routes/truncate/+page.svelte b/app/src/routes/truncate/+page.svelte new file mode 100644 index 0000000..9e2545f --- /dev/null +++ b/app/src/routes/truncate/+page.svelte @@ -0,0 +1,75 @@ + + + + Truncate + + +
+
+
+ +
+ +
+ + {#if disableInput} +

Truncating the file, this may take time!

+
+ + {/if} + +
+
diff --git a/app/tsconfig.json b/app/tsconfig.json index a25e61a..8cac8a3 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -9,7 +9,7 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "types": ["vite-plugin-pwa/client"] + "types": ["vite-plugin-pwa/client", "@types/wicg-file-system-access"] } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // -- cgit v1.2.3