From 0ef0eb446cdbb032d5b6227fe3fbc21ec2fe8ce6 Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:10:18 +0100 Subject: [PATCH 1/5] walletkit-db: fix sqlite-wasm-rs FFI compatibility Map close_v2 wrapper to sqlite3_close on wasm and use SQLITE_TRANSIENT() for bind blob/text destructor arguments to match sqlite-wasm-rs 0.5 signatures. Co-authored-by: otto@toolsforhumanity.com --- walletkit-db/src/ffi.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/walletkit-db/src/ffi.rs b/walletkit-db/src/ffi.rs index 75b150920..872ddf6f8 100644 --- a/walletkit-db/src/ffi.rs +++ b/walletkit-db/src/ffi.rs @@ -514,7 +514,7 @@ mod raw { wasm::sqlite3_open_v2(filename.cast(), pp_db.cast(), flags, z_vfs.cast()) } pub unsafe fn sqlite3_close_v2(db: *mut c_void) -> c_int { - wasm::sqlite3_close_v2(db.cast()) + wasm::sqlite3_close(db.cast()) } pub unsafe fn sqlite3_exec( db: *mut c_void, @@ -566,7 +566,9 @@ mod raw { n: c_int, destructor: isize, ) -> c_int { - wasm::sqlite3_bind_blob(stmt.cast(), index, value, n, destructor) + // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. + let _ = destructor; + wasm::sqlite3_bind_blob(stmt.cast(), index, value, n, wasm::SQLITE_TRANSIENT()) } pub unsafe fn sqlite3_bind_text( stmt: *mut c_void, @@ -575,7 +577,9 @@ mod raw { n: c_int, destructor: isize, ) -> c_int { - wasm::sqlite3_bind_text(stmt.cast(), index, value.cast(), n, destructor) + // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. + let _ = destructor; + wasm::sqlite3_bind_text(stmt.cast(), index, value.cast(), n, wasm::SQLITE_TRANSIENT()) } pub unsafe fn sqlite3_bind_null(stmt: *mut c_void, index: c_int) -> c_int { wasm::sqlite3_bind_null(stmt.cast(), index) From 8885c34daf409d187e9b3e96218eab982950aff1 Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:30:43 +0100 Subject: [PATCH 2/5] ci: add wasm32 walletkit-db compile check Add a dedicated CI job that installs wasm32 target, selects a wasm-capable clang, and runs cargo check for walletkit-db on wasm32-unknown-unknown. Co-authored-by: otto@toolsforhumanity.com --- .github/workflows/ci.yml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0343b42a..c8b6b0e10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,45 @@ jobs: - name: Run clippy run: cargo clippy --workspace --all-targets --all-features + wasm-check: + name: WASM walletkit-db compile check + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.92.0 + targets: wasm32-unknown-unknown + + - name: Select wasm-capable clang + shell: bash + run: | + set -euo pipefail + + CLANG_VERSION="$(clang --version | head -n1 || true)" + CLANG_MAJOR="$(echo "$CLANG_VERSION" | sed -nE 's/.*clang version ([0-9]+).*/\1/p')" + + if [ -n "$CLANG_MAJOR" ] && [ "$CLANG_MAJOR" -ge 15 ]; then + echo "Using system clang: $CLANG_VERSION" + echo "CC_wasm32_unknown_unknown=clang" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=llvm-ar" >> "$GITHUB_ENV" + else + echo "System clang is missing/too old for sqlite-wasm-rs; installing clang-18" + sudo apt-get update + sudo apt-get install -y clang-18 llvm-18 + echo "CC_wasm32_unknown_unknown=clang-18" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=llvm-ar-18" >> "$GITHUB_ENV" + fi + + - name: Run WASM compile check + run: cargo check -p walletkit-db --target wasm32-unknown-unknown + swift-build-and-test: name: Swift Build & Foreign Binding Tests runs-on: macos-14 From b88c3786312562c0daf36068f34ed95691057bde Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:49:30 +0100 Subject: [PATCH 3/5] fmt --- walletkit-db/src/ffi.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/walletkit-db/src/ffi.rs b/walletkit-db/src/ffi.rs index 872ddf6f8..117b017e8 100644 --- a/walletkit-db/src/ffi.rs +++ b/walletkit-db/src/ffi.rs @@ -579,7 +579,13 @@ mod raw { ) -> c_int { // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. let _ = destructor; - wasm::sqlite3_bind_text(stmt.cast(), index, value.cast(), n, wasm::SQLITE_TRANSIENT()) + wasm::sqlite3_bind_text( + stmt.cast(), + index, + value.cast(), + n, + wasm::SQLITE_TRANSIENT(), + ) } pub unsafe fn sqlite3_bind_null(stmt: *mut c_void, index: c_int) -> c_int { wasm::sqlite3_bind_null(stmt.cast(), index) From bd9315bdefad9aa27b214dc46968c4a8523cdadf Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:51:41 +0100 Subject: [PATCH 4/5] ci: make wasm archiver selection robust Detect available llvm-ar variants (or fallback to ar) instead of assuming llvm-ar is on PATH when using system clang for wasm builds. Co-authored-by: otto@toolsforhumanity.com --- .github/workflows/ci.yml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8b6b0e10..e5b147e91 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,16 +65,34 @@ jobs: if [ -n "$CLANG_MAJOR" ] && [ "$CLANG_MAJOR" -ge 15 ]; then echo "Using system clang: $CLANG_VERSION" - echo "CC_wasm32_unknown_unknown=clang" >> "$GITHUB_ENV" - echo "AR_wasm32_unknown_unknown=llvm-ar" >> "$GITHUB_ENV" + CC_BIN="clang" else echo "System clang is missing/too old for sqlite-wasm-rs; installing clang-18" sudo apt-get update sudo apt-get install -y clang-18 llvm-18 - echo "CC_wasm32_unknown_unknown=clang-18" >> "$GITHUB_ENV" - echo "AR_wasm32_unknown_unknown=llvm-ar-18" >> "$GITHUB_ENV" + CC_BIN="clang-18" + CLANG_MAJOR="18" fi + AR_BIN="" + if command -v llvm-ar >/dev/null 2>&1; then + AR_BIN="llvm-ar" + elif [ -n "$CLANG_MAJOR" ] && command -v "llvm-ar-${CLANG_MAJOR}" >/dev/null 2>&1; then + AR_BIN="llvm-ar-${CLANG_MAJOR}" + elif command -v llvm-ar-18 >/dev/null 2>&1; then + AR_BIN="llvm-ar-18" + elif command -v ar >/dev/null 2>&1; then + AR_BIN="ar" + else + echo "No suitable archiver found for wasm build" >&2 + exit 1 + fi + + echo "Using CC: $CC_BIN" + echo "Using AR: $AR_BIN" + echo "CC_wasm32_unknown_unknown=$CC_BIN" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=$AR_BIN" >> "$GITHUB_ENV" + - name: Run WASM compile check run: cargo check -p walletkit-db --target wasm32-unknown-unknown From b7813f76912629e02187d7701e27a42c6155589a Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:54:41 +0100 Subject: [PATCH 5/5] ci: pin wasm C toolchain to llvm 18 Co-authored-by: otto@toolsforhumanity.com --- .github/workflows/ci.yml | 44 ++++++++++------------------------------ 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5b147e91..76cb19936 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,43 +55,21 @@ jobs: toolchain: 1.92.0 targets: wasm32-unknown-unknown - - name: Select wasm-capable clang + - name: Install LLVM toolchain for WASM C build shell: bash run: | set -euo pipefail + sudo apt-get update + sudo apt-get install -y clang-18 llvm-18 - CLANG_VERSION="$(clang --version | head -n1 || true)" - CLANG_MAJOR="$(echo "$CLANG_VERSION" | sed -nE 's/.*clang version ([0-9]+).*/\1/p')" - - if [ -n "$CLANG_MAJOR" ] && [ "$CLANG_MAJOR" -ge 15 ]; then - echo "Using system clang: $CLANG_VERSION" - CC_BIN="clang" - else - echo "System clang is missing/too old for sqlite-wasm-rs; installing clang-18" - sudo apt-get update - sudo apt-get install -y clang-18 llvm-18 - CC_BIN="clang-18" - CLANG_MAJOR="18" - fi - - AR_BIN="" - if command -v llvm-ar >/dev/null 2>&1; then - AR_BIN="llvm-ar" - elif [ -n "$CLANG_MAJOR" ] && command -v "llvm-ar-${CLANG_MAJOR}" >/dev/null 2>&1; then - AR_BIN="llvm-ar-${CLANG_MAJOR}" - elif command -v llvm-ar-18 >/dev/null 2>&1; then - AR_BIN="llvm-ar-18" - elif command -v ar >/dev/null 2>&1; then - AR_BIN="ar" - else - echo "No suitable archiver found for wasm build" >&2 - exit 1 - fi - - echo "Using CC: $CC_BIN" - echo "Using AR: $AR_BIN" - echo "CC_wasm32_unknown_unknown=$CC_BIN" >> "$GITHUB_ENV" - echo "AR_wasm32_unknown_unknown=$AR_BIN" >> "$GITHUB_ENV" + - name: Configure C toolchain for wasm32 + shell: bash + run: | + set -euo pipefail + echo "CC_wasm32_unknown_unknown=clang-18" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=llvm-ar-18" >> "$GITHUB_ENV" + clang-18 --version | head -n1 + llvm-ar-18 --version | head -n1 - name: Run WASM compile check run: cargo check -p walletkit-db --target wasm32-unknown-unknown