perf: use lzma-wasm for SWF decompression and drop vite

Replace the pure-JS lzma decoder with lzma-wasm (Rust/WASM, base64-inlined,
zero-alloc decompress), giving an order-of-magnitude speedup on furni
imports. Remove the obsolete lzma type shim and the redundant top-level
vite dev dependency, which nothing imports directly.
This commit is contained in:
openhands committed 2026-08-29 19:27:27 +02:00
1 parent 7a41775c7e
commit ca59a1065f
6 files changed
+19 -31

No files matched your search

+1 -1
View File
@@ -32,7 +32,7 @@ const nextConfig: NextConfig = {
reactStrictMode: true, reactStrictMode: true,
compress: true, compress: true,
productionBrowserSourceMaps: false, productionBrowserSourceMaps: false,
serverExternalPackages: ["lzma", "sharp", "pino", "pino-pretty"], serverExternalPackages: ["lzma-wasm", "sharp", "pino", "pino-pretty"],
async redirects() { async redirects() {
return [ return [
+1 -2
View File
@@ -48,7 +48,7 @@
"jszip": "3.10.1", "jszip": "3.10.1",
"lenis": "1.3.26", "lenis": "1.3.26",
"lucide-react": "1.33.0", "lucide-react": "1.33.0",
"lzma": "^2.3.2", "lzma-wasm": "1.0.7",
"motion": "13.1.1", "motion": "13.1.1",
"music-metadata": "11.15.0", "music-metadata": "11.15.0",
"mysql2": "3.23.4", "mysql2": "3.23.4",
@@ -85,7 +85,6 @@
"tailwindcss": "4.3.3", "tailwindcss": "4.3.3",
"tsx": "4.23.12", "tsx": "4.23.12",
"typescript": "7.0.2", "typescript": "7.0.2",
"vite": "8.2.2",
"vitest": "4.1.11" "vitest": "4.1.11"
} }
} }
+7 -10
View File
@@ -79,9 +79,9 @@ importers:
lucide-react: lucide-react:
specifier: 1.33.0 specifier: 1.33.0
version: 1.33.0([email protected]) version: 1.33.0([email protected])
lzma: lzma-wasm:
specifier: ^2.3.2 specifier: 1.0.7
version: 2.3.2 version: 1.0.7
motion: motion:
specifier: 13.1.1 specifier: 13.1.1
version: 13.1.1([email protected]([email protected]))([email protected]) version: 13.1.1([email protected]([email protected]))([email protected])
@@ -185,9 +185,6 @@ importers:
typescript: typescript:
specifier: 7.0.2 specifier: 7.0.2
version: 7.0.2 version: 7.0.2
vite:
specifier: 8.2.2
version: 8.2.2(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
vitest: vitest:
specifier: 4.1.11 specifier: 4.1.11
version: 4.1.11(@types/[email protected])(@vitest/[email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])) version: 4.1.11(@types/[email protected])(@vitest/[email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
@@ -2450,9 +2447,9 @@ packages:
peerDependencies: peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
lzma@2.3.2: lzma[email protected]:
resolution: {integrity: sha512-DcfiawQ1avYbW+hsILhF38IKAlnguc/fjHrychs9hdxe4qLykvhT5VTGNs5YRWgaNePh7NTxGD4uv4gKsRomCQ==} resolution: {integrity: sha512-/fm+kRC7MqF9aCAWU5GwmgWllzM7ehC46aB5Va7V1PAnUl0qSU8ZA2XWk8yOgZbkgL6MWLDyYIVJR+UQziwvUA==}
hasBin: true engines: {node: '>=16.0.0'}
[email protected]: [email protected]:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
@@ -4593,7 +4590,7 @@ snapshots:
dependencies: dependencies:
react: 19.2.8 react: 19.2.8
lzma@2.3.2: {} lzma[email protected]: {}
[email protected]: [email protected]:
dependencies: dependencies:
+5 -2
View File
@@ -1,5 +1,5 @@
import { deflateSync } from "node:zlib"; import { deflateSync } from "node:zlib";
import LZMA from "lzma"; import { initWasmSync, compress as lzmaCompress } from "lzma-wasm";
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { import {
decompressSwf, decompressSwf,
@@ -33,7 +33,10 @@ function cwsFixture(payload: Buffer, version = 6): Buffer {
} }
function zwsFixture(payload: Buffer, version = 6): Buffer { function zwsFixture(payload: Buffer, version = 6): Buffer {
const rawLzma = LZMA.compress(payload, 9); initWasmSync();
const rawLzma = Buffer.from(
lzmaCompress(payload, { format: "lzma", level: 9 }),
);
const props = Buffer.from(rawLzma.slice(0, 5)); const props = Buffer.from(rawLzma.slice(0, 5));
const compressedPayload = Buffer.from(rawLzma.slice(13)); const compressedPayload = Buffer.from(rawLzma.slice(13));
const compressedSize = 5 + compressedPayload.length; const compressedSize = 5 + compressedPayload.length;
+5 -2
View File
@@ -3,8 +3,9 @@
*/ */
import { inflateSync } from "node:zlib"; import { inflateSync } from "node:zlib";
import { initWasmSync, decompress as lzmaDecompress } from "lzma-wasm";
const LZMA = require("lzma/src/lzma_worker").LZMA_WORKER; initWasmSync();
// ── SWF Tag Types ────────────────────────────────────────────────── // ── SWF Tag Types ──────────────────────────────────────────────────
export const TAG_END = 0; export const TAG_END = 0;
@@ -62,7 +63,9 @@ export function decompressSwf(buffer: Buffer): Buffer {
lzmaHeader.writeUInt32LE(0, 9); lzmaHeader.writeUInt32LE(0, 9);
const lzmaStream = Buffer.concat([lzmaHeader, compressedPayload]); const lzmaStream = Buffer.concat([lzmaHeader, compressedPayload]);
const decompressed = Buffer.from(LZMA.decompress(lzmaStream) as number[]); const decompressed = Buffer.from(
lzmaDecompress(lzmaStream, { expectedSize: uncompressedSize }),
);
const header = Buffer.alloc(8); const header = Buffer.alloc(8);
buffer.copy(header, 0, 0, 8); buffer.copy(header, 0, 0, 8);
-14
View File
@@ -1,14 +0,0 @@
declare module "lzma" {
export const LZMA: any;
export function decompress(
byte_array: any,
on_finish?: (result: any, error: any) => void,
on_progress?: (percent: number) => void,
): any;
export function compress(
string: string | Uint8Array,
mode: number,
on_finish?: (result: any, error: any) => void,
on_progress?: (percent: number) => void,
): any;
}