42 lines
1.6 KiB
Markdown
42 lines
1.6 KiB
Markdown
---
|
|
epic: 1
|
|
story: 1.6
|
|
title: "WASM Bindings (for Web)"
|
|
status: draft
|
|
---
|
|
|
|
## Epic 1 — Core Calculation Engine (Rust Crate)
|
|
**Goal:** Build `calcpad-engine` as a standalone Rust crate that powers all platforms. This is the foundation.
|
|
|
|
### Story 1.6: WASM Bindings (for Web)
|
|
|
|
As a web developer integrating CalcPad,
|
|
I want `wasm-bindgen` exports that return JSON-compatible results and fit within a 500KB gzipped bundle,
|
|
So that the engine runs performantly in the browser without large download overhead.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
**Given** a JavaScript caller invoking the `eval_line` WASM export with a string input
|
|
**When** the function executes
|
|
**Then** it returns a `JsValue` that can be deserialized to a JavaScript object
|
|
**And** the object includes `type`, `display`, `rawValue`, and `error` fields
|
|
|
|
**Given** a JavaScript caller invoking `eval_sheet` with an array of lines
|
|
**When** the function executes
|
|
**Then** it returns an array of result objects corresponding to each line
|
|
**And** variable context flows from earlier lines to later lines
|
|
|
|
**Given** the WASM crate is built with `wasm-pack build --release`
|
|
**When** the output `.wasm` file is gzip-compressed
|
|
**Then** the compressed size is under 500KB
|
|
|
|
**Given** the WASM module is loaded in a browser environment
|
|
**When** `eval_line` is called with `0.1 + 0.2`
|
|
**Then** the result is `0.3` (arbitrary precision works in WASM)
|
|
**And** performance is comparable to native for typical expressions (under 1ms per line)
|
|
|
|
**Given** the WASM module is loaded in a Web Worker
|
|
**When** `eval_sheet` is called
|
|
**Then** it does not block the main thread
|
|
**And** results can be posted back via standard `postMessage`
|