From 4edf12f5c12e42144e7d7d30dcd499a2f40dfca3 Mon Sep 17 00:00:00 2001 From: not-nullptr Date: Mon, 11 Nov 2024 14:26:55 +0000 Subject: [PATCH] hawk tuah! Co-authored-by: RealmyTheMan --- bun.lockb | Bin 117831 -> 118187 bytes package.json | 3 ++- src/app.html | 1 - src/lib/components/visual/Uploader.svelte | 4 ++++ src/lib/converters/converter.ts | 9 ++++++++ src/lib/converters/index.svelte.ts | 15 ++++++++++++++ src/lib/converters/vips.ts | 9 ++++++++ src/lib/index.ts | 1 - src/lib/types/file.ts | 5 +++++ src/lib/types/index.ts | 1 + src/lib/workers/vips.ts | 9 ++++++++ src/routes/+layout.svelte | 3 ++- src/routes/+layout.ts | 13 ++++++++---- src/routes/+page.svelte | 11 ++++++++++ src/routes/util/magick.ts | 14 ------------- vite.config.ts | 24 +++++++++++++++++++--- 16 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 src/lib/components/visual/Uploader.svelte create mode 100644 src/lib/converters/converter.ts create mode 100644 src/lib/converters/index.svelte.ts create mode 100644 src/lib/converters/vips.ts delete mode 100644 src/lib/index.ts create mode 100644 src/lib/types/file.ts create mode 100644 src/lib/types/index.ts create mode 100644 src/lib/workers/vips.ts delete mode 100644 src/routes/util/magick.ts diff --git a/bun.lockb b/bun.lockb index 1d2ea1025eef770f92cf89170aaf94d69a0fb8dd..6677402625267bed6af7bfd8b0b20136b47d32e8 100644 GIT binary patch delta 20235 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 diff --git a/package.json b/package.json index 0588ad5..48043ae 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@imagemagick/magick-wasm": "^0.0.31", - "lucide-svelte": "^0.456.0" + "lucide-svelte": "^0.456.0", + "wasm-vips": "^0.0.11" } } diff --git a/src/app.html b/src/app.html index d086c20..77a5ff5 100644 --- a/src/app.html +++ b/src/app.html @@ -4,7 +4,6 @@ - %sveltekit.head% diff --git a/src/lib/components/visual/Uploader.svelte b/src/lib/components/visual/Uploader.svelte new file mode 100644 index 0000000..3d56ad2 --- /dev/null +++ b/src/lib/components/visual/Uploader.svelte @@ -0,0 +1,4 @@ + + + diff --git a/src/lib/converters/converter.ts b/src/lib/converters/converter.ts new file mode 100644 index 0000000..237db11 --- /dev/null +++ b/src/lib/converters/converter.ts @@ -0,0 +1,9 @@ +import type { IFile } from "$lib/types"; + +export class Converter { + public supportedFormats: string[] = []; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public async convert(input: IFile, output: IFile): Promise { + throw new Error("Not implemented"); + } +} diff --git a/src/lib/converters/index.svelte.ts b/src/lib/converters/index.svelte.ts new file mode 100644 index 0000000..f593609 --- /dev/null +++ b/src/lib/converters/index.svelte.ts @@ -0,0 +1,15 @@ +import Vips from "wasm-vips"; + +class Converters { + public vips = $state(null!); + public loaded = $derived(this.vips !== null); +} + +export const converters = new Converters(); + +// Vips().then((vips) => { +// converters.vips = vips; +// }); + +// the above *does* work but it blocks the ui thread whilst wasm is loading +// we can use a web worker to remedy this, see +layout.ts for details diff --git a/src/lib/converters/vips.ts b/src/lib/converters/vips.ts new file mode 100644 index 0000000..1a46ee2 --- /dev/null +++ b/src/lib/converters/vips.ts @@ -0,0 +1,9 @@ +import type { IFile } from "$lib/types"; +import { Converter } from "./converter"; + +export class VipsConverter extends Converter { + public supportedFormats = [""]; + public convert(input: IFile, output: IFile): Promise { + throw new Error("Not implemented"); + } +} diff --git a/src/lib/index.ts b/src/lib/index.ts deleted file mode 100644 index 856f2b6..0000000 --- a/src/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -// place files you want to import through the `$lib` alias in this folder. diff --git a/src/lib/types/file.ts b/src/lib/types/file.ts new file mode 100644 index 0000000..fe42fc0 --- /dev/null +++ b/src/lib/types/file.ts @@ -0,0 +1,5 @@ +export interface IFile { + name: string; + extension: string; + buffer: ArrayBuffer; +} diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts new file mode 100644 index 0000000..375123f --- /dev/null +++ b/src/lib/types/index.ts @@ -0,0 +1 @@ +export * from "./file"; diff --git a/src/lib/workers/vips.ts b/src/lib/workers/vips.ts new file mode 100644 index 0000000..8e76e12 --- /dev/null +++ b/src/lib/workers/vips.ts @@ -0,0 +1,9 @@ +import Vips from "wasm-vips"; + +Vips() + .then((vips) => { + postMessage({ type: "success", vips }); + }) + .catch((error) => { + postMessage({ type: "error", error }); + }); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 7be3ce4..fe4774e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,6 +1,7 @@ -{@render children()} +{@render children()} \ No newline at end of file diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 25a8fed..b10c57d 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -1,5 +1,10 @@ -import { init } from "./util/magick"; +import { browser } from "$app/environment"; +import VipsWorker from "$lib/workers/vips?worker"; -export async function load({ fetch }) { - await init(fetch); -} +export const load = () => { + if (!browser) return; + const worker = new VipsWorker(); + worker.onmessage = (e) => { + console.log(e.data); + }; +}; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e69de29..c8bb4bc 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -0,0 +1,11 @@ + + + diff --git a/src/routes/util/magick.ts b/src/routes/util/magick.ts deleted file mode 100644 index c2a4b39..0000000 --- a/src/routes/util/magick.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { initializeImageMagick } from "@imagemagick/magick-wasm"; - -export let initialized = false; - -export const init = async ( - fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise, -) => { - if (initialized) return; - const wasmBytes = await fetch("/magick.wasm").then((res) => - res.arrayBuffer(), - ); - await initializeImageMagick(wasmBytes); - initialized = true; -}; diff --git a/vite.config.ts b/vite.config.ts index bbf8c7d..cfe6112 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,24 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; +import { sveltekit } from "@sveltejs/kit/vite"; +import { defineConfig } from "vite"; export default defineConfig({ - plugins: [sveltekit()] + plugins: [ + sveltekit(), + { + name: "vips-request-middleware", + configureServer(server) { + server.middlewares.use((req, res, next) => { + res.setHeader( + "Cross-Origin-Embedder-Policy", + "require-corp", + ); + res.setHeader("Cross-Origin-Opener-Policy", "same-origin"); + next(); + }); + }, + }, + ], + optimizeDeps: { + exclude: ["wasm-vips"], + }, });