{"_id":"@aimdb/aimdb-wasm-adapter","_rev":"3-c510b67ff5e71af6ad74c25e48a77448","name":"@aimdb/aimdb-wasm-adapter","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@aimdb/aimdb-wasm-adapter","version":"0.1.0","keywords":["wasm","webassembly","browser","async","database"],"license":"Apache-2.0","_id":"@aimdb/aimdb-wasm-adapter@0.1.0","maintainers":[{"name":"soundslikelx","email":"alexander.schnoerch@outlook.com"}],"homepage":"https://aimdb.dev","bugs":{"url":"https://github.com/aimdb-dev/aimdb/issues"},"dist":{"shasum":"369aa7f16bf26d083edea338258ba24ca11b5a4b","tarball":"https://registry.npmjs.org/@aimdb/aimdb-wasm-adapter/-/aimdb-wasm-adapter-0.1.0.tgz","fileCount":6,"integrity":"sha512-fdJXcoLtn2KmsTYJ3DfbGE6ZdqGo/dKZFrGwl2rYU5oxb0iSN2uBmTt1VXEQT9FQpT2RaziycacB0pDEocY7Hg==","signatures":[{"sig":"MEYCIQDaXBi+BvKqrJyKt+Qpgl0IfYORvnZ03b9S9bgVUDnSAAIhAPKh7jlKnV0QGROKUcM4+k7OeiYtqoiu5isdNdPOPFmC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459951},"main":"aimdb_wasm_adapter.js","type":"module","types":"aimdb_wasm_adapter.d.ts","gitHead":"063a06c468bfd841fefbee279d3f3a545f136de9","_npmUser":{"name":"soundslikelx","email":"alexander.schnoerch@outlook.com"},"repository":{"url":"git+https://github.com/aimdb-dev/aimdb.git","type":"git"},"_npmVersion":"11.9.0","description":"WebAssembly runtime adapter for AimDB - browser-native async runtime support","directories":{},"sideEffects":["./snippets/*"],"_nodeVersion":"24.14.0","collaborators":["AimDB Team <team@aimdb.dev>"],"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aimdb-wasm-adapter_0.1.0_1773124792479_0.3076247721747587","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.1.1":{"name":"@aimdb/aimdb-wasm-adapter","version":"0.1.1","keywords":["wasm","webassembly","browser","async","database"],"license":"Apache-2.0","_id":"@aimdb/aimdb-wasm-adapter@0.1.1","maintainers":[{"name":"soundslikelx","email":"alexander.schnoerch@outlook.com"}],"homepage":"https://aimdb.dev","bugs":{"url":"https://github.com/aimdb-dev/aimdb/issues"},"dist":{"shasum":"725123f59dcea55ef7e74a503b945aea62470e22","tarball":"https://registry.npmjs.org/@aimdb/aimdb-wasm-adapter/-/aimdb-wasm-adapter-0.1.1.tgz","fileCount":6,"integrity":"sha512-PLIC7p9k7LuYokRLjwIDz8KLP5W87ckMDAJuGg16tj6FIXflwIxvhpEPZiHMP4aEI87Rc5qWKYiilMgNpyfiRQ==","signatures":[{"sig":"MEUCIGvFEvikh4z+lerYnuwpyQsGM8YDxqFWebHz7Tb879Q/AiEAp20y/txIFqHNeUOJoJcwQuFP/39PwAiUPiy8qHtVZ6w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460362},"main":"aimdb_wasm_adapter.js","type":"module","types":"aimdb_wasm_adapter.d.ts","gitHead":"4dcb81dc70211d47cddf6cf58fea2218d11137ee","_npmUser":{"name":"soundslikelx","email":"alexander.schnoerch@outlook.com"},"repository":{"url":"git+https://github.com/aimdb-dev/aimdb.git","type":"git"},"_npmVersion":"11.9.0","description":"WebAssembly runtime adapter for AimDB - browser-native async runtime support","directories":{},"sideEffects":["./snippets/*"],"_nodeVersion":"24.14.0","collaborators":["AimDB Team <team@aimdb.dev>"],"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aimdb-wasm-adapter_0.1.1_1773162066750_0.9748189030053958","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"time":{"created":"2026-03-10T06:39:52.392Z","modified":"2026-08-21T19:29:36.999Z","0.1.0":"2026-03-10T06:39:52.648Z","0.1.1":"2026-03-10T17:01:07.025Z"},"bugs":{"url":"https://github.com/aimdb-dev/aimdb/issues"},"license":"Apache-2.0","homepage":"https://aimdb.dev","keywords":["wasm","webassembly","browser","async","database"],"repository":{"url":"git+https://github.com/aimdb-dev/aimdb.git","type":"git"},"description":"WebAssembly runtime adapter for AimDB - browser-native async runtime support","maintainers":[{"name":"soundslikelx","email":"alexander.schnoerch@outlook.com"}],"readme":"# aimdb-wasm-adapter\n\nWebAssembly runtime adapter for AimDB — browser-native async runtime support.\n\n## Overview\n\nThis crate provides a WASM runtime adapter that enables the full AimDB dataflow\nengine to run inside a web browser (or any `wasm32-unknown-unknown` host).\n\nRecords, buffers, producers, consumers, and data-contract enforcement all\nexecute natively in WASM — eliminating the need for a parallel validation\nlayer (Zod, JSON Schema) on the TypeScript side.\n\n## Platform Matrix\n\n| Target | Adapter | Buffer Primitive | Spawn Mechanism |\n|--------|---------|------------------|-----------------|\n| MCU | `aimdb-embassy-adapter` | `embassy-sync` channels | Static task pool |\n| Edge / Cloud | `aimdb-tokio-adapter` | `tokio::sync` channels | `tokio::spawn` |\n| **Browser** | **`aimdb-wasm-adapter`** | **`Rc<RefCell<…>>`** | **`spawn_local`** |\n\n## Architecture\n\nThe adapter is split into several focused modules:\n\n| Module | Purpose |\n|--------|---------|\n| `runtime.rs` | `WasmAdapter` — `RuntimeAdapter` + `Spawn` impl using `wasm_bindgen_futures::spawn_local` |\n| `time.rs` | `TimeOps` — `performance.now()` + `setTimeout`-based sleep via `gloo-timers` |\n| `logger.rs` | `Logger` — maps log levels to `console.log / debug / warn / error` |\n| `buffer.rs` | `WasmBuffer<T>` — SPMC Ring, SingleLatest, Mailbox on `Rc<RefCell<…>>` |\n| `bindings.rs` | `WasmDb` — `#[wasm_bindgen]` facade: `configureRecord`, `get`, `set`, `subscribe` |\n| `ws_bridge.rs` | `WsBridge` — WebSocket bridge to remote AimDB server (AimX wire protocol) |\n| `react/` | React hooks — `useRecord<T>`, `useSetRecord<T>`, `useBridge` |\n\n## JavaScript / TypeScript API\n\n### WasmDb\n\n```typescript\nimport init, { WasmDb } from '@aimdb/wasm';\n\nawait init();\nconst db = new WasmDb();\n\n// Configure records with Rust data contracts\ndb.configureRecord('sensors.temperature.vienna', {\n  schemaType: 'temperature',\n  buffer: 'SingleLatest',\n});\n\nawait db.build();\n\n// Get (returns deserialized JS object validated by Rust serde)\nconst temp = db.get('sensors.temperature.vienna');\nconsole.log(temp.celsius);\n\n// Set (Rust serde validates the payload)\ndb.set('sensors.temperature.vienna', { celsius: 22.5, timestamp: Date.now() });\n\n// Subscribe (callback fires on every buffer push)\nconst unsub = db.subscribe('sensors.temperature.vienna', (value) => {\n  console.log('New temperature:', value.celsius);\n});\n```\n\n### WsBridge\n\nConnect the browser-local AimDB to a remote server:\n\n```typescript\nimport { WsBridge } from '@aimdb/wasm';\n\nconst bridge = WsBridge.connect(db, 'wss://api.example.com/ws', {\n  subscribeTopics: ['sensors/#'],\n  autoReconnect: true,\n  lateJoin: true,\n});\n\nbridge.onStatusChange((status) => {\n  console.log('Connection:', status); // 'Connected' | 'Reconnecting' | ...\n});\n\nbridge.write('commands.setpoint', { target: 21.0 });\nbridge.disconnect();\n```\n\n### React Hooks\n\n```tsx\nimport { AimDbProvider, useRecord, useSetRecord, useBridge } from '@aimdb/wasm/react';\n\nfunction App() {\n  return (\n    <AimDbProvider config={{\n      records: [\n        { key: 'sensors.temperature.vienna', schemaType: 'temperature', buffer: 'SingleLatest' },\n      ],\n      bridge: { url: 'wss://api.example.com/ws', subscribeTopics: ['sensors/#'] },\n    }}>\n      <Dashboard />\n    </AimDbProvider>\n  );\n}\n\nfunction Dashboard() {\n  const temp = useRecord<Temperature>('sensors.temperature.vienna');\n  if (!temp) return <p>Loading…</p>;\n  return <span>{temp.celsius.toFixed(1)}°C</span>;\n}\n```\n\n**Available hooks:**\n\n| Hook | Returns | Purpose |\n|------|---------|---------|\n| `useRecord<T>(key)` | `T \\| null` | Subscribe to record, re-render on updates |\n| `useSetRecord<T>(key)` | `(value: T) => void` | Write to record with contract validation |\n| `useAimDb()` | `WasmDb \\| null` | Raw database access for advanced usage |\n| `useBridge()` | `WsBridge \\| null` | Connection status and bridge control |\n\n## Data Contract Enforcement\n\nAll `get` / `set` / `subscribe` calls go through the `Streamable` trait\ndefined in `aimdb-data-contracts`. The `dispatch_streamable!` macro maps\nschema type names to Rust types and performs serde validation:\n\n```\nTypeScript value  →  serde_wasm_bindgen  →  Rust T: Streamable  →  buffer push\n```\n\nAdding a new contract requires only one change: implement `Streamable` for\nthe new type in `aimdb-data-contracts` and add it to `dispatch_streamable!`.\n\n## Build\n\n```bash\n# Install dependencies\nrustup target add wasm32-unknown-unknown\ncargo install wasm-pack\n\n# Compile to WASM\nwasm-pack build --target web --out-dir pkg\n\n# Run headless browser tests\nwasm-pack test --headless --chrome\n```\n\nFrom the workspace root (`make` targets):\n\n```bash\nmake wasm        # Build WASM adapter\nmake wasm-test   # Run WASM tests\nmake check       # Full workspace check (includes WASM)\n```\n\n## Feature Flags\n\n| Feature | Default | Purpose |\n|---------|---------|---------|\n| `wasm-runtime` | ✅ | Full browser runtime (bindings, WsBridge, web-sys) |\n| `alloc` | ✅ | Core buffer + record support (no_std compatible) |\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}