Mirrors hmwebviewer's rust/dwg-wasm change into the sample: the wasm artifact plus the parser wrapper, which now goes through parse_dwg_json and JSON.parse instead of the JsValue-returning parse_dwg. Building the whole result as a serde_json::Value tree pushed the live wasm heap near 2.9GB for a 19MB drawing, and the allocator's cost grows with that heap, so parsing went quadratic — 354s, with the tab frozen throughout. Streaming one entity at a time keeps it linear: 2.5s. The same build also fixes three bugs that drew stray 4km grey shapes where two CF-PATT SOLID hatches should be. Max hatch span 4655 -> 110. Adds two docs recording both investigations, in the format of the existing ones: measurements, the hypotheses that were ruled out, the fixes, regression checks, and the MPL-2.0 position (acadrust is unmodified, so no new source-disclosure obligation arises). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
29 lines
1.1 KiB
TypeScript
29 lines
1.1 KiB
TypeScript
/**
|
|
* acadrust DWG parser wrapper — loads the wasm built from rust/dwg-wasm
|
|
* (wasm-pack --target web, committed under ./acadrust-dwg).
|
|
*/
|
|
import init, { parse_dwg_json } from './acadrust-dwg/acadrust_dwg.js';
|
|
import wasmUrl from './acadrust-dwg/acadrust_dwg_bg.wasm?url';
|
|
import type { CadParseResult } from './dwgParser';
|
|
|
|
let ready: Promise<void> | null = null;
|
|
|
|
/** Initialize the acadrust WASM module once (idempotent). */
|
|
export function initAcadrustParser(): Promise<void> {
|
|
if (!ready) ready = init({ module_or_path: wasmUrl }).then(() => undefined);
|
|
return ready;
|
|
}
|
|
|
|
/**
|
|
* Parse a DWG buffer. Requires initAcadrustParser() first.
|
|
*
|
|
* Goes through `parse_dwg_json` + `JSON.parse` rather than the `parse_dwg`
|
|
* export that hands back a JsValue. The latter keeps the entire result live on
|
|
* the wasm heap as it builds, and the allocator's cost grows with that heap —
|
|
* a 19 MB drawing took ~354 s and froze the tab. Streaming the result out as
|
|
* text keeps it linear: the same file now lands in ~2.5 s.
|
|
*/
|
|
export function parseDwgAcadrust(bytes: Uint8Array): CadParseResult {
|
|
return JSON.parse(parse_dwg_json(bytes)) as CadParseResult;
|
|
}
|