@ferscloud/fers-calculation
v0.2.37
Published
High-performance structural engineering FEM solver compiled from Rust to WebAssembly. Runs entirely in the browser — no server round-trip per calculation.
Readme
@ferscloud/fers-calculation
High-performance structural engineering FEM solver compiled from Rust to WebAssembly. Runs entirely in the browser — no server round-trip per calculation.
Installation
npm install @ferscloud/fers-calculationQuick start — free tier (up to 100 members)
import init, { calculate_from_json } from "@ferscloud/fers-calculation";
await init(); // load the WASM module once
const result = calculate_from_json(JSON.stringify(myModel));
const data = JSON.parse(result);No API key required. Works for any model with up to 100 members.
Authenticated tier — Pro (up to 10 000 members)
Pro limits are unlocked by passing a short-lived signed token issued by the FERS Cloud server. The token is verified inside the WASM using an Ed25519 public key baked into the binary — it cannot be forged.
How it works
Your server → POST https://ferscloud.com/api/solver/token → signed 30-min token
(X-API-Key: <your-api-key>)
Browser → calculate_from_json_with_token(model, token) → Pro limits unlocked1. Get an API key
Log in at ferscloud.com, go to Profile → API Keys, and create a key. Store it as an environment variable on your server — never in browser code.
2. Backend: fetch a solve token
Your server fetches and caches the token. Example for a Next.js API route:
// pages/api/solve-token.ts
const FERS_API_KEY = process.env.FERS_API_KEY!;
let cached: { token: string; expiresAt: number } | null = null;
export default async function handler(req, res) {
const now = Date.now();
// Re-use if more than 5 minutes remain
if (cached && cached.expiresAt - now > 5 * 60 * 1000) {
return res.json({ token: cached.token });
}
const resp = await fetch("https://ferscloud.com/api/solver/token", {
method: "POST",
headers: { "X-API-Key": FERS_API_KEY },
});
if (!resp.ok) return res.status(502).json({ error: "Token fetch failed" });
const { token, expiresAt } = await resp.json();
cached = { token, expiresAt: new Date(expiresAt).getTime() };
return res.json({ token });
}Same pattern works for Express, Deno, Bun, Cloudflare Workers, or any server-side runtime.
3. Frontend: call the solver with the token
import init, { calculate_from_json_with_token } from "@ferscloud/fers-calculation";
await init();
const { token } = await fetch("/api/solve-token").then(r => r.json());
const result = calculate_from_json_with_token(JSON.stringify(myModel), token);
const data = JSON.parse(result);If the token is missing, expired, or invalid, the solver falls back to the free 100-member limit — it never throws.
Tier comparison
| Feature | Free | Pro |
|---|---|---|
| Max members | 100 | 10 000 |
| WASM function | calculate_from_json | calculate_from_json_with_token |
| Requires token | No | Yes |
| Token TTL | — | 30 minutes |
Security note
Keep your FERS_API_KEY server-side only. The solve token it fetches is safe to pass to the browser — it is short-lived and cryptographically signed. Only FERS Cloud can issue valid tokens; the browser WASM can only verify them.
