From fb42680b4072cb91a53c443fa2705d1fd5fba01e Mon Sep 17 00:00:00 2001 From: not-nullptr <62841684+not-nullptr@users.noreply.github.com> Date: Thu, 20 Mar 2025 15:36:50 +0000 Subject: [PATCH] feat: limit concurrency --- bun.lock | 7 +++++++ package.json | 1 + src/lib/components/functional/ConversionPanel.svelte | 7 +++---- src/lib/converters/vips.svelte.ts | 3 --- src/lib/store/index.svelte.ts | 6 +++++- src/lib/workers/vips.ts | 2 +- src/routes/convert/+page.svelte | 5 ++++- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/bun.lock b/bun.lock index c5265ba..d613a35 100644 --- a/bun.lock +++ b/bun.lock @@ -14,6 +14,7 @@ "clsx": "^2.1.1", "lucide-svelte": "^0.475.0", "music-metadata": "^11.0.0", + "p-queue": "^8.1.0", "vite-plugin-static-copy": "^2.2.0", "wasm-vips": "^0.0.11", }, @@ -400,6 +401,8 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], @@ -568,6 +571,10 @@ "p-map": ["p-map@7.0.3", "", {}, "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA=="], + "p-queue": ["p-queue@8.1.0", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw=="], + + "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], diff --git a/package.json b/package.json index 5da535d..5b32c2b 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "clsx": "^2.1.1", "lucide-svelte": "^0.475.0", "music-metadata": "^11.0.0", + "p-queue": "^8.1.0", "vite-plugin-static-copy": "^2.2.0", "wasm-vips": "^0.0.11" } diff --git a/src/lib/components/functional/ConversionPanel.svelte b/src/lib/components/functional/ConversionPanel.svelte index 767021f..173cfc3 100644 --- a/src/lib/components/functional/ConversionPanel.svelte +++ b/src/lib/components/functional/ConversionPanel.svelte @@ -58,10 +58,9 @@

Set all to

{#if files.requiredConverters.length === 1} - {@const supported = - files.files[0]?.converter?.supportedFormats?.filter( - (format) => format !== ".svg" && format !== ".heif", - )} + {@const supported = files.files[0]?.converters + .flatMap((c) => c.supportedFormats) + ?.filter((format) => format !== ".svg" && format !== ".heif")} files.files.forEach((f) => { diff --git a/src/lib/converters/vips.svelte.ts b/src/lib/converters/vips.svelte.ts index 47af61e..b7744a9 100644 --- a/src/lib/converters/vips.svelte.ts +++ b/src/lib/converters/vips.svelte.ts @@ -33,10 +33,7 @@ export class VipsConverter extends Converter { ".tif", ".tiff", ".jfif", - ".heif", // HEIF files that are encoded like HEIC files (and HEIC files in general) aren't supported due to https://github.com/kleisauke/wasm-vips/issues/3 ".avif", - ".jxl", - ".svg", ]; public readonly reportsProgress = false; diff --git a/src/lib/store/index.svelte.ts b/src/lib/store/index.svelte.ts index 67682f5..aa64a95 100644 --- a/src/lib/store/index.svelte.ts +++ b/src/lib/store/index.svelte.ts @@ -4,6 +4,7 @@ import { VertFile } from "$lib/types"; import { parseBlob, selectCover } from "music-metadata"; import { writable } from "svelte/store"; import { addDialog } from "./DialogProvider"; +import PQueue from "p-queue"; class Files { public files = $state([]); @@ -195,7 +196,10 @@ class Files { } public async convertAll() { - await Promise.all(this.files.map((f) => f.convert())); + const promiseFns = this.files.map((f) => () => f.convert()); + const coreCount = navigator.hardwareConcurrency || 4; + const queue = new PQueue({ concurrency: coreCount }); + await Promise.all(promiseFns.map((fn) => queue.add(fn))); } public async downloadAll() { diff --git a/src/lib/workers/vips.ts b/src/lib/workers/vips.ts index d0d8e8c..456d103 100644 --- a/src/lib/workers/vips.ts +++ b/src/lib/workers/vips.ts @@ -1,7 +1,7 @@ import Vips from "wasm-vips"; const vipsPromise = Vips({ - dynamicLibraries: ["vips-jxl.wasm", "vips-heif.wasm", "vips-resvg.wasm"], + dynamicLibraries: [], }); vipsPromise diff --git a/src/routes/convert/+page.svelte b/src/routes/convert/+page.svelte index c97dc04..d7f9dcb 100644 --- a/src/routes/convert/+page.svelte +++ b/src/routes/convert/+page.svelte @@ -85,6 +85,9 @@ {@const isVideo = converters .find((c) => c.name === "vertd") ?.supportedFormats.includes(file.from)} + {@const isImage = converters + .find((c) => c.name === "libvips") + ?.supportedFormats.includes(file.from)}
{#if !converters.length} @@ -146,7 +149,7 @@

{/if} - {:else if isVideo && !$vertdLoaded} + {:else if isVideo && !isAudio && !isImage && !$vertdLoaded}