From db99a3d79a005fe2677fb18ec47b4ecdd6a2692e Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:00:37 +0100 Subject: [PATCH 01/14] chore: add types/node to project --- package.json | 5 +++-- pnpm-lock.yaml | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 70c1f7ef07..fa89f3c7bc 100644 --- a/package.json +++ b/package.json @@ -57,8 +57,9 @@ }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", "devDependencies": { - "husky": "^9.1.7", - "@changesets/cli": "^2.27.1" + "@changesets/cli": "^2.27.1", + "@types/node": "22.7.5", + "husky": "^9.1.7" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a45297c81f..0a80eb77e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,11 +18,21 @@ importers: '@changesets/cli': specifier: ^2.27.1 version: 2.29.6(@types/node@22.7.5) + '@types/node': + specifier: 22.7.5 + version: 22.7.5 husky: specifier: ^9.1.7 version: 9.1.7 - crates/wasm: {} + crates/wasm: + devDependencies: + execa: + specifier: ^8.0.1 + version: 8.0.1 + replace-in-file: + specifier: ^7.2.0 + version: 7.2.0 docs: dependencies: @@ -8171,6 +8181,11 @@ packages: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} + replace-in-file@7.2.0: + resolution: {integrity: sha512-CiLXVop3o8/h2Kd1PwKPPimmS9wUV0Ki6Fl8+1ITD35nB3Gl/PrW5IONpTE0AXk0z4v8WYcpEpdeZqMXvSnWpg==} + engines: {node: '>=10'} + hasBin: true + req-cwd@2.0.0: resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} engines: {node: '>=4'} @@ -19780,6 +19795,12 @@ snapshots: repeat-string@1.6.1: {} + replace-in-file@7.2.0: + dependencies: + chalk: 4.1.2 + glob: 8.1.0 + yargs: 17.7.2 + req-cwd@2.0.0: dependencies: req-from: 2.0.0 From c87c2e7082ac65be496b9cb9914810ba63d4ee6d Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:01:11 +0100 Subject: [PATCH 02/14] chore: ts not ignored by npm --- crates/wasm/.npmignore | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/wasm/.npmignore b/crates/wasm/.npmignore index d8dcb746e2..2ee1b99cba 100644 --- a/crates/wasm/.npmignore +++ b/crates/wasm/.npmignore @@ -1,6 +1,5 @@ src/ scripts/ -*.ts tsconfig.json .gitignore node_modules/ From 486ac42dd3fef40d702052e2af9969b300e6cac9 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:02:13 +0100 Subject: [PATCH 03/14] chore: add inline wasm to web bundle --- crates/wasm/init_web.js | 39 +++++++++++++++++++++++++++++++++-- crates/wasm/package.json | 16 +++++++++------ crates/wasm/scripts/build.js | 40 ++++++++++++++++++++++++++++++++++++ crates/wasm/scripts/build.sh | 4 ---- 4 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 crates/wasm/scripts/build.js delete mode 100755 crates/wasm/scripts/build.sh diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js index 7537ceb308..416815264f 100644 --- a/crates/wasm/init_web.js +++ b/crates/wasm/init_web.js @@ -4,7 +4,42 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import init from "./dist/web/e3_wasm.js"; +import * as bindgen from "../srcWasm/summon_ts_wasm.js"; + +let promise; + export default async function initializeWasm(initParams) { - return await init(initParams); + promise ??= (async () => { + const { default: base64 } = await import( + "../srcWasm/summon_ts_wasm_base64.js" + ); + + const binaryString = atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + bindgen.initSync({ module: bytes }); + bindgen.init_ext(); + lib = bindgen; + + return bindgen; + })(); + + return promise; +} + +function base64ToUint8Array(base64) { + const binaryString = atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + return bytes; } diff --git a/crates/wasm/package.json b/crates/wasm/package.json index b8af9950bc..95cfbe3224 100644 --- a/crates/wasm/package.json +++ b/crates/wasm/package.json @@ -2,12 +2,12 @@ "name": "@enclave-e3/wasm", "version": "0.0.13-test", "description": "Wasm modules for enclave.", - "main": "dist/nodejs/e3_wasm.js", + "main": "dist/node/e3_wasm.js", "module": "dist/web/e3_wasm.js", "types": "dist/web/e3_wasm.d.ts", "files": [ "dist/", - "dist/nodejs/**", + "dist/node/**", "dist/web/**", "init_node.js", "init_node.cjs", @@ -18,15 +18,15 @@ "access": "public" }, "scripts": { - "build": "./scripts/build.sh", + "build": "rm -rf dist && node scripts/build.js", "prerelease": "pnpm build", "release": "pnpm publish --access=public" }, "exports": { ".": { "node": { - "types": "./dist/nodejs/e3_wasm.d.ts", - "default": "./dist/nodejs/e3_wasm.js" + "types": "./dist/node/e3_wasm.d.ts", + "default": "./dist/node/e3_wasm.js" }, "browser": { "types": "./dist/web/e3_wasm.d.ts", @@ -61,5 +61,9 @@ "url": "https://github.com/gnosisguild" }, "license": "LGPL-3.0-only", - "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" + "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", + "devDependencies": { + "execa": "^8.0.1", + "replace-in-file": "^7.2.0" + } } diff --git a/crates/wasm/scripts/build.js b/crates/wasm/scripts/build.js new file mode 100644 index 0000000000..5e6f524477 --- /dev/null +++ b/crates/wasm/scripts/build.js @@ -0,0 +1,40 @@ +import { execa } from "execa"; +import { readFile, writeFile, unlink } from "fs/promises"; +import replaceInFile from "replace-in-file"; + +try { + // Build WASM with web and node target - generates e3_wasm.js and e3_wasm_bg.wasm. + await execa("wasm-pack", [ + "build", + "--target=web", + "--out-dir=dist/web", + "--no-pack", + ]); + await execa("wasm-pack", [ + "build", + "--target=nodejs", + "--out-dir=dist/node", + "--no-pack", + ]); + + // Convert WASM binary to base64 for bundler compatibility. + const wasmBinary = await readFile("./dist/web/e3_wasm_bg.wasm"); + const base64Src = `export default '${wasmBinary.toString("base64")}';\n`; + + // Parallel cleanup and JS modification to prevent Next.js and other bundlers static analysis issues. + await Promise.all([ + unlink("./dist/web/e3_wasm_bg.wasm"), + unlink("./dist/web/e3_wasm_bg.wasm.d.ts"), + unlink("./dist/web/.gitignore"), + unlink("./dist/web/.gitignore"), + replaceInFile({ + files: "./dist/web/e3_wasm.js", + from: "module_or_path = new URL('e3_wasm_bg.wasm', import.meta.url);", + to: "throw new Error('not supported')", + }), + writeFile("./dist/web/e3_wasm_base64.js", base64Src), + ]); +} catch (error) { + console.error(error); + process.exit(1); +} diff --git a/crates/wasm/scripts/build.sh b/crates/wasm/scripts/build.sh deleted file mode 100755 index a1ab3209d1..0000000000 --- a/crates/wasm/scripts/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash - -pnpm wasm-pack build --target web --out-dir dist/web -pnpm wasm-pack build --target nodejs --out-dir dist/nodejs From bb2971aedf7f56249a410f01e8417385c9170610 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:04:55 +0100 Subject: [PATCH 04/14] chore: remove base64 to uint8 array function --- crates/wasm/init_web.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js index 416815264f..c390832b19 100644 --- a/crates/wasm/init_web.js +++ b/crates/wasm/init_web.js @@ -31,15 +31,3 @@ export default async function initializeWasm(initParams) { return promise; } - -function base64ToUint8Array(base64) { - const binaryString = atob(base64); - const len = binaryString.length; - const bytes = new Uint8Array(len); - - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - return bytes; -} From 37a3ea0ab4bf03ced6607a9ecf684846341557c9 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:06:15 +0100 Subject: [PATCH 05/14] docs: add license header to build script --- crates/wasm/scripts/build.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/wasm/scripts/build.js b/crates/wasm/scripts/build.js index 5e6f524477..0124cd0a2d 100644 --- a/crates/wasm/scripts/build.js +++ b/crates/wasm/scripts/build.js @@ -1,3 +1,9 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + import { execa } from "execa"; import { readFile, writeFile, unlink } from "fs/promises"; import replaceInFile from "replace-in-file"; From 6a50383454d1ccf3014887496f6d053657af00a3 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:12:35 +0100 Subject: [PATCH 06/14] chore: delete node gitignore --- crates/wasm/scripts/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/wasm/scripts/build.js b/crates/wasm/scripts/build.js index 0124cd0a2d..b9462239fc 100644 --- a/crates/wasm/scripts/build.js +++ b/crates/wasm/scripts/build.js @@ -32,7 +32,7 @@ try { unlink("./dist/web/e3_wasm_bg.wasm"), unlink("./dist/web/e3_wasm_bg.wasm.d.ts"), unlink("./dist/web/.gitignore"), - unlink("./dist/web/.gitignore"), + unlink("./dist/node/.gitignore"), replaceInFile({ files: "./dist/web/e3_wasm.js", from: "module_or_path = new URL('e3_wasm_bg.wasm', import.meta.url);", From 5d30950209b5875a20d87e4b78b754a64f517fca Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 14:55:20 +0100 Subject: [PATCH 07/14] chore: update import path to correctweb bundle --- crates/wasm/init_web.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js index c390832b19..fe2a561bc2 100644 --- a/crates/wasm/init_web.js +++ b/crates/wasm/init_web.js @@ -10,9 +10,7 @@ let promise; export default async function initializeWasm(initParams) { promise ??= (async () => { - const { default: base64 } = await import( - "../srcWasm/summon_ts_wasm_base64.js" - ); + const { default: base64 } = await import("../dist/web/e3_wasm_base64.js"); const binaryString = atob(base64); const len = binaryString.length; From f06ee8aeb744a7615e639b55a07cc91f094ab039 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:07:23 +0100 Subject: [PATCH 08/14] chore: add type to package.json --- crates/wasm/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/wasm/package.json b/crates/wasm/package.json index 95cfbe3224..4754214cfc 100644 --- a/crates/wasm/package.json +++ b/crates/wasm/package.json @@ -2,6 +2,7 @@ "name": "@enclave-e3/wasm", "version": "0.0.13-test", "description": "Wasm modules for enclave.", + "type": "module", "main": "dist/node/e3_wasm.js", "module": "dist/web/e3_wasm.js", "types": "dist/web/e3_wasm.d.ts", From aa34e6c759f9b4e170b067d404ab07a57d0d8d81 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:08:01 +0100 Subject: [PATCH 09/14] chore: update import path to correct bundle --- crates/wasm/init_web.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js index fe2a561bc2..9ed09b7ba0 100644 --- a/crates/wasm/init_web.js +++ b/crates/wasm/init_web.js @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import * as bindgen from "../srcWasm/summon_ts_wasm.js"; +import * as bindgen from "../dist/web/e3_wasm.js"; let promise; @@ -20,7 +20,7 @@ export default async function initializeWasm(initParams) { bytes[i] = binaryString.charCodeAt(i); } - bindgen.initSync({ module: bytes }); + bindgen.initSync(bytes); bindgen.init_ext(); lib = bindgen; From 6577ac23c5487dd0ac8ed2d53fcd78904d2bbeb2 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:08:24 +0100 Subject: [PATCH 10/14] chore: update build script to use rm from fs --- crates/wasm/scripts/build.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/wasm/scripts/build.js b/crates/wasm/scripts/build.js index b9462239fc..b0f1c2347c 100644 --- a/crates/wasm/scripts/build.js +++ b/crates/wasm/scripts/build.js @@ -5,7 +5,7 @@ // or FITNESS FOR A PARTICULAR PURPOSE. import { execa } from "execa"; -import { readFile, writeFile, unlink } from "fs/promises"; +import { readFile, writeFile, rm } from "fs/promises"; import replaceInFile from "replace-in-file"; try { @@ -29,10 +29,12 @@ try { // Parallel cleanup and JS modification to prevent Next.js and other bundlers static analysis issues. await Promise.all([ - unlink("./dist/web/e3_wasm_bg.wasm"), - unlink("./dist/web/e3_wasm_bg.wasm.d.ts"), - unlink("./dist/web/.gitignore"), - unlink("./dist/node/.gitignore"), + await Promise.all([ + rm("./dist/web/e3_wasm_bg.wasm", { force: true }), + rm("./dist/web/e3_wasm_bg.wasm.d.ts", { force: true }), + rm("./dist/web/.gitignore", { force: true }), + rm("./dist/node/.gitignore", { force: true }), + ]), replaceInFile({ files: "./dist/web/e3_wasm.js", from: "module_or_path = new URL('e3_wasm_bg.wasm', import.meta.url);", From 04e7e988fe8329edf961ce3bbd9ff534fa20dc24 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:11:22 +0100 Subject: [PATCH 11/14] chore: disable wasm URL in web bundle --- crates/wasm/scripts/build.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/wasm/scripts/build.js b/crates/wasm/scripts/build.js index b0f1c2347c..276b2e2805 100644 --- a/crates/wasm/scripts/build.js +++ b/crates/wasm/scripts/build.js @@ -37,8 +37,8 @@ try { ]), replaceInFile({ files: "./dist/web/e3_wasm.js", - from: "module_or_path = new URL('e3_wasm_bg.wasm', import.meta.url);", - to: "throw new Error('not supported')", + from: /module_or_path\s*=\s*new URL\(['"]e3_wasm_bg\.wasm['"],\s*import\.meta\.url\);\s*/g, + to: "/* wasm URL disabled: load via @enclave-e3/wasm/init */\n", }), writeFile("./dist/web/e3_wasm_base64.js", base64Src), ]); From eff9042d5aaccb4fe85f08ba84ffd462b270bf8b Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:41:26 +0100 Subject: [PATCH 12/14] chore: remove type=module from wasm package --- crates/wasm/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/wasm/package.json b/crates/wasm/package.json index 4754214cfc..95cfbe3224 100644 --- a/crates/wasm/package.json +++ b/crates/wasm/package.json @@ -2,7 +2,6 @@ "name": "@enclave-e3/wasm", "version": "0.0.13-test", "description": "Wasm modules for enclave.", - "type": "module", "main": "dist/node/e3_wasm.js", "module": "dist/web/e3_wasm.js", "types": "dist/web/e3_wasm.d.ts", From 070428601ebfbfd0e73992eeab3bdf130a46aa5c Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:44:10 +0100 Subject: [PATCH 13/14] chore: update import path to correct bundle --- crates/wasm/init_web.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js index 9ed09b7ba0..5e3181db4c 100644 --- a/crates/wasm/init_web.js +++ b/crates/wasm/init_web.js @@ -4,13 +4,13 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import * as bindgen from "../dist/web/e3_wasm.js"; +import * as bindgen from "./dist/web/e3_wasm.js"; let promise; export default async function initializeWasm(initParams) { promise ??= (async () => { - const { default: base64 } = await import("../dist/web/e3_wasm_base64.js"); + const { default: base64 } = await import("./dist/web/e3_wasm_base64.js"); const binaryString = atob(base64); const len = binaryString.length; From afb947818b0a57e8ab2d0db3c12513bf0ea097eb Mon Sep 17 00:00:00 2001 From: Cedoor Date: Wed, 17 Sep 2025 15:56:16 +0100 Subject: [PATCH 14/14] fix: remove unexisting variables --- crates/wasm/init_web.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js index 5e3181db4c..5c191eed87 100644 --- a/crates/wasm/init_web.js +++ b/crates/wasm/init_web.js @@ -21,8 +21,6 @@ export default async function initializeWasm(initParams) { } bindgen.initSync(bytes); - bindgen.init_ext(); - lib = bindgen; return bindgen; })();