diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2a0a40d..27466bd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -237,3 +237,47 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} file-name: libpowersync_x64.dylib tag: ${{ needs.draft_release.outputs.tag }} + + publish_wasm: + name: Publish WASM builds + needs: [draft_release] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + + - name: Install Rust Nightly + uses: dtolnay/rust-toolchain@stable + with: + toolchain: nightly-2024-05-18 + components: rust-src + + - name: Setup emsdk + uses: mymindstorm/setup-emsdk@v14 + with: + version: 3.1.68 + + - name: Build WASM + run: ./tool/build_wasm.sh + + - name: Upload libpowersync.wasm + uses: ./.github/actions/upload + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + file-name: libpowersync.wasm + tag: ${{ needs.draft_release.outputs.tag }} + + - name: Upload libpowersync-async.wasm + uses: ./.github/actions/upload + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + file-name: libpowersync-async.wasm + tag: ${{ needs.draft_release.outputs.tag }} + + - name: Upload libpowersync-wasm.a + uses: ./.github/actions/upload + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + file-name: libpowersync-wasm.a + tag: ${{ needs.draft_release.outputs.tag }} diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 04c0499..3e2c6e8 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -1,6 +1,6 @@ on: push: -name: "linux" +name: "wasm" jobs: build_wasm: name: Basic WASM build @@ -16,5 +16,10 @@ jobs: toolchain: nightly-2024-05-18 components: rust-src - - name: Build WASM bytecode - run: RUSTFLAGS="--emit=llvm-bc -C linker=/bin/true" cargo build -p powersync_loadable --profile wasm --no-default-features --features "powersync_core/static powersync_core/omit_load_extension sqlite_nostd/static sqlite_nostd/omit_load_extension" -Z build-std=panic_abort,core,alloc --target wasm32-unknown-emscripten + - name: Setup emsdk + uses: mymindstorm/setup-emsdk@v14 + with: + version: 3.1.68 + + - name: Build WASM + run: ./tool/build_wasm.sh diff --git a/Cargo.toml b/Cargo.toml index c51e860..0997757 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,10 +19,9 @@ lto = true [profile.wasm] inherits = "release" -# Enabling LTO in WASM build gives: -# warning: Linking globals named '__rust_alloc_error_handler': symbol multiply defined! -# error: failed to load bitcode of module "sgnxivc9sns8d6t": -lto = false + +[profile.wasm_asyncify] +inherits = "wasm" [workspace.package] version = "0.3.0" diff --git a/crates/core/src/kv.rs b/crates/core/src/kv.rs index 040b65d..70b5bd8 100644 --- a/crates/core/src/kv.rs +++ b/crates/core/src/kv.rs @@ -36,7 +36,7 @@ fn powersync_client_id_impl( create_sqlite_text_fn!( powersync_client_id, powersync_client_id_impl, - "powersync_last_synced_at" + "powersync_client_id" ); fn powersync_last_synced_at_impl( diff --git a/crates/loadable/Cargo.toml b/crates/loadable/Cargo.toml index 952b1fe..de22f9f 100644 --- a/crates/loadable/Cargo.toml +++ b/crates/loadable/Cargo.toml @@ -10,7 +10,7 @@ keywords.workspace = true [lib] name = "powersync" -crate-type = ["cdylib"] +crate-type = ["cdylib", "staticlib"] [dependencies] sqlite_nostd = { workspace=true } diff --git a/crates/loadable/src/lib.rs b/crates/loadable/src/lib.rs index 3c64054..c6ca649 100644 --- a/crates/loadable/src/lib.rs +++ b/crates/loadable/src/lib.rs @@ -30,28 +30,3 @@ fn panic(_info: &core::panic::PanicInfo) -> ! { #[cfg(not(test))] #[lang = "eh_personality"] extern "C" fn eh_personality() {} - -#[cfg(target_family = "wasm")] -#[no_mangle] -pub fn __rust_alloc_error_handler(_: core::alloc::Layout) -> ! { - core::intrinsics::abort() -} - -#[cfg(target_family = "wasm")] -#[no_mangle] -static __rust_alloc_error_handler_should_panic: u8 = 0; - -#[cfg(target_family = "wasm")] -#[no_mangle] -static _CLOCK_PROCESS_CPUTIME_ID: i32 = 1; - -#[cfg(target_family = "wasm")] -#[no_mangle] -static _CLOCK_THREAD_CPUTIME_ID: i32 = 1; - -// Not used, but must be defined in some cases. Most notably when using native sqlite3 and loading -// the extension. -// #[allow(non_upper_case_globals)] -// #[no_mangle] -// pub static mut _Unwind_Resume: *mut core::ffi::c_void = core::ptr::null_mut(); - diff --git a/tool/build_wasm.sh b/tool/build_wasm.sh new file mode 100755 index 0000000..da505e7 --- /dev/null +++ b/tool/build_wasm.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -e + +# Normal build +# target/wasm32-unknown-emscripten/wasm/powersync.wasm +RUSTFLAGS="-C link-arg=-sSIDE_MODULE=2" \ + cargo build \ + -p powersync_loadable \ + --profile wasm \ + --no-default-features \ + --features "powersync_core/static powersync_core/omit_load_extension sqlite_nostd/omit_load_extension" \ + -Z build-std=panic_abort,core,alloc \ + --target wasm32-unknown-emscripten + +cp "target/wasm32-unknown-emscripten/wasm/powersync.wasm" "libpowersync.wasm" + +# Asyncify +# target/wasm32-unknown-emscripten/wasm_asyncify/powersync.wasm +RUSTFLAGS="-C link-arg=-sSIDE_MODULE=2 -C link-arg=-sASYNCIFY=1 -C link-arg=-sJSPI_IMPORTS=@wasm/asyncify_imports.json" \ + cargo build \ + -p powersync_loadable \ + --profile wasm_asyncify \ + --no-default-features \ + --features "powersync_core/static powersync_core/omit_load_extension sqlite_nostd/omit_load_extension" \ + -Z build-std=panic_abort,core,alloc \ + --target wasm32-unknown-emscripten + +cp "target/wasm32-unknown-emscripten/wasm_asyncify/powersync.wasm" "libpowersync-async.wasm" + + +# Static lib. +# Works for both sync and asyncify builds. +# Works for both emscripten and wasi. +# target/wasm32-wasi/wasm/libpowersync.a +cargo build \ + -p powersync_loadable \ + --profile wasm \ + --no-default-features \ + --features "powersync_core/static powersync_core/omit_load_extension sqlite_nostd/omit_load_extension" \ + -Z build-std=panic_abort,core,alloc \ + --target wasm32-wasi + +cp "target/wasm32-wasi/wasm/libpowersync.a" "libpowersync-wasm.a" diff --git a/wasm/asyncify_imports.json b/wasm/asyncify_imports.json new file mode 100644 index 0000000..ccfdb13 --- /dev/null +++ b/wasm/asyncify_imports.json @@ -0,0 +1,14 @@ +[ + "sqlite3_close", + "sqlite3_finalize", + "sqlite3_open_v2", + "sqlite3_prepare", + "sqlite3_prepare16", + "sqlite3_prepare_v2", + "sqlite3_prepare16_v2", + "sqlite3_prepare_v3", + "sqlite3_prepare16_v3", + "sqlite3_reset", + "sqlite3_step", + "sqlite3_exec" +]