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:
1 parent
7a41775c7e
commit
ca59a1065f
6 files changed
+19
-31
No files matched your search
+1
-1
@@ -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
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Generated
+7
-10
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Vendored
-14
@@ -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;
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user