From 49d0fa2300f1c51e4b03513bd0cd962035bce314 Mon Sep 17 00:00:00 2001 From: Amit Saxena Date: Thu, 19 Mar 2026 13:42:56 +0000 Subject: [PATCH 1/2] Wasm bindings for js --- bindings/wasm/package.json | 33 ++++++++++++++++++++ bindings/wasm/scripts/build.mjs | 24 ++++++++++++++ bindings/wasm/test/browser_test.html | 25 --------------- bindings/wasm/test/loader.js | 21 ------------- bindings/wasm/test/node_test.js | 9 ------ bindings/wasm/test/package.json | 19 ----------- bindings/wasm/test/test-bun.mjs | 11 +++++++ bindings/wasm/test/test-bundler.mjs | 11 +++++++ bindings/wasm/test/test-deno.ts | 11 +++++++ bindings/wasm/test/test-node.mjs | 11 +++++++ bindings/wasm/test/test_browser.html | 24 ++++++++++++++ bindings/wasm/test/webpack/index.html | 9 ++++++ bindings/wasm/test/webpack/index.js | 18 +++++++++++ bindings/wasm/test/webpack/webpack.config.js | 30 ++++++++++++++++++ bindings/wasm/webpack.config.js | 6 ++++ 15 files changed, 188 insertions(+), 74 deletions(-) create mode 100644 bindings/wasm/package.json create mode 100644 bindings/wasm/scripts/build.mjs delete mode 100644 bindings/wasm/test/browser_test.html delete mode 100644 bindings/wasm/test/loader.js delete mode 100644 bindings/wasm/test/node_test.js delete mode 100644 bindings/wasm/test/package.json create mode 100644 bindings/wasm/test/test-bun.mjs create mode 100644 bindings/wasm/test/test-bundler.mjs create mode 100644 bindings/wasm/test/test-deno.ts create mode 100644 bindings/wasm/test/test-node.mjs create mode 100644 bindings/wasm/test/test_browser.html create mode 100644 bindings/wasm/test/webpack/index.html create mode 100644 bindings/wasm/test/webpack/index.js create mode 100644 bindings/wasm/test/webpack/webpack.config.js create mode 100644 bindings/wasm/webpack.config.js diff --git a/bindings/wasm/package.json b/bindings/wasm/package.json new file mode 100644 index 0000000..7844ba2 --- /dev/null +++ b/bindings/wasm/package.json @@ -0,0 +1,33 @@ +{ + "name": "wasm-binding-test", + "version": "1.0.0", + "type": "module", + "files": [ + "pkg" + ], + "scripts": { + "build": "node scripts/build.mjs", + "test:webpack": "webpack serve --config test/webpack/webpack.config.js", + "test:node": "node test/test-node.mjs", + "test:bun": "bun test/test-bun.mjs", + "test:deno": "deno run --allow-read test/test-deno.ts", + "test:bundler": "node test/test-bundler.mjs", + "test:browser": "npx serve ." + }, + "exports": { + ".": { + "types": "./pkg/node/actra_wasm.d.ts", + "node": "./pkg/node/actra_wasm.js", + "deno": "./pkg/deno/actra_wasm.js", + "browser": "./pkg/web/actra_wasm.js", + "worker": "./pkg/web/actra_wasm.js", + "default": "./pkg/bundler/actra_wasm.js" + } + }, + "devDependencies": { + "html-webpack-plugin": "^5.6.6", + "webpack": "^5.105.4", + "webpack-cli": "^7.0.2", + "webpack-dev-server": "^5.2.3" + } +} diff --git a/bindings/wasm/scripts/build.mjs b/bindings/wasm/scripts/build.mjs new file mode 100644 index 0000000..479c1f9 --- /dev/null +++ b/bindings/wasm/scripts/build.mjs @@ -0,0 +1,24 @@ +import { execSync } from "child_process"; +import { rmSync, existsSync } from "fs"; + +const builds = [ + { target: "bundler", out: "pkg/bundler" }, + { target: "web", out: "pkg/web" }, + { target: "nodejs", out: "pkg/node" }, + { target: "deno", out: "pkg/deno" } +]; + +console.log("CWD:", process.cwd()); + +if (existsSync("pkg")) { + console.log("\nCleaning pkg directory..."); + rmSync("pkg", { recursive: true, force: true }); +} + +for (const b of builds) { + console.log(`\nBuilding ${b.target}...`); + execSync( + `wasm-pack build . --target ${b.target} --out-dir ${b.out} --release`, + { stdio: "inherit" } + ); +} \ No newline at end of file diff --git a/bindings/wasm/test/browser_test.html b/bindings/wasm/test/browser_test.html deleted file mode 100644 index 88e60ca..0000000 --- a/bindings/wasm/test/browser_test.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Actra WASM Test - - -

Actra WASM Browser Test

-
- - - - \ No newline at end of file diff --git a/bindings/wasm/test/loader.js b/bindings/wasm/test/loader.js deleted file mode 100644 index d8bb474..0000000 --- a/bindings/wasm/test/loader.js +++ /dev/null @@ -1,21 +0,0 @@ -let wasmModule; - -export async function loadActra() { - if (!wasmModule) { - if (typeof window !== "undefined") { - // Browser - wasmModule = await import("../pkg/web/actra_wasm.js"); - // Prefer default export init (common in wasm-pack) - if (wasmModule.default) { - await wasmModule.default(); - } else if (wasmModule.init) { - await wasmModule.init(); - } - } else { - // Node, Bun, Cloudflare Workers, Lambda - wasmModule = await import("../pkg/all/actra_wasm.js"); - } - } - - return wasmModule; -} \ No newline at end of file diff --git a/bindings/wasm/test/node_test.js b/bindings/wasm/test/node_test.js deleted file mode 100644 index 550d5be..0000000 --- a/bindings/wasm/test/node_test.js +++ /dev/null @@ -1,9 +0,0 @@ -import { loadActra } from "./loader.js"; - -async function run() { - const wasm = await loadActra(); - console.log("Actra WASM compiler version:", wasm.Actra.compiler_version()); - -} - -run(); \ No newline at end of file diff --git a/bindings/wasm/test/package.json b/bindings/wasm/test/package.json deleted file mode 100644 index 746685a..0000000 --- a/bindings/wasm/test/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "test", - "type": "module", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "start": "node --experimental-wasm-modules index.js" - }, - "keywords": [], - "author": "", - "license": "Apache-2.0", - "description": "", - "dependencies": { - "actra-wasm": "file:../pkg" - }, - "devDependencies": { - "esbuild": "^0.27.4" - } -} \ No newline at end of file diff --git a/bindings/wasm/test/test-bun.mjs b/bindings/wasm/test/test-bun.mjs new file mode 100644 index 0000000..e4da964 --- /dev/null +++ b/bindings/wasm/test/test-bun.mjs @@ -0,0 +1,11 @@ +async function run() { + try { + const wasm = await import("../pkg/node/actra_wasm.js"); + const version = wasm.Actra.compiler_version(); + console.log("Actra WASM compiler version:", version); + } catch (err) { + console.error(err); + } +} + +run(); \ No newline at end of file diff --git a/bindings/wasm/test/test-bundler.mjs b/bindings/wasm/test/test-bundler.mjs new file mode 100644 index 0000000..44f5f93 --- /dev/null +++ b/bindings/wasm/test/test-bundler.mjs @@ -0,0 +1,11 @@ +async function run() { + try { + const wasm = await import("../pkg/bundler/actra_wasm.js"); + const version = wasm.Actra.compiler_version(); + console.log("Actra WASM compiler version:", version); + } catch (err) { + console.error(err); + } +} + +run(); \ No newline at end of file diff --git a/bindings/wasm/test/test-deno.ts b/bindings/wasm/test/test-deno.ts new file mode 100644 index 0000000..c37a6e8 --- /dev/null +++ b/bindings/wasm/test/test-deno.ts @@ -0,0 +1,11 @@ +async function run() { + try { + const wasm = await import("../pkg/deno/actra_wasm.js"); + const version = wasm.Actra.compiler_version(); + console.log("Actra WASM compiler version:", version); + } catch (err) { + console.error(err); + } +} + +run(); \ No newline at end of file diff --git a/bindings/wasm/test/test-node.mjs b/bindings/wasm/test/test-node.mjs new file mode 100644 index 0000000..e4da964 --- /dev/null +++ b/bindings/wasm/test/test-node.mjs @@ -0,0 +1,11 @@ +async function run() { + try { + const wasm = await import("../pkg/node/actra_wasm.js"); + const version = wasm.Actra.compiler_version(); + console.log("Actra WASM compiler version:", version); + } catch (err) { + console.error(err); + } +} + +run(); \ No newline at end of file diff --git a/bindings/wasm/test/test_browser.html b/bindings/wasm/test/test_browser.html new file mode 100644 index 0000000..ebd1cdd --- /dev/null +++ b/bindings/wasm/test/test_browser.html @@ -0,0 +1,24 @@ + + + + +

Browser Test

+
+ + + + + + \ No newline at end of file diff --git a/bindings/wasm/test/webpack/index.html b/bindings/wasm/test/webpack/index.html new file mode 100644 index 0000000..138467d --- /dev/null +++ b/bindings/wasm/test/webpack/index.html @@ -0,0 +1,9 @@ + + + + +

Webpack WASM Test

+
Loading...
+ + + \ No newline at end of file diff --git a/bindings/wasm/test/webpack/index.js b/bindings/wasm/test/webpack/index.js new file mode 100644 index 0000000..04ff32e --- /dev/null +++ b/bindings/wasm/test/webpack/index.js @@ -0,0 +1,18 @@ +async function run() { + const el = document.getElementById("output"); + + try { + el.textContent = "Loading WASM..."; + + const wasm = await import("../../pkg/bundler/actra_wasm.js"); + + const version = wasm.Actra.compiler_version(); + + el.textContent = "Compiler Version: " + version; + } catch (err) { + console.error(err); + el.textContent = "Error loading WASM"; + } +} + +run(); \ No newline at end of file diff --git a/bindings/wasm/test/webpack/webpack.config.js b/bindings/wasm/test/webpack/webpack.config.js new file mode 100644 index 0000000..69b5a08 --- /dev/null +++ b/bindings/wasm/test/webpack/webpack.config.js @@ -0,0 +1,30 @@ +import path from "path"; +import HtmlWebpackPlugin from "html-webpack-plugin"; + +export default { + mode: "development", + devtool: "source-map", + + entry: "./test/webpack/index.js", + + output: { + path: path.resolve("./test/webpack/dist"), + filename: "bundle.js", + publicPath: "/" + }, + + experiments: { + asyncWebAssembly: true + }, + + plugins: [ + new HtmlWebpackPlugin({ + template: "./test/webpack/index.html" + }) + ], + + devServer: { + port: 8080, + open: true + } +}; \ No newline at end of file diff --git a/bindings/wasm/webpack.config.js b/bindings/wasm/webpack.config.js new file mode 100644 index 0000000..c8f80dc --- /dev/null +++ b/bindings/wasm/webpack.config.js @@ -0,0 +1,6 @@ +export default { + mode: "development", + experiments: { + asyncWebAssembly: true + } +}; \ No newline at end of file From c536596cfd33c258d3c104b231cd95a55227fc8d Mon Sep 17 00:00:00 2001 From: Amit Saxena Date: Thu, 19 Mar 2026 19:47:43 +0530 Subject: [PATCH 2/2] version update & changelog added --- .gitignore | 3 ++- CHANGELOG.md | 20 ++++++++++++++++++++ Cargo.toml | 2 +- bindings/node/test_basic.js | 2 +- scripts/wasm_pack.sh | 1 + 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.gitignore b/.gitignore index 8ea831d..5ca0757 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,5 @@ ____* bindings/wasm/pkg/ sdk/js/server/pkg/ sdk/js/server/dist/ -sdk/js/web/pkg/ \ No newline at end of file +sdk/js/web/pkg/ +pnpm-lock.yaml \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f7d7fa9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,20 @@ +### v6.0.1 - 19 March 2026 +- added wasm bindings for Node, Bun, Browser, Deno and Edge +- Bug fix in wasm binding + +### v6.0 - 18 March 26 +- added has_decision_observer in runtime : Python SDK +- Fixed Rust engine bugs +- Support for JS server sdk + +### v0.5.1 +- wasm bindings added + +### v5.0 +- Support for MCP, Agents and LLM integrations in Python SDK + +### v0.4.0 & Earlier +- Bug fixes +- Added Error class in Python SDK +- Python SDK +- Initial release with core rust engine \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index bb5d439..06c0483 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.6.0" +version = "0.6.1" edition = "2021" license = "Apache-2.0" authors = ["Amit Saxena"] diff --git a/bindings/node/test_basic.js b/bindings/node/test_basic.js index f7111b6..31338b1 100644 --- a/bindings/node/test_basic.js +++ b/bindings/node/test_basic.js @@ -36,7 +36,7 @@ const actra = new Actra(schema, policy) const result = actra.evaluate({ action: { type: "delete" }, actor: { role: "admin" }, - snapshot: {} + snapshot: {fraud_flag:true} }) console.log(result) \ No newline at end of file diff --git a/scripts/wasm_pack.sh b/scripts/wasm_pack.sh index 69eac1a..2f2176e 100644 --- a/scripts/wasm_pack.sh +++ b/scripts/wasm_pack.sh @@ -29,6 +29,7 @@ wasm-pack build bindings/wasm --target web --out-dir pkg/web --release # 2. Server build wasm-pack build bindings/wasm --target nodejs --out-dir pkg/server --release +wasm-pack build bindings/wasm --target bundler --out-dir pkg/server --release # cargo install wasm-opt