@mocanvas/wasm 1.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +421 -0
- package/BENCHMARK.md +519 -0
- package/CLEAN_ROOM.md +50 -0
- package/COMPAT.md +282 -0
- package/CUSTOM_SHAPES.md +880 -0
- package/LICENSE +110 -16
- package/MIGRATION.md +807 -0
- package/README.md +22 -3
- package/UI.md +256 -0
- package/dist/index.d.ts +110 -6
- package/dist/index.js +155 -6
- package/dist/index.js.map +1 -1
- package/package.json +11 -13
- package/pkg/mocanvas-wasm-base64.js +1 -1
- package/pkg/mocanvas.d.ts +17 -0
- package/pkg/mocanvas.js +21 -0
- package/pkg/mocanvas_bg.wasm +0 -0
- package/pkg/mocanvas_bg.wasm.d.ts +1 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["wasmVersion"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Typed loader and zero-copy bridge over the mocanvas WebAssembly engine.\n *\n * See docs/ARCHITECTURE.md → \"Bridge ABI\".\n */\nimport init, { Engine, initSync, version as wasmVersion, type InitInput, type SyncInitInput } from \"../pkg/mocanvas.js\"\n\nexport { Engine }\n\n/** Command opcodes; must match `crates/mocanvas-wasm/src/lib.rs::op`. */\nexport const OP = {\n UPSERT_SHAPE: 1,\n REMOVE_SHAPE: 2,\n SET_GEOMETRY: 3,\n SET_STYLE: 4,\n CLEAR: 5,\n SET_TEXTURE: 6,\n} as const\n\n/** Path opcodes; must match `mocanvas-geo::PathCmd`. */\nexport const PATH_OP = {\n MOVE: 0,\n LINE: 1,\n QUAD: 2,\n CUBIC: 3,\n CLOSE: 4,\n} as const\n\n/** Shape flags; must match `mocanvas-scene`. */\nexport const FLAG = {\n HIDDEN: 1 << 0,\n LOCKED: 1 << 1,\n OVERLAY: 1 << 2,\n NO_FILL: 1 << 3,\n /** GPU-drawn and also reported to the DOM overlay (labels). */\n LABEL: 1 << 4,\n /** Descendants are clipped to this shape's page-space geometry AABB (frames). */\n CLIP: 1 << 5,\n} as const\n\n/** Hit-test filter bits. */\nexport const HIT_FILTER = {\n INCLUDE_LOCKED: 1,\n INCLUDE_HIDDEN: 2,\n HOLLOW_ONLY: 4,\n} as const\n\nexport type Handle = number\n\nexport interface CameraState {\n /** Page-space offset. screen = (page + cam) * z */\n x: number\n y: number\n z: number\n}\n\n/** Floats per vertex in `FrameBuffers.vertices`: `x y u v r g b a`. */\nexport const VERTEX_FLOATS = 8\n/** `u32` words per record in `FrameBuffers.batches`. */\nexport const BATCH_WORDS = 7\n/** `u32` words per record in `FrameBuffers.overlay`. */\nexport const OVERLAY_WORDS = 10\n\n/** Page-space clip rectangle `[minX, minY, maxX, maxY]`. */\nexport type ClipRect = [number, number, number, number]\n\nexport interface FrameBuffers {\n /**\n * Interleaved `x y u v r g b a` (8 floats) in page space; solid geometry has\n * `u = v = 0`. View into WASM memory; valid until the next engine call.\n */\n vertices: Float32Array\n indices: Uint32Array\n /**\n * `BATCH_WORDS` (7) words per batch: `firstIndex indexCount texture clipMinX\n * clipMinY clipMaxX clipMaxY`. The clip words are f32 bits in page space; all\n * four zero means unclipped. Texture 0 = solid color. A new batch starts\n * whenever the texture or the clip rect changes — use `readBatch`.\n */\n batches: Uint32Array\n /**\n * `OVERLAY_WORDS` (10) words per entry: `handle x y w h rot clipMinX clipMinY\n * clipMaxX clipMaxY` with floats as bits — use `readOverlay`.\n */\n overlay: Uint32Array\n drawn: number\n culled: number\n /**\n * Build counter, bumped only when the buffers are rebuilt. The vertex data is\n * page-space and the camera is a shader uniform, so a moving camera alone does\n * not change it: a backend that has already uploaded version `v` can skip the\n * upload for as long as this reads `v`.\n */\n version: number\n /** Whether the call that produced this frame rebuilt the buffers. */\n dirty: boolean\n /**\n * Shapes were deferred by the per-frame tessellation budget and are drawn as\n * flat placeholder quads meanwhile. Keep scheduling frames until this is false.\n */\n pending: boolean\n}\n\nexport interface Batch {\n firstIndex: number\n indexCount: number\n /** Host texture id, 0 = solid color. */\n texture: number\n /** Page-space clip rect, or undefined when unclipped. */\n clip?: ClipRect\n}\n\nexport interface OverlayEntry {\n handle: Handle\n x: number\n y: number\n w: number\n h: number\n rotation: number\n /** Page-space clip rect inherited from the nearest clipping ancestor, if any. */\n clip?: ClipRect\n}\n\nexport interface StyleWords {\n /** 0xRRGGBBAA, alpha 0 = none */\n fill: number\n stroke: number\n strokeWidth: number\n dash: number\n opacity: number\n /**\n * Host texture id (0 or undefined = none). Not part of SET_STYLE; send it with\n * `CommandWriter.setTexture`. When set, the fill is drawn as one textured quad\n * over the shape's local bounds (uv 0..1), tinted white × opacity.\n */\n texture?: number\n /**\n * Per-shape random seed (0 or undefined = 0). Only `dash: 3` (hand-drawn) reads\n * it: it picks that shape's wobble, so the same seed always redraws the same\n * outline. Derive it from the shape's stable id, never from its handle or its\n * position in the scene, or a shape will change shape when it is re-added.\n */\n seed?: number\n}\n\nconst scratchF32 = new Float32Array(1)\nconst scratchU32 = new Uint32Array(scratchF32.buffer)\n\n/** Bit-cast a float to u32 without allocation. */\nexport function f32bits(v: number): number {\n scratchF32[0] = v\n return scratchU32[0]!\n}\n\n/** Bit-cast a u32 to float without allocation. */\nexport function bitsf32(v: number): number {\n scratchU32[0] = v\n return scratchF32[0]!\n}\n\n/** Four clip words (f32 bits) at `offset` → rect, or undefined when all zero (unclipped). */\nexport function readClip(words: Uint32Array, offset: number): ClipRect | undefined {\n const a = words[offset]!\n const b = words[offset + 1]!\n const c = words[offset + 2]!\n const d = words[offset + 3]!\n if ((a | b | c | d) === 0) return undefined\n return [bitsf32(a), bitsf32(b), bitsf32(c), bitsf32(d)]\n}\n\n/**\n * Writes commands straight into the engine's command buffer in WASM memory.\n * Call `flush()` once per store transaction.\n */\nexport class CommandWriter {\n private view: Uint32Array\n private cap: number\n private len = 0\n\n constructor(\n private readonly engine: Engine,\n private readonly memory: WebAssembly.Memory,\n initialWords = 1 << 14,\n ) {\n this.cap = initialWords\n const ptr = engine.cmd_ptr(this.cap)\n this.view = new Uint32Array(memory.buffer, ptr, this.cap)\n }\n\n /** Words queued but not yet applied. */\n get pending(): number {\n return this.len\n }\n\n private ensure(words: number): void {\n if (this.len + words <= this.cap && this.view.buffer === this.memory.buffer) return\n let cap = this.cap\n while (this.len + words > cap) cap *= 2\n this.cap = cap\n // The engine's Vec keeps existing content on resize; only the pointer may move.\n const ptr = this.engine.cmd_ptr(cap)\n this.view = new Uint32Array(this.memory.buffer, ptr, cap)\n }\n\n upsert(\n handle: Handle,\n kind: number,\n parent: Handle,\n zlo: number,\n zhi: number,\n flags: number,\n x: number,\n y: number,\n rotation: number,\n w: number,\n h: number,\n ): void {\n this.ensure(12)\n const v = this.view\n let i = this.len\n v[i++] = OP.UPSERT_SHAPE\n v[i++] = handle\n v[i++] = kind\n v[i++] = parent\n v[i++] = zlo\n v[i++] = zhi\n v[i++] = flags\n v[i++] = f32bits(x)\n v[i++] = f32bits(y)\n v[i++] = f32bits(rotation)\n v[i++] = f32bits(w)\n v[i++] = f32bits(h)\n this.len = i\n }\n\n remove(handle: Handle): void {\n this.ensure(2)\n this.view[this.len++] = OP.REMOVE_SHAPE\n this.view[this.len++] = handle\n }\n\n /** `pathWords` is the flat f32 path encoding (opcode, args...). */\n setGeometry(handle: Handle, pathWords: ArrayLike<number>): void {\n const n = pathWords.length\n this.ensure(3 + n)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_GEOMETRY\n v[i++] = handle\n v[i++] = n\n for (let k = 0; k < n; k++) v[i++] = f32bits(pathWords[k]!)\n this.len = i\n }\n\n setStyle(handle: Handle, s: StyleWords): void {\n this.ensure(8)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_STYLE\n v[i++] = handle\n v[i++] = s.fill >>> 0\n v[i++] = s.stroke >>> 0\n v[i++] = f32bits(s.strokeWidth)\n v[i++] = s.dash >>> 0\n v[i++] = f32bits(s.opacity)\n v[i++] = (s.seed ?? 0) >>> 0\n this.len = i\n }\n\n /** Set the fill texture of a shape (0 = solid fill). Independent of `setStyle`. */\n setTexture(handle: Handle, texture: number): void {\n this.ensure(3)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_TEXTURE\n v[i++] = handle\n v[i++] = texture >>> 0\n this.len = i\n }\n\n clear(): void {\n this.ensure(1)\n this.view[this.len++] = OP.CLEAR\n }\n\n /** Apply queued commands. Returns the number of commands applied. Throws on a malformed stream. */\n flush(): number {\n if (this.len === 0) return 0\n const n = this.engine.apply(this.len)\n this.len = 0\n const err = this.engine.take_error()\n if (err) throw new Error(`mocanvas engine: ${err}`)\n return n\n }\n}\n\n/** High-level wrapper: owns the engine, the command writer, and typed views. */\nexport class EngineBridge {\n readonly cmd: CommandWriter\n /**\n * Shapes the engine may tessellate in one `frame()` call; the rest are drawn as\n * level-of-detail quads and picked up by later frames, which keeps a viewport\n * full of never-seen shapes from stalling on one frame. Read from the engine so\n * `mocanvas_render::DEFAULT_TESS_BUDGET` stays the single source of truth.\n */\n tessBudget: number\n private lastFrame: FrameBuffers | null = null\n\n constructor(\n readonly engine: Engine,\n readonly memory: WebAssembly.Memory,\n ) {\n this.cmd = new CommandWriter(engine, memory)\n this.tessBudget = Engine.default_tess_budget()\n }\n\n get shapeCount(): number {\n return this.engine.shape_count()\n }\n\n get epoch(): number {\n return this.engine.epoch()\n }\n\n /**\n * Build (or reuse) the frame for a camera. `tessBudget` overrides\n * {@link EngineBridge.tessBudget} for this call; pass `0` for no cap, which is\n * what tests want when they need one deterministic frame.\n *\n * When the engine reports the buffers unchanged the previous `FrameBuffers`\n * object is returned as-is, views included, so `frame.version` is a stable\n * identity a backend can compare against what it last uploaded.\n */\n frame(cam: CameraState, viewportW: number, viewportH: number, tessBudget: number = this.tessBudget): FrameBuffers {\n const e = this.engine\n e.frame(cam.x, cam.y, cam.z, viewportW, viewportH, tessBudget)\n const buf = this.memory.buffer\n const version = e.frame_version()\n const last = this.lastFrame\n // Reuse the views when nothing was rebuilt — unless WASM memory grew, which\n // detaches every existing view over it.\n if (last && !e.frame_dirty() && last.version === version && last.vertices.buffer === buf) {\n last.dirty = false\n last.pending = e.frame_pending()\n return last\n }\n const frame: FrameBuffers = {\n vertices: new Float32Array(buf, e.vertices_ptr(), e.vertices_len()),\n indices: new Uint32Array(buf, e.indices_ptr(), e.indices_len()),\n batches: new Uint32Array(buf, e.batches_ptr(), e.batches_len()),\n overlay: new Uint32Array(buf, e.overlay_ptr(), e.overlay_len()),\n drawn: e.drawn_count(),\n culled: e.culled_count(),\n version,\n dirty: e.frame_dirty(),\n pending: e.frame_pending(),\n }\n this.lastFrame = frame\n return frame\n }\n\n /** Decode the overlay buffer of a frame. */\n static readOverlay(overlay: Uint32Array): OverlayEntry[] {\n const out: OverlayEntry[] = []\n for (let i = 0; i + OVERLAY_WORDS <= overlay.length; i += OVERLAY_WORDS) {\n const entry: OverlayEntry = {\n handle: overlay[i]!,\n x: bitsf32(overlay[i + 1]!),\n y: bitsf32(overlay[i + 2]!),\n w: bitsf32(overlay[i + 3]!),\n h: bitsf32(overlay[i + 4]!),\n rotation: bitsf32(overlay[i + 5]!),\n }\n const clip = readClip(overlay, i + 6)\n if (clip) entry.clip = clip\n out.push(entry)\n }\n return out\n }\n\n /** Decode one batch record starting at word `offset` (a multiple of `BATCH_WORDS`). */\n static readBatch(batches: Uint32Array, offset: number): Batch {\n const b: Batch = { firstIndex: batches[offset]!, indexCount: batches[offset + 1]!, texture: batches[offset + 2]! }\n const clip = readClip(batches, offset + 3)\n if (clip) b.clip = clip\n return b\n }\n\n /** Decode the batch buffer of a frame. */\n static readBatches(batches: Uint32Array): Batch[] {\n const out: Batch[] = []\n for (let i = 0; i + BATCH_WORDS <= batches.length; i += BATCH_WORDS) out.push(EngineBridge.readBatch(batches, i))\n return out\n }\n\n /**\n * Grow the box each frame is built for by `pad` (a fraction of the viewport size)\n * on every side, so a camera panning inside that margin reuses the buffers instead\n * of rebuilding and re-uploading them.\n *\n * Zero by default: the pad submits `(1 + 2 * pad)²` more geometry on every frame in\n * exchange for skipping the upload on some of them, which only pays when the host's\n * upload is expensive relative to its per-triangle cost. It is on a hardware GPU;\n * it is emphatically not under software rasterisation.\n */\n setViewportPad(pad: number): void {\n this.engine.set_viewport_pad(pad)\n }\n\n /** The current viewport pad. */\n get viewportPad(): number {\n return this.engine.viewport_pad()\n }\n\n hitTest(pageX: number, pageY: number, tolerance: number, filter = 0): Handle {\n return this.engine.hit_test(pageX, pageY, tolerance, filter)\n }\n\n /** Handles in draw order. `mode` 0 = intersects, 1 = contains. Returns a copy. */\n queryBox(minX: number, minY: number, maxX: number, maxY: number, mode: 0 | 1 = 0, filter = 0): Uint32Array {\n const n = this.engine.query_box(minX, minY, maxX, maxY, mode, filter)\n return new Uint32Array(this.memory.buffer, this.engine.handles_ptr(), n).slice()\n }\n\n private readBox(): [number, number, number, number] {\n const f = new Float32Array(this.memory.buffer, this.engine.f32_ptr(), 4)\n return [f[0]!, f[1]!, f[2]!, f[3]!]\n }\n\n /**\n * Ink page bounds `[minX, minY, maxX, maxY]` or null: the shape's outline\n * expanded by half its stroke width. This is what the spatial index, the\n * viewport cull and clipping run on. For a user-facing measurement of where\n * the shape *is*, use {@link geometryBounds}.\n */\n bounds(handle: Handle): [number, number, number, number] | null {\n return this.engine.bounds(handle) ? this.readBox() : null\n }\n\n /** Geometry page bounds `[minX, minY, maxX, maxY]` or null: `bounds` without the stroke pad. */\n geometryBounds(handle: Handle): [number, number, number, number] | null {\n return this.engine.geometry_bounds(handle) ? this.readBox() : null\n }\n\n unionBounds(handles: ArrayLike<number>): [number, number, number, number] | null {\n if (this.cmd.pending > 0) throw new Error(\"unionBounds called with unflushed commands\")\n const n = handles.length\n const ptr = this.engine.cmd_ptr(Math.max(n, 1))\n new Uint32Array(this.memory.buffer, ptr, n).set(handles)\n return this.engine.union_bounds(n) ? this.readBox() : null\n }\n\n /** Union of every shape's ink bounds, or null when the scene is empty. */\n allBounds(): [number, number, number, number] | null {\n return this.engine.all_bounds() ? this.readBox() : null\n }\n\n /** Union of every shape's geometry bounds, or null when the scene is empty. */\n allGeometryBounds(): [number, number, number, number] | null {\n return this.engine.all_geometry_bounds() ? this.readBox() : null\n }\n\n /** Page transform `[a b c d e f]` or null. */\n pageTransform(handle: Handle): [number, number, number, number, number, number] | null {\n if (!this.engine.page_transform(handle)) return null\n const f = new Float32Array(this.memory.buffer, this.engine.f32_ptr(), 6)\n return [f[0]!, f[1]!, f[2]!, f[3]!, f[4]!, f[5]!]\n }\n\n dispose(): void {\n this.engine.free()\n }\n}\n\nlet initPromise: Promise<WebAssembly.Memory> | null = null\nlet warnedEmbedded = false\n\n/** `\\0asm` — the four bytes every WebAssembly module starts with. */\nconst WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d]\n\nfunction isWasm(bytes: ArrayBuffer): boolean {\n if (bytes.byteLength < WASM_MAGIC.length) return false\n const head = new Uint8Array(bytes, 0, WASM_MAGIC.length)\n return WASM_MAGIC.every((b, i) => head[i] === b)\n}\n\n/**\n * Fetch the module URL ourselves and check it really is WebAssembly.\n *\n * A dev server that rewrites unknown paths to `index.html` (Vite's SPA\n * fallback, hit whenever the optimizer has moved this module and the relative\n * URL no longer points anywhere) answers with a `200` full of HTML. Handing\n * that to the glue raises `CompileError: expected magic word 00 61 73 6d,\n * found 3c 21 64 6f` from deep inside a vendored file. Returning `null` here\n * instead lets the caller reach for the embedded copy.\n */\nasync function fetchWasm(url: URL): Promise<ArrayBuffer | null> {\n try {\n const res = await fetch(url)\n if (!res.ok) return null\n const bytes = await res.arrayBuffer()\n return isWasm(bytes) ? bytes : null\n } catch {\n // No `fetch`, a `file:` URL (Node), CORS, an offline network: all the same\n // answer — we could not get the bytes from the URL.\n return null\n }\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof atob === \"function\") {\n const bin = atob(b64)\n const out = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i)\n return out\n }\n // Node without `atob` (or a runtime that only has `Buffer`).\n const buf = (globalThis as { Buffer?: { from(s: string, enc: string): Uint8Array } }).Buffer\n if (!buf) throw new Error(\"mocanvas: no base64 decoder (`atob` or `Buffer`) in this runtime\")\n return new Uint8Array(buf.from(b64, \"base64\"))\n}\n\n/**\n * The default load path: the URL first, the embedded copy as a safety net.\n *\n * The base64 module is generated at build time (see `scripts/prepare-pkg.mjs`)\n * and pulled in with a *dynamic* import, so every bundler gives it its own\n * chunk and the happy path never downloads it.\n */\nasync function loadDefault(): Promise<WebAssembly.Memory> {\n const url = new URL(\"../pkg/mocanvas_bg.wasm\", import.meta.url)\n const fetched = await fetchWasm(url)\n if (fetched) return (await init({ module_or_path: fetched })).memory\n\n if (!warnedEmbedded) {\n warnedEmbedded = true\n console.warn(\n `mocanvas: could not fetch the WebAssembly module from ${url.href} — it was not served as WebAssembly. ` +\n \"Falling back to the copy embedded in the bundle; the canvas works, but that is a larger download than it needs to be. \" +\n 'To take the URL instead, add optimizeDeps: { exclude: [\"@mocanvas/wasm\"] } to your Vite config.',\n )\n }\n const { wasmBase64 } = await import(\"../pkg/mocanvas-wasm-base64.js\")\n return (await init({ module_or_path: base64ToBytes(wasmBase64) })).memory\n}\n\n/**\n * Load the WASM module (once) and create an engine.\n *\n * With no argument the module is resolved as\n * `new URL(\"../pkg/mocanvas_bg.wasm\", import.meta.url)` — which Vite, webpack 5\n * and Rollup all recognise: they emit the `.wasm` file as an asset and rewrite\n * the URL — then fetched and checked for the WebAssembly magic number. If those\n * bytes are not a module (a dev server's HTML fallback, a 404 page, a JSON\n * error), an embedded base64 copy is used instead and a one-time warning is\n * logged. No consumer configuration is required either way.\n *\n * Passing an input takes over completely: `loadEngine(\"/assets/mocanvas_bg.wasm\")`,\n * a `URL`, a `Response`, the compiled bytes or a `WebAssembly.Module` are handed\n * to the glue as-is, with no validation and no fallback, so a mistake in the\n * location you chose surfaces as its own error. See the package README.\n */\nexport async function loadEngine(input?: InitInput): Promise<EngineBridge> {\n if (!initPromise) {\n initPromise = input === undefined ? loadDefault() : init({ module_or_path: input }).then((o) => o.memory)\n }\n const memory = await initPromise\n return new EngineBridge(new Engine(), memory)\n}\n\n/** Synchronous variant for tests / Node: pass the compiled bytes. */\nexport function loadEngineSync(bytes: SyncInitInput): EngineBridge {\n const out = initSync({ module: bytes })\n initPromise = Promise.resolve(out.memory)\n return new EngineBridge(new Engine(), out.memory)\n}\n\nexport function engineVersion(): string {\n return wasmVersion()\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["wasmVersion"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Typed loader and zero-copy bridge over the mocanvas WebAssembly engine.\n *\n * See docs/ARCHITECTURE.md → \"Bridge ABI\".\n */\nimport init, { Engine, initSync, version as wasmVersion, type InitInput, type SyncInitInput } from \"../pkg/mocanvas.js\"\n\nexport { Engine }\n\n/** Command opcodes; must match `crates/mocanvas-wasm/src/lib.rs::op`. */\nexport const OP = {\n UPSERT_SHAPE: 1,\n REMOVE_SHAPE: 2,\n SET_GEOMETRY: 3,\n SET_STYLE: 4,\n CLEAR: 5,\n SET_TEXTURE: 6,\n SET_GEO: 7,\n SET_SPLINE: 8,\n SET_POLY: 9,\n SET_DRAW: 10,\n} as const\n\n/**\n * Flag bits for the parametric geometry commands; must match\n * `crates/mocanvas-wasm/src/lib.rs::geo_flag`.\n */\nexport const GEO_FLAG = {\n /** `setGeo`: mirror the silhouette left-to-right inside its own box. */\n FLIP_X: 1 << 0,\n /** `setGeo`: mirror the silhouette top-to-bottom inside its own box. */\n FLIP_Y: 1 << 1,\n /** `setSpline` / `setPoly` / `setDraw`: close the outline. */\n CLOSED: 1 << 0,\n /** `setDraw`, per segment: this run came from a pen, so smooth it. */\n FREEHAND: 1 << 0,\n} as const\n\n/**\n * The built-in geo silhouettes the engine can build from parameters, by name.\n *\n * The numbers are the indices of `GEO_SHAPE_KINDS`, which is part of the file\n * format — a kind is only ever appended. A `geo` value that is not in here is a\n * custom silhouette the engine has no generator for; upload its path with\n * {@link CommandWriter.setGeometry} instead.\n */\nexport const GEO_KIND: Readonly<Record<string, number>> = Object.freeze({\n rectangle: 0,\n ellipse: 1,\n triangle: 2,\n diamond: 3,\n pentagon: 4,\n hexagon: 5,\n octagon: 6,\n star: 7,\n rhombus: 8,\n \"rhombus-2\": 9,\n oval: 10,\n trapezoid: 11,\n \"arrow-right\": 12,\n \"arrow-left\": 13,\n \"arrow-up\": 14,\n \"arrow-down\": 15,\n \"x-box\": 16,\n \"check-box\": 17,\n cloud: 18,\n heart: 19,\n})\n\n/** Path opcodes; must match `mocanvas-geo::PathCmd`. */\nexport const PATH_OP = {\n MOVE: 0,\n LINE: 1,\n QUAD: 2,\n CUBIC: 3,\n CLOSE: 4,\n} as const\n\n/** Shape flags; must match `mocanvas-scene`. */\nexport const FLAG = {\n HIDDEN: 1 << 0,\n LOCKED: 1 << 1,\n OVERLAY: 1 << 2,\n NO_FILL: 1 << 3,\n /** GPU-drawn and also reported to the DOM overlay (labels). */\n LABEL: 1 << 4,\n /** Descendants are clipped to this shape's page-space geometry AABB (frames). */\n CLIP: 1 << 5,\n} as const\n\n/** Hit-test filter bits. */\nexport const HIT_FILTER = {\n INCLUDE_LOCKED: 1,\n INCLUDE_HIDDEN: 2,\n HOLLOW_ONLY: 4,\n} as const\n\nexport type Handle = number\n\nexport interface CameraState {\n /** Page-space offset. screen = (page + cam) * z */\n x: number\n y: number\n z: number\n}\n\n/** Floats per vertex in `FrameBuffers.vertices`: `x y u v r g b a`. */\nexport const VERTEX_FLOATS = 8\n/** `u32` words per record in `FrameBuffers.batches`. */\nexport const BATCH_WORDS = 8\n/** `u32` words per record in `FrameBuffers.overlay`. */\nexport const OVERLAY_WORDS = 10\n\n/** Page-space clip rectangle `[minX, minY, maxX, maxY]`. */\nexport type ClipRect = [number, number, number, number]\n\nexport interface FrameBuffers {\n /**\n * Interleaved `x y u v r g b a` (8 floats) in page space; solid geometry has\n * `u = v = 0`. View into WASM memory; valid until the next engine call.\n */\n vertices: Float32Array\n indices: Uint32Array\n /**\n * `BATCH_WORDS` (8) words per batch: `firstIndex indexCount texture clipMinX\n * clipMinY clipMaxX clipMaxY isolate`. The clip words are f32 bits in page\n * space; all four zero means unclipped. Texture 0 = solid color. A new batch\n * starts whenever the texture, the clip rect or the isolation group changes —\n * use `readBatch`.\n */\n batches: Uint32Array\n /**\n * `OVERLAY_WORDS` (10) words per entry: `handle x y w h rot clipMinX clipMinY\n * clipMaxX clipMaxY` with floats as bits — use `readOverlay`.\n */\n overlay: Uint32Array\n drawn: number\n culled: number\n /**\n * Build counter, bumped only when the buffers are rebuilt. The vertex data is\n * page-space and the camera is a shader uniform, so a moving camera alone does\n * not change it: a backend that has already uploaded version `v` can skip the\n * upload for as long as this reads `v`.\n */\n version: number\n /** Whether the call that produced this frame rebuilt the buffers. */\n dirty: boolean\n /**\n * Shapes were deferred by the per-frame tessellation budget and are drawn as\n * flat placeholder quads meanwhile. Keep scheduling frames until this is false.\n */\n pending: boolean\n}\n\nexport interface Batch {\n firstIndex: number\n indexCount: number\n /** Host texture id, 0 = solid color. */\n texture: number\n /** Page-space clip rect, or undefined when unclipped. */\n clip?: ClipRect\n /**\n * Isolation group, or 0 for an ordinary batch.\n *\n * Non-zero means the batch is one translucent shape's whole mark, and the\n * backend has to paint each pixel of it once: the engine bakes opacity into\n * vertex alpha, so a stroke that crosses itself would otherwise blend twice\n * and show the crossing as a dark knot. The number is unique per frame and\n * rises in draw order, which is what lets a backend tell two of them apart.\n */\n isolate: number\n}\n\nexport interface OverlayEntry {\n handle: Handle\n x: number\n y: number\n w: number\n h: number\n rotation: number\n /** Page-space clip rect inherited from the nearest clipping ancestor, if any. */\n clip?: ClipRect\n}\n\nexport interface StyleWords {\n /** 0xRRGGBBAA, alpha 0 = none */\n fill: number\n stroke: number\n strokeWidth: number\n dash: number\n opacity: number\n /**\n * Host texture id (0 or undefined = none). Not part of SET_STYLE; send it with\n * `CommandWriter.setTexture`. When set, the fill is drawn as one textured quad\n * over the shape's local bounds (uv 0..1), tinted white × opacity.\n */\n texture?: number\n /**\n * Per-shape random seed (0 or undefined = 0). Only `dash: 3` (hand-drawn) reads\n * it: it picks that shape's wobble, so the same seed always redraws the same\n * outline. Derive it from the shape's stable id, never from its handle or its\n * position in the scene, or a shape will change shape when it is re-added.\n */\n seed?: number\n}\n\nconst scratchF32 = new Float32Array(1)\nconst scratchU32 = new Uint32Array(scratchF32.buffer)\n\n/** Bit-cast a float to u32 without allocation. */\nexport function f32bits(v: number): number {\n scratchF32[0] = v\n return scratchU32[0]!\n}\n\n/** Bit-cast a u32 to float without allocation. */\nexport function bitsf32(v: number): number {\n scratchU32[0] = v\n return scratchF32[0]!\n}\n\n/** Four clip words (f32 bits) at `offset` → rect, or undefined when all zero (unclipped). */\nexport function readClip(words: Uint32Array, offset: number): ClipRect | undefined {\n const a = words[offset]!\n const b = words[offset + 1]!\n const c = words[offset + 2]!\n const d = words[offset + 3]!\n if ((a | b | c | d) === 0) return undefined\n return [bitsf32(a), bitsf32(b), bitsf32(c), bitsf32(d)]\n}\n\n/**\n * Writes commands straight into the engine's command buffer in WASM memory.\n * Call `flush()` once per store transaction.\n */\nexport class CommandWriter {\n private view: Uint32Array\n private cap: number\n private len = 0\n\n constructor(\n private readonly engine: Engine,\n private readonly memory: WebAssembly.Memory,\n initialWords = 1 << 14,\n ) {\n this.cap = initialWords\n const ptr = engine.cmd_ptr(this.cap)\n this.view = new Uint32Array(memory.buffer, ptr, this.cap)\n }\n\n /** Words queued but not yet applied. */\n get pending(): number {\n return this.len\n }\n\n private ensure(words: number): void {\n if (this.len + words <= this.cap && this.view.buffer === this.memory.buffer) return\n let cap = this.cap\n while (this.len + words > cap) cap *= 2\n this.cap = cap\n // The engine's Vec keeps existing content on resize; only the pointer may move.\n const ptr = this.engine.cmd_ptr(cap)\n this.view = new Uint32Array(this.memory.buffer, ptr, cap)\n }\n\n upsert(\n handle: Handle,\n kind: number,\n parent: Handle,\n zlo: number,\n zhi: number,\n flags: number,\n x: number,\n y: number,\n rotation: number,\n w: number,\n h: number,\n ): void {\n this.ensure(12)\n const v = this.view\n let i = this.len\n v[i++] = OP.UPSERT_SHAPE\n v[i++] = handle\n v[i++] = kind\n v[i++] = parent\n v[i++] = zlo\n v[i++] = zhi\n v[i++] = flags\n v[i++] = f32bits(x)\n v[i++] = f32bits(y)\n v[i++] = f32bits(rotation)\n v[i++] = f32bits(w)\n v[i++] = f32bits(h)\n this.len = i\n }\n\n remove(handle: Handle): void {\n this.ensure(2)\n this.view[this.len++] = OP.REMOVE_SHAPE\n this.view[this.len++] = handle\n }\n\n /** `pathWords` is the flat f32 path encoding (opcode, args...). */\n setGeometry(handle: Handle, pathWords: ArrayLike<number>): void {\n const n = pathWords.length\n this.ensure(3 + n)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_GEOMETRY\n v[i++] = handle\n v[i++] = n\n for (let k = 0; k < n; k++) v[i++] = f32bits(pathWords[k]!)\n this.len = i\n }\n\n /**\n * Build a built-in geo silhouette in the engine from its parameters.\n *\n * This is the fast path behind {@link CommandWriter.setGeometry} for the\n * shapes the engine knows how to draw itself: five words go over the wire\n * instead of a whole outline, and the trigonometry runs in WebAssembly. The\n * resulting path is identical to the one the TypeScript generators produce.\n *\n * `kind` is an index from {@link GEO_KIND}. A silhouette that is not in that\n * table has no generator here — send its path with `setGeometry`.\n */\n /**\n * A built-in geo outline, generated by the engine from `(kind, w, h)`.\n *\n * `strokeWidth` reaches only the open marks drawn *inside* an outline — the X\n * of an x-box — whose ends sit on the outline and would otherwise spike\n * through it by half a stroke. The outline itself does not move with it.\n */\n setGeo(handle: Handle, kind: number, w: number, h: number, flags = 0, strokeWidth = 0): void {\n this.ensure(7)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_GEO\n v[i++] = handle\n v[i++] = kind >>> 0\n v[i++] = flags >>> 0\n v[i++] = f32bits(w)\n v[i++] = f32bits(h)\n v[i++] = f32bits(strokeWidth)\n this.len = i\n }\n\n /**\n * A smooth cubic spline through `points` (interleaved `x, y`), built in the\n * engine. `flags` takes {@link GEO_FLAG}.CLOSED.\n */\n setSpline(handle: Handle, points: ArrayLike<number>, flags = 0): void {\n this.writePoints(OP.SET_SPLINE, handle, points, flags)\n }\n\n /**\n * A polyline through `points` (interleaved `x, y`), or a polygon when\n * `flags` has {@link GEO_FLAG}.CLOSED.\n */\n setPoly(handle: Handle, points: ArrayLike<number>, flags = 0): void {\n this.writePoints(OP.SET_POLY, handle, points, flags)\n }\n\n private writePoints(op: number, handle: Handle, points: ArrayLike<number>, flags: number): void {\n const n = points.length >> 1\n this.ensure(4 + n * 2)\n const v = this.view\n let i = this.len\n v[i++] = op\n v[i++] = handle\n v[i++] = flags >>> 0\n v[i++] = n\n for (let k = 0; k < n * 2; k++) v[i++] = f32bits(points[k]!)\n this.len = i\n }\n\n /**\n * A freehand stroke, as the runs the pen actually made.\n *\n * Each segment is `{ points, freehand }` with `points` interleaved `x, y`; a\n * `freehand` run is smoothed in the engine (one 1-2-1 pass, endpoints fixed)\n * before the runs are concatenated into one outline. `flags` takes\n * {@link GEO_FLAG}.CLOSED, which closes the stroke when it has more than two\n * points.\n */\n setDraw(handle: Handle, segments: readonly { points: ArrayLike<number>; freehand: boolean }[], flags = 0): void {\n let words = 4\n for (const seg of segments) words += 2 + (seg.points.length & ~1)\n this.ensure(words)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_DRAW\n v[i++] = handle\n v[i++] = flags >>> 0\n v[i++] = segments.length\n for (const seg of segments) {\n const n = seg.points.length >> 1\n v[i++] = seg.freehand ? GEO_FLAG.FREEHAND : 0\n v[i++] = n\n for (let k = 0; k < n * 2; k++) v[i++] = f32bits(seg.points[k]!)\n }\n this.len = i\n }\n\n setStyle(handle: Handle, s: StyleWords): void {\n this.ensure(8)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_STYLE\n v[i++] = handle\n v[i++] = s.fill >>> 0\n v[i++] = s.stroke >>> 0\n v[i++] = f32bits(s.strokeWidth)\n v[i++] = s.dash >>> 0\n v[i++] = f32bits(s.opacity)\n v[i++] = (s.seed ?? 0) >>> 0\n this.len = i\n }\n\n /** Set the fill texture of a shape (0 = solid fill). Independent of `setStyle`. */\n setTexture(handle: Handle, texture: number): void {\n this.ensure(3)\n const v = this.view\n let i = this.len\n v[i++] = OP.SET_TEXTURE\n v[i++] = handle\n v[i++] = texture >>> 0\n this.len = i\n }\n\n clear(): void {\n this.ensure(1)\n this.view[this.len++] = OP.CLEAR\n }\n\n /** Apply queued commands. Returns the number of commands applied. Throws on a malformed stream. */\n flush(): number {\n if (this.len === 0) return 0\n const n = this.engine.apply(this.len)\n this.len = 0\n const err = this.engine.take_error()\n if (err) throw new Error(`mocanvas engine: ${err}`)\n return n\n }\n}\n\n/** High-level wrapper: owns the engine, the command writer, and typed views. */\nexport class EngineBridge {\n readonly cmd: CommandWriter\n /**\n * Shapes the engine may tessellate in one `frame()` call; the rest are drawn as\n * level-of-detail quads and picked up by later frames, which keeps a viewport\n * full of never-seen shapes from stalling on one frame. Read from the engine so\n * `mocanvas_render::DEFAULT_TESS_BUDGET` stays the single source of truth.\n */\n tessBudget: number\n private lastFrame: FrameBuffers | null = null\n\n constructor(\n readonly engine: Engine,\n readonly memory: WebAssembly.Memory,\n ) {\n this.cmd = new CommandWriter(engine, memory)\n this.tessBudget = Engine.default_tess_budget()\n }\n\n get shapeCount(): number {\n return this.engine.shape_count()\n }\n\n get epoch(): number {\n return this.engine.epoch()\n }\n\n /**\n * Build (or reuse) the frame for a camera. `tessBudget` overrides\n * {@link EngineBridge.tessBudget} for this call; pass `0` for no cap, which is\n * what tests want when they need one deterministic frame.\n *\n * When the engine reports the buffers unchanged the previous `FrameBuffers`\n * object is returned as-is, views included, so `frame.version` is a stable\n * identity a backend can compare against what it last uploaded.\n */\n frame(cam: CameraState, viewportW: number, viewportH: number, tessBudget: number = this.tessBudget): FrameBuffers {\n const e = this.engine\n e.frame(cam.x, cam.y, cam.z, viewportW, viewportH, tessBudget)\n const buf = this.memory.buffer\n const version = e.frame_version()\n const last = this.lastFrame\n // Reuse the views when nothing was rebuilt — unless WASM memory grew, which\n // detaches every existing view over it.\n if (last && !e.frame_dirty() && last.version === version && last.vertices.buffer === buf) {\n last.dirty = false\n last.pending = e.frame_pending()\n return last\n }\n const frame: FrameBuffers = {\n vertices: new Float32Array(buf, e.vertices_ptr(), e.vertices_len()),\n indices: new Uint32Array(buf, e.indices_ptr(), e.indices_len()),\n batches: new Uint32Array(buf, e.batches_ptr(), e.batches_len()),\n overlay: new Uint32Array(buf, e.overlay_ptr(), e.overlay_len()),\n drawn: e.drawn_count(),\n culled: e.culled_count(),\n version,\n dirty: e.frame_dirty(),\n pending: e.frame_pending(),\n }\n this.lastFrame = frame\n return frame\n }\n\n /** Decode the overlay buffer of a frame. */\n static readOverlay(overlay: Uint32Array): OverlayEntry[] {\n const out: OverlayEntry[] = []\n for (let i = 0; i + OVERLAY_WORDS <= overlay.length; i += OVERLAY_WORDS) {\n const entry: OverlayEntry = {\n handle: overlay[i]!,\n x: bitsf32(overlay[i + 1]!),\n y: bitsf32(overlay[i + 2]!),\n w: bitsf32(overlay[i + 3]!),\n h: bitsf32(overlay[i + 4]!),\n rotation: bitsf32(overlay[i + 5]!),\n }\n const clip = readClip(overlay, i + 6)\n if (clip) entry.clip = clip\n out.push(entry)\n }\n return out\n }\n\n /** Decode one batch record starting at word `offset` (a multiple of `BATCH_WORDS`). */\n static readBatch(batches: Uint32Array, offset: number): Batch {\n const b: Batch = {\n firstIndex: batches[offset]!,\n indexCount: batches[offset + 1]!,\n texture: batches[offset + 2]!,\n isolate: batches[offset + 7]!,\n }\n const clip = readClip(batches, offset + 3)\n if (clip) b.clip = clip\n return b\n }\n\n /** Decode the batch buffer of a frame. */\n static readBatches(batches: Uint32Array): Batch[] {\n const out: Batch[] = []\n for (let i = 0; i + BATCH_WORDS <= batches.length; i += BATCH_WORDS) out.push(EngineBridge.readBatch(batches, i))\n return out\n }\n\n /**\n * Grow the box each frame is built for by `pad` (a fraction of the viewport size)\n * on every side, so a camera panning inside that margin reuses the buffers instead\n * of rebuilding and re-uploading them.\n *\n * Zero by default: the pad submits `(1 + 2 * pad)²` more geometry on every frame in\n * exchange for skipping the upload on some of them, which only pays when the host's\n * upload is expensive relative to its per-triangle cost. It is on a hardware GPU;\n * it is emphatically not under software rasterisation.\n */\n setViewportPad(pad: number): void {\n this.engine.set_viewport_pad(pad)\n }\n\n /** The current viewport pad. */\n get viewportPad(): number {\n return this.engine.viewport_pad()\n }\n\n hitTest(pageX: number, pageY: number, tolerance: number, filter = 0): Handle {\n return this.engine.hit_test(pageX, pageY, tolerance, filter)\n }\n\n /** Handles in draw order. `mode` 0 = intersects, 1 = contains. Returns a copy. */\n queryBox(minX: number, minY: number, maxX: number, maxY: number, mode: 0 | 1 = 0, filter = 0): Uint32Array {\n const n = this.engine.query_box(minX, minY, maxX, maxY, mode, filter)\n return new Uint32Array(this.memory.buffer, this.engine.handles_ptr(), n).slice()\n }\n\n private readBox(): [number, number, number, number] {\n const f = new Float32Array(this.memory.buffer, this.engine.f32_ptr(), 4)\n return [f[0]!, f[1]!, f[2]!, f[3]!]\n }\n\n /**\n * Ink page bounds `[minX, minY, maxX, maxY]` or null: the shape's outline\n * expanded by half its stroke width. This is what the spatial index, the\n * viewport cull and clipping run on. For a user-facing measurement of where\n * the shape *is*, use {@link geometryBounds}.\n */\n bounds(handle: Handle): [number, number, number, number] | null {\n return this.engine.bounds(handle) ? this.readBox() : null\n }\n\n /** Geometry page bounds `[minX, minY, maxX, maxY]` or null: `bounds` without the stroke pad. */\n geometryBounds(handle: Handle): [number, number, number, number] | null {\n return this.engine.geometry_bounds(handle) ? this.readBox() : null\n }\n\n /**\n * The outline a `dash: \"draw\"` shape is really drawn with, as path words, or\n * `null` when the shape is missing or drawn in another style.\n *\n * The hand-drawn style strokes a perturbed, corner-rounded sketch rather than\n * the shape's own geometry, so this is the only way for the host to trace what\n * is on screen instead of what the maths says. It comes from the same call the\n * renderer makes, so the two agree exactly.\n *\n * Copied out rather than handed over as a view: the engine's buffer is reused\n * by the next call that writes to it, and a caller holding a view would find\n * its contents replaced underneath.\n */\n sketchPath(handle: Handle): Float32Array | null {\n const n = this.engine.sketch_path(handle)\n if (n === 0) return null\n return new Float32Array(this.memory.buffer, this.engine.f32_ptr(), n).slice()\n }\n\n unionBounds(handles: ArrayLike<number>): [number, number, number, number] | null {\n if (this.cmd.pending > 0) throw new Error(\"unionBounds called with unflushed commands\")\n const n = handles.length\n const ptr = this.engine.cmd_ptr(Math.max(n, 1))\n new Uint32Array(this.memory.buffer, ptr, n).set(handles)\n return this.engine.union_bounds(n) ? this.readBox() : null\n }\n\n /** Union of every shape's ink bounds, or null when the scene is empty. */\n allBounds(): [number, number, number, number] | null {\n return this.engine.all_bounds() ? this.readBox() : null\n }\n\n /** Union of every shape's geometry bounds, or null when the scene is empty. */\n allGeometryBounds(): [number, number, number, number] | null {\n return this.engine.all_geometry_bounds() ? this.readBox() : null\n }\n\n /** Page transform `[a b c d e f]` or null. */\n pageTransform(handle: Handle): [number, number, number, number, number, number] | null {\n if (!this.engine.page_transform(handle)) return null\n const f = new Float32Array(this.memory.buffer, this.engine.f32_ptr(), 6)\n return [f[0]!, f[1]!, f[2]!, f[3]!, f[4]!, f[5]!]\n }\n\n dispose(): void {\n this.engine.free()\n }\n}\n\nlet initPromise: Promise<WebAssembly.Memory> | null = null\nlet warnedEmbedded = false\n\n/** `\\0asm` — the four bytes every WebAssembly module starts with. */\nconst WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d]\n\nfunction isWasm(bytes: ArrayBuffer): boolean {\n if (bytes.byteLength < WASM_MAGIC.length) return false\n const head = new Uint8Array(bytes, 0, WASM_MAGIC.length)\n return WASM_MAGIC.every((b, i) => head[i] === b)\n}\n\n/**\n * Fetch the module URL ourselves and check it really is WebAssembly.\n *\n * A dev server that rewrites unknown paths to `index.html` (Vite's SPA\n * fallback, hit whenever the optimizer has moved this module and the relative\n * URL no longer points anywhere) answers with a `200` full of HTML. Handing\n * that to the glue raises `CompileError: expected magic word 00 61 73 6d,\n * found 3c 21 64 6f` from deep inside a vendored file. Returning `null` here\n * instead lets the caller reach for the embedded copy.\n */\nasync function fetchWasm(url: URL): Promise<ArrayBuffer | null> {\n try {\n const res = await fetch(url)\n if (!res.ok) return null\n const bytes = await res.arrayBuffer()\n return isWasm(bytes) ? bytes : null\n } catch {\n // No `fetch`, a `file:` URL (Node), CORS, an offline network: all the same\n // answer — we could not get the bytes from the URL.\n return null\n }\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof atob === \"function\") {\n const bin = atob(b64)\n const out = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i)\n return out\n }\n // Node without `atob` (or a runtime that only has `Buffer`).\n const buf = (globalThis as { Buffer?: { from(s: string, enc: string): Uint8Array } }).Buffer\n if (!buf) throw new Error(\"mocanvas: no base64 decoder (`atob` or `Buffer`) in this runtime\")\n return new Uint8Array(buf.from(b64, \"base64\"))\n}\n\n/**\n * The default load path: the URL first, the embedded copy as a safety net.\n *\n * The base64 module is generated at build time (see `scripts/prepare-pkg.mjs`)\n * and pulled in with a *dynamic* import, so every bundler gives it its own\n * chunk and the happy path never downloads it.\n */\nasync function loadDefault(): Promise<WebAssembly.Memory> {\n const url = new URL(\"../pkg/mocanvas_bg.wasm\", import.meta.url)\n const fetched = await fetchWasm(url)\n if (fetched) return (await init({ module_or_path: fetched })).memory\n\n if (!warnedEmbedded) {\n warnedEmbedded = true\n console.warn(\n `mocanvas: could not fetch the WebAssembly module from ${url.href} — it was not served as WebAssembly. ` +\n \"Falling back to the copy embedded in the bundle; the canvas works, but that is a larger download than it needs to be. \" +\n 'To take the URL instead, add optimizeDeps: { exclude: [\"@mocanvas/wasm\"] } to your Vite config.',\n )\n }\n const { wasmBase64 } = await import(\"../pkg/mocanvas-wasm-base64.js\")\n return (await init({ module_or_path: base64ToBytes(wasmBase64) })).memory\n}\n\n/**\n * Load the WASM module (once) and create an engine.\n *\n * With no argument the module is resolved as\n * `new URL(\"../pkg/mocanvas_bg.wasm\", import.meta.url)` — which Vite, webpack 5\n * and Rollup all recognise: they emit the `.wasm` file as an asset and rewrite\n * the URL — then fetched and checked for the WebAssembly magic number. If those\n * bytes are not a module (a dev server's HTML fallback, a 404 page, a JSON\n * error), an embedded base64 copy is used instead and a one-time warning is\n * logged. No consumer configuration is required either way.\n *\n * Passing an input takes over completely: `loadEngine(\"/assets/mocanvas_bg.wasm\")`,\n * a `URL`, a `Response`, the compiled bytes or a `WebAssembly.Module` are handed\n * to the glue as-is, with no validation and no fallback, so a mistake in the\n * location you chose surfaces as its own error. See the package README.\n */\nexport async function loadEngine(input?: InitInput): Promise<EngineBridge> {\n if (!initPromise) {\n initPromise = input === undefined ? loadDefault() : init({ module_or_path: input }).then((o) => o.memory)\n }\n const memory = await initPromise\n currentEngine = new EngineBridge(new Engine(), memory)\n return currentEngine\n}\n\n/** Synchronous variant for tests / Node: pass the compiled bytes. */\nexport function loadEngineSync(bytes: SyncInitInput): EngineBridge {\n const out = initSync({ module: bytes })\n initPromise = Promise.resolve(out.memory)\n currentEngine = new EngineBridge(new Engine(), out.memory)\n return currentEngine\n}\n\nlet currentEngine: EngineBridge | null = null\n\n/**\n * The engine created by the most recent `loadEngine` / `loadEngineSync`, or\n * `null` if the module has never been loaded in this realm.\n *\n * `new Editor({...})` falls back to this when no `engine` is passed, which is\n * what lets an app construct an editor without threading the bridge through\n * its own code.\n */\nexport function getLoadedEngine(): EngineBridge | null {\n return currentEngine\n}\n\nexport function engineVersion(): string {\n return wasmVersion()\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mocanvas/wasm",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Typed loader and zero-copy bridge over the mocanvas Rust/WebAssembly engine.",
|
|
5
|
-
"license": "
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "Symbio Digital",
|
|
7
|
-
"homepage": "https://github.com/SYMBIO/mocanvas/tree/main/packages/wasm#readme",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/SYMBIO/mocanvas.git",
|
|
11
|
-
"directory": "packages/wasm"
|
|
12
|
-
},
|
|
13
|
-
"bugs": {
|
|
14
|
-
"url": "https://github.com/SYMBIO/mocanvas/issues"
|
|
15
|
-
},
|
|
16
7
|
"keywords": [
|
|
17
8
|
"webassembly",
|
|
18
9
|
"wasm",
|
|
@@ -24,13 +15,20 @@
|
|
|
24
15
|
],
|
|
25
16
|
"type": "module",
|
|
26
17
|
"engines": {
|
|
27
|
-
"node": ">=
|
|
18
|
+
"node": ">=22.12.0"
|
|
28
19
|
},
|
|
29
20
|
"files": [
|
|
30
21
|
"dist",
|
|
31
22
|
"pkg",
|
|
32
23
|
"README.md",
|
|
33
|
-
"LICENSE"
|
|
24
|
+
"LICENSE",
|
|
25
|
+
"ARCHITECTURE.md",
|
|
26
|
+
"BENCHMARK.md",
|
|
27
|
+
"CLEAN_ROOM.md",
|
|
28
|
+
"COMPAT.md",
|
|
29
|
+
"CUSTOM_SHAPES.md",
|
|
30
|
+
"MIGRATION.md",
|
|
31
|
+
"UI.md"
|
|
34
32
|
],
|
|
35
33
|
"sideEffects": false,
|
|
36
34
|
"main": "./dist/index.js",
|