Confium for TypeScript / WASM Developers
@confium/confium-wasm is the WASM-compiled Confium verifier. Targets browser, Node.js, and edge runtimes (Cloudflare Workers, Vercel Edge, Deno, Bun). Verifier-only by design.
Install
npm install @confium/confium-wasm
Or via any package manager:
pnpm add @confium/confium-wasm
yarn add @confium/confium-wasm
bun add @confium/confium-wasm
Hello, verify (browser)
<script type="module">
import init, { CompositeSignature } from '@confium/confium-wasm';
// One-time WASM bootstrap (~460 KB)
await init();
const sig = new CompositeSignature(components);
const message = new TextEncoder().encode('hello, threshold world');
const result = sig.verify(message);
console.log('valid:', result.all_verified);
for (const c of result.per_component) {
console.log(` ${c.algorithm}: ${c.valid}`);
}
</script>
Hello, verify (Node.js)
import init, { CompositeSignature } from '@confium/confium-wasm';
import { readFileSync } from 'node:fs';
await init(); // One-time bootstrap
const sigJson = readFileSync('sig.json', 'utf8');
const sig = CompositeSignature.from_json(sigJson);
const message = Buffer.from('hello, threshold world');
const result = sig.verify(message);
console.log('valid:', result.all_verified);
Hello, verify (Cloudflare Workers)
// worker.ts
import init, { CompositeSignature } from '@confium/confium-wasm';
export default {
async fetch(req: Request): Promise<Response> {
await init(); // Loads WASM from the bundler
const body = await req.json();
const sig = CompositeSignature.from_json(body.signature);
const message = new TextEncoder().encode(body.message);
const result = sig.verify(message);
return Response.json({
valid: result.all_verified,
components: result.per_component,
});
},
};
Build with the sign feature only if you need server-side signing (Cloudflare Workers, Fastly Compute@Edge):
rustup target add wasm32-wasip1
cargo build --target wasm32-wasip1 --features sign --release
Framework integrations
React
import { useEffect, useState } from 'react';
import init, { CompositeSignature } from '@confium/confium-wasm';
export function VerifyForm() {
const [ready, setReady] = useState(false);
useEffect(() => { init().then(() => setReady(true)); }, []);
if (!ready) return <p>Loading verifier…</p>;
const handleVerify = async () => {
const sig = new CompositeSignature(/* ... */);
const result = sig.verify(message);
// ...
};
return <button onClick=\{handleVerify\}>Verify</button>;
}
Vue 3
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import init, { CompositeSignature } from '@confium/confium-wasm';
const ready = ref(false);
onMounted(async () => { await init(); ready.value = true; });
</script>
Svelte
<script lang="ts">
import { onMount } from 'svelte';
import init, { CompositeSignature } from '@confium/confium-wasm';
let ready = false;
onMount(async () => { await init(); ready = true; });
</script>
Astro
---
// Server-side import is fine in Astro
import init, { CompositeSignature } from '@confium/confium-wasm';
await init();
---
<script>
// Client-side: re-init then verify
import('@confium/confium-wasm').then(async ({ init, CompositeSignature }) => {
await init();
// ...
});
</script>
Feature flags (build from source)
The WASM package is shipped with these features on by default:
verify-compositeverify-transparencyverify-pkiverify-attributes
To shrink the bundle, build with a subset:
wasm-pack build crates/confium-wasm \
--target web \
--release \
--scope confium \
--no-default-features \
--features verify-transparency
This produces a ~180 KB package instead of the default ~460 KB.
Subresource Integrity (SRI)
For CDN-served WASM, add SRI to detect CDN compromise:
<script type="module"
src="https://cdn.example.com/@confium/confium-wasm@0.4.0/confium_wasm.js"
integrity="sha384-..."
crossorigin="anonymous">
</script>
Generate the hash:
curl -s https://cdn.example.com/@confium/confium-wasm@0.4.0/confium_wasm.js | \
openssl dgst -sha384 -binary | base64
Performance
| Operation | Latency (Chrome on M1) |
|---|---|
init() (one-time) |
~50 ms |
| Composite verify (Ed25519) | ~0.2 ms |
| Composite verify (Ed25519 + ECDSA-P256) | ~0.5 ms |
| Transparency inclusion proof verify | ~0.1 ms |
| Cert chain verify (1 intermediate) | ~1 ms |
Bundle size: ~460 KB minified (default features). Use feature flags to shrink.
See also
- npm: @confium/confium-wasm
- WASM verifier spec
- Browser playground
- Verify-in-browser cookbook
- Cookbook — task-focused recipes