diff --git a/.github/actions/prepare/action.yml b/.github/actions/prepare/action.yml new file mode 100644 index 00000000..033c0ebc --- /dev/null +++ b/.github/actions/prepare/action.yml @@ -0,0 +1,24 @@ +name: Prepare +description: Prepare CI environment + +runs: + using: composite + steps: + - name: Install Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: "3.x" + channel: "stable" + - name: Download sqlite3.wasm + uses: actions/download-artifact@v4 + with: + name: sqlite3-wasm + path: packages/sqlite3_wasm_build/dist/ + - name: Install Melos + shell: sh + run: flutter pub global activate melos + - name: Install dependencies + shell: sh + env: + IS_IN_POWERSYNC_CI: 1 + run: melos prepare diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 00000000..b0450c8c --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,61 @@ +name: Check packages and demos + +concurrency: + group: packages-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + +on: + push: + branches: + - "**" + +jobs: + setup: + uses: ./.github/workflows/prepare_wasm.yml + + build: + runs-on: ubuntu-latest + needs: [setup] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/prepare + - name: Check formatting + run: melos format:check:packages + - name: Lint + run: melos analyze:packages + - name: Publish dry-run + run: melos publish --dry-run --yes + + pana: + runs-on: ubuntu-latest + needs: [setup] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/prepare + - name: Check pana score + run: | + flutter pub global activate pana + melos analyze:packages:pana --no-select + + test: + runs-on: ubuntu-latest + needs: [setup] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/prepare + - name: Run flutter tests + run: melos test + - name: Run dart tests + run: melos test:web + + check_demos: + runs-on: ubuntu-latest + needs: [setup] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/prepare + - name: Check formatting + run: melos format:check:demos + - name: Lint + run: | + ./.github/workflows/scripts/copy-config.sh + melos analyze:demos diff --git a/.github/workflows/demos.yml b/.github/workflows/demos.yml deleted file mode 100644 index 1a83c277..00000000 --- a/.github/workflows/demos.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Demos checks - -concurrency: - group: demos-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - -on: - push: - branches: - - "**" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: "3.x" - channel: "stable" - - - name: Install Melos - run: flutter pub global activate melos - - name: Install dependencies - run: melos prepare - - name: Check formatting - run: melos format:check:demos - - name: Lint - run: | - ./.github/workflows/scripts/copy-config.sh - melos analyze:demos diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml deleted file mode 100644 index 4b8537c3..00000000 --- a/.github/workflows/packages.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Packages check - -concurrency: - group: packages-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - -on: - push: - branches: - - "**" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: "3.x" - channel: "stable" - - - name: Install Melos - run: flutter pub global activate melos - - name: Install dependencies - run: melos prepare - - name: Check formatting - run: melos format:check:packages - - name: Lint - run: melos analyze:packages - - name: Publish dry-run - run: melos publish --dry-run --yes - - pana: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: "3.x" - channel: "stable" - - - name: Install Melos - run: flutter pub global activate melos - - name: Install dependencies - run: melos prepare - - name: Check pana score - run: | - flutter pub global activate pana - melos analyze:packages:pana --no-select - - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: "3.x" - channel: "stable" - - name: Install melos - run: flutter pub global activate melos - - name: Install dependencies and prepare project - run: melos prepare - - name: Run flutter tests - run: melos test - - name: Run dart tests - run: melos test:web diff --git a/.github/workflows/prepare_wasm.yml b/.github/workflows/prepare_wasm.yml new file mode 100644 index 00000000..b38aa7bc --- /dev/null +++ b/.github/workflows/prepare_wasm.yml @@ -0,0 +1,53 @@ +name: Build SQLite3 WASM + +on: + workflow_call: + +jobs: + compile_sqlite3_wasm: + name: Compile sqlite3 wasm + runs-on: macos-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + id: cache_build + with: + path: packages/sqlite3_wasm_build/dist/ + key: wasm-${{ runner.os }}-${{ hashFiles('packages/sqlite3_wasm_build/build.sh') }} + + - name: Setup Homebrew + if: steps.cache_build.outputs.cache-hit != 'true' + id: set-up-homebrew + uses: Homebrew/actions/setup-homebrew@master + - name: Install Dart SDK + if: steps.cache_build.outputs.cache-hit != 'true' + uses: dart-lang/setup-dart@v1 + - name: Setup macOS build dependencies + if: steps.cache_build.outputs.cache-hit != 'true' + run: brew install cmake llvm lld binaryen wasi-libc wasi-runtimes + - name: Compile sqlite3.wasm on macOS + if: steps.cache_build.outputs.cache-hit != 'true' + working-directory: packages/sqlite3_wasm_build + run: ./build.sh + + - name: Upload built sqlite3 binaries + uses: actions/upload-artifact@v4 + with: + name: sqlite3-wasm + path: packages/sqlite3_wasm_build/dist/ + if-no-files-found: error + retention-days: 1 + + - name: Setup Node.js + uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 + name: Install pnpm + with: + run_install: false + version: 10 + - name: Dry-run npm publish + working-directory: packages/sqlite3_wasm_build + run: | + pnpm i + pnpm publish --no-git-checks --dry-run diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3231dca0..391a8d04 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,6 +7,9 @@ on: - 'powersync-v[0-9]+.[0-9]+.[0-9]+' jobs: + setup: + uses: ./.github/workflows/prepare_wasm.yml + build: runs-on: ubuntu-latest permissions: @@ -15,18 +18,7 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 - - - name: Install Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: '3.x' - channel: 'stable' - - - name: Install Melos - run: flutter pub global activate melos - - - name: Install Dependencies and Compile Assets - run: melos prepare + - uses: ./.github/actions/prepare - name: Create Draft Release env: @@ -39,4 +31,21 @@ jobs: body="Release $tag $changes" gh release create "$tag" --title "$tag" --notes "$body" - gh release upload "${{ github.ref_name }}" packages/powersync/assets/powersync_db.worker.js packages/powersync/assets/powersync_sync.worker.js + gh release upload "${{ github.ref_name }}" packages/powersync/assets/powersync_db.worker.js packages/powersync/assets/powersync_sync.worker.js packages/sqlite3_wasm_build/dist/*.wasm + + - name: Setup Node.js + uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 + name: Install pnpm + with: + run_install: false + version: 10 + - name: Publish npm package with WASM files + working-directory: packages/sqlite3_wasm_build + run: | + pnpm i + npm version --allow-same-version --no-git-tag-version $(echo $GITHUB_REF_NAME | sed -E 's/powersync-v//') + pnpm publish --no-git-checks --access public + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/packages/powersync_core/lib/src/setup_web.dart b/packages/powersync_core/lib/src/setup_web.dart index f1e72c0f..e4d63d2b 100644 --- a/packages/powersync_core/lib/src/setup_web.dart +++ b/packages/powersync_core/lib/src/setup_web.dart @@ -4,6 +4,7 @@ import 'package:collection/collection.dart'; import 'package:pub_semver/pub_semver.dart'; import 'package:pubspec_parse/pubspec_parse.dart'; import 'package:args/args.dart'; +import 'package:path/path.dart' as p; Future downloadWebAssets(List arguments, {bool encryption = false}) async { @@ -46,57 +47,90 @@ Future downloadWebAssets(List arguments, exit(1); } + if (Platform.environment.containsKey('IS_IN_POWERSYNC_CI')) { + print('IS_IN_POWERSYNC_CI env variable is set, copying from local build'); + return _copyPrecompiled(Directory.current, wasmFileName, outputDir); + } + try { final httpClient = HttpClient(); + const sqlitePackageName = 'sqlite3'; - final powersyncPackageName = 'powersync'; + final (tag: powersyncTag, version: powerSyncVersion) = + await powerSyncVersionOrLatest( + httpClient, packageConfig, packageConfigFile); + final firstPowerSyncVersionWithOwnWasm = Version(1, 12, 0); if (downloadWorker) { - final powersyncPkg = - getPackageFromConfig(packageConfig, powersyncPackageName); - - final powersyncVersion = getPubspecVersion( - packageConfigFile, powersyncPkg, powersyncPackageName); - final workerUrl = - 'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-v$powersyncVersion/powersync_db.worker.js'; - + 'https://github.com/powersync-ja/powersync.dart/releases/download/$powersyncTag/powersync_db.worker.js'; final syncWorkerUrl = - 'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-v$powersyncVersion/powersync_sync.worker.js'; + 'https://github.com/powersync-ja/powersync.dart/releases/download/$powersyncTag/powersync_sync.worker.js'; await downloadFile(httpClient, workerUrl, workerPath); await downloadFile(httpClient, syncWorkerUrl, syncWorkerPath); } - final sqlitePackageName = 'sqlite3'; + if (powerSyncVersion >= firstPowerSyncVersionWithOwnWasm) { + final wasmUrl = + 'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-$powersyncTag/$wasmFileName'; - final sqlite3Pkg = getPackageFromConfig(packageConfig, sqlitePackageName); - - String sqlite3Version = - "v${getPubspecVersion(packageConfigFile, sqlite3Pkg, sqlitePackageName)}"; - - List tags = await getLatestTagsFromRelease(httpClient); - String? matchTag = tags.firstWhereOrNull((element) => - element.contains(sqlite3Version) && coreVersionIsInRange(element)); - if (matchTag != null) { - sqlite3Version = matchTag; + await downloadFile(httpClient, wasmUrl, wasmPath); } else { - throw Exception( - """No compatible powersync core version found for sqlite3 version $sqlite3Version + final sqlite3Pkg = getPackageFromConfig(packageConfig, sqlitePackageName); + + String sqlite3Version = + "v${getPubspecVersion(packageConfigFile, sqlite3Pkg, sqlitePackageName)}"; + + List tags = await getLatestTagsFromRelease(httpClient); + String? matchTag = tags.firstWhereOrNull((element) => + element.contains(sqlite3Version) && coreVersionIsInRange(element)); + if (matchTag != null) { + sqlite3Version = matchTag; + } else { + throw Exception( + """No compatible powersync core version found for sqlite3 version $sqlite3Version Latest supported sqlite3 versions: ${tags.take(3).map((tag) => tag.split('-')[0]).join(', ')}. You can view the full list of releases at https://github.com/powersync-ja/sqlite3.dart/releases"""); - } + } - final sqliteUrl = - 'https://github.com/powersync-ja/sqlite3.dart/releases/download/$sqlite3Version/$wasmFileName'; + final sqliteUrl = + 'https://github.com/powersync-ja/sqlite3.dart/releases/download/$sqlite3Version/$wasmFileName'; - await downloadFile(httpClient, sqliteUrl, wasmPath); + await downloadFile(httpClient, sqliteUrl, wasmPath); + } } catch (e) { print(e); exit(1); } } +Future<({String tag, Version version})> powerSyncVersionOrLatest( + HttpClient client, dynamic packageConfig, File packageConfigFile) async { + const powersyncPackageName = 'powersync'; + // Don't require powersync dependency. The user has one if running this script + // and we also want to support powersync_sqlcipher (for which we download + // the latest versions). + final powersyncPkg = getPackageFromConfig(packageConfig, powersyncPackageName, + required: false); + if (powersyncPkg == null) { + final [tag, ...] = + await getLatestTagsFromRelease(client, repo: 'powersync.dart'); + + return ( + tag: tag, + version: Version.parse(tag.substring('powersync-v'.length)) + ); + } + + final powersyncVersion = + getPubspecVersion(packageConfigFile, powersyncPkg, powersyncPackageName); + return ( + tag: 'powersync-v$powersyncVersion', + version: Version.parse(powersyncVersion), + ); +} + bool coreVersionIsInRange(String tag) { // Sets the range of powersync core version that is compatible with the sqlite3 version // We're a little more selective in the versions chosen here than the range @@ -115,12 +149,13 @@ bool coreVersionIsInRange(String tag) { return false; } -dynamic getPackageFromConfig(dynamic packageConfig, String packageName) { +dynamic getPackageFromConfig(dynamic packageConfig, String packageName, + {bool required = false}) { final pkg = (packageConfig['packages'] as List? ?? []).firstWhere( (dynamic e) => e['name'] == packageName, orElse: () => null, ); - if (pkg == null) { + if (pkg == null && required) { throw Exception('Dependency on package:$packageName is required'); } return pkg; @@ -145,9 +180,10 @@ String getPubspecVersion( String capitalize(String s) => s[0].toUpperCase() + s.substring(1); -Future> getLatestTagsFromRelease(HttpClient httpClient) async { - var request = await httpClient.getUrl(Uri.parse( - "https://api.github.com/repos/powersync-ja/sqlite3.dart/releases")); +Future> getLatestTagsFromRelease(HttpClient httpClient, + {String repo = 'sqlite3.dart'}) async { + var request = await httpClient.getUrl( + Uri.parse("https://api.github.com/repos/powersync-ja/$repo/releases")); var response = await request.close(); if (response.statusCode == HttpStatus.ok) { var res = await response.transform(utf8.decoder).join(); @@ -155,7 +191,7 @@ Future> getLatestTagsFromRelease(HttpClient httpClient) async { List tags = []; for (dynamic obj in jsonObj) { final tagName = obj['tag_name'] as String; - if (!tagName.contains("-powersync")) continue; + if (!tagName.contains("powersync")) continue; tags.add(tagName); } return tags; @@ -177,3 +213,33 @@ Future downloadFile( 'Failed to download file: ${response.statusCode} ${response.reasonPhrase}'); } } + +/// Copies WebAssembly modules from `packages/sqlite3_wasm_build/dist` into +/// `web/`. +/// +/// When we're running this setup script as part of our CI, a previous action +/// (`.github/actions/prepare/`) will have put compiled assets into that folder. +/// Copying from there ensures we run web tests against our current SQLite web +/// build and avoids downloading from GitHub releases for every package we test. +Future _copyPrecompiled( + Directory project, String wasmFile, String outputDir) async { + // Keep going up until we see the melos.yaml file indicating the workspace + // root. + var dir = project; + while (!await File(p.join(dir.path, 'melos.yaml')).exists()) { + print('Looking for melos workspace in $dir'); + final parent = dir.parent; + if (p.equals(parent.path, dir.path)) { + throw 'Melos workspace not found'; + } + + dir = parent; + } + + // In the CI, an earlier step will have put these files into the prepared + // sqlite3_wasm_build package. + final destination = p.join(project.path, outputDir); + final wasmSource = p.join(dir.path, 'packages', 'sqlite3_wasm_build', 'dist'); + print('Copying $wasmFile from $wasmSource to $destination'); + await File(p.join(wasmSource, wasmFile)).copy(p.join(destination, wasmFile)); +} diff --git a/packages/powersync_core/pubspec.yaml b/packages/powersync_core/pubspec.yaml index be72adaa..41ff0733 100644 --- a/packages/powersync_core/pubspec.yaml +++ b/packages/powersync_core/pubspec.yaml @@ -28,6 +28,7 @@ dependencies: args: ^2.6.0 pub_semver: ^2.0.0 pubspec_parse: ^1.3.0 + path: ^1.8.0 dev_dependencies: lints: ^5.1.1 @@ -37,7 +38,6 @@ dev_dependencies: shelf_router: ^1.1.4 shelf_static: ^1.1.2 stream_channel: ^2.1.2 - path: ^1.8.3 platforms: android: diff --git a/packages/sqlite3_wasm_build/.gitignore b/packages/sqlite3_wasm_build/.gitignore new file mode 100644 index 00000000..4c6fda5b --- /dev/null +++ b/packages/sqlite3_wasm_build/.gitignore @@ -0,0 +1,4 @@ +node_modules +pnpm-lock.yaml +sqlite3.dart +dist diff --git a/packages/sqlite3_wasm_build/.npmignore b/packages/sqlite3_wasm_build/.npmignore new file mode 100644 index 00000000..76071ace --- /dev/null +++ b/packages/sqlite3_wasm_build/.npmignore @@ -0,0 +1 @@ +sqlite3.dart/ diff --git a/packages/sqlite3_wasm_build/README.md b/packages/sqlite3_wasm_build/README.md new file mode 100644 index 00000000..7d787089 --- /dev/null +++ b/packages/sqlite3_wasm_build/README.md @@ -0,0 +1,18 @@ +This directory includes tools to build `sqlite3.wasm` files compatible with the +PowerSync Dart SDK. + +This build process is adapted from [`package:sqlite3`][upstream], with patches +applied to link the [PowerSync SQLite extension][core] statically. + +### Working on patches + +To adapt the patches from an `$old` version to a `$new` version: + +1. Clone `https://github.com/simolus3/sqlite3.dart.git` somewhere. +2. Create a branch tracking the old version: `git switch -c powersync-patches sqlite3-$old`. +3. Apply the existing patches: `git am patches/*`. +4. Rebase onto a new upstream release if necessary: `git rebase --onto sqlite3-$new sqlite3-$old powersync-patches` +5. Obtain a new patchset with `git format-patch sqlite3-$new..HEAD`. + +[upstream]: https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3/assets/wasm +[core]: https://github.com/powersync-ja/powersync-sqlite-core diff --git a/packages/sqlite3_wasm_build/build.sh b/packages/sqlite3_wasm_build/build.sh new file mode 100755 index 00000000..c343312a --- /dev/null +++ b/packages/sqlite3_wasm_build/build.sh @@ -0,0 +1,29 @@ +#!/bin/sh +set -e + +SQLITE_VERSION="2.7.3" +POWERSYNC_CORE_VERSION="0.3.9" +SQLITE_PATH="sqlite3.dart" + +if [ -d "$SQLITE_PATH" ]; then + echo "Deleting existing clone" + rm -rf $SQLITE_PATH +fi + +git clone --branch "sqlite3-$SQLITE_VERSION" --depth 1 https://github.com/simolus3/sqlite3.dart.git $SQLITE_PATH + +cd $SQLITE_PATH +git apply ../patches/* + +cd "sqlite3/" +dart pub get # We need the analyzer dependency resolved to extract required symbols + +cmake -Dwasi_sysroot=/opt/homebrew/share/wasi-sysroot \ + -Dclang=/opt/homebrew/opt/llvm/bin/clang\ + -DPOWERSYNC_VERSION="$POWERSYNC_CORE_VERSION" \ + -S assets/wasm -B .dart_tool/sqlite3_build +cmake --build .dart_tool/sqlite3_build/ -t output -j + +cd ../../ +mkdir -p dist +cp $SQLITE_PATH/sqlite3/example/web/*.wasm dist diff --git a/packages/sqlite3_wasm_build/package.json b/packages/sqlite3_wasm_build/package.json new file mode 100644 index 00000000..ad77977a --- /dev/null +++ b/packages/sqlite3_wasm_build/package.json @@ -0,0 +1,10 @@ +{ + "name": "@powersync/dart-wasm-bundles", + "version": "0.0.1", + "description": "WebAssembly modules containing SQLite + PowerSync for Dart apps.", + "repository": { + "type": "git", + "url": "git+https://github.com/powersync-ja/powersync.dart.git", + "directory": "packages/sqlite3_wasm_build" + } +} diff --git a/packages/sqlite3_wasm_build/patches/0001-Link-PowerSync-core-extension.patch b/packages/sqlite3_wasm_build/patches/0001-Link-PowerSync-core-extension.patch new file mode 100644 index 00000000..44d6e139 --- /dev/null +++ b/packages/sqlite3_wasm_build/patches/0001-Link-PowerSync-core-extension.patch @@ -0,0 +1,82 @@ +From 80ec8f3a54d938c6bf39b471aa26c4c77f9984a2 Mon Sep 17 00:00:00 2001 +From: Simon Binder +Date: Mon, 27 Jan 2025 15:12:53 +0100 +Subject: [PATCH] Link PowerSync core extension + +--- + sqlite3/assets/wasm/CMakeLists.txt | 7 ++++++- + sqlite3/assets/wasm/os_web.c | 11 ++++++++++- + sqlite3/assets/wasm/sqlite_cfg.h | 2 +- + 3 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/sqlite3/assets/wasm/CMakeLists.txt b/sqlite3/assets/wasm/CMakeLists.txt +index 6597d86..81a5a41 100644 +--- a/sqlite3/assets/wasm/CMakeLists.txt ++++ b/sqlite3/assets/wasm/CMakeLists.txt +@@ -6,6 +6,7 @@ project(${PROJECT_NAME} LANGUAGES C) + set(triple wasm32-unknown-wasi) + set(wasi_sysroot "/usr/share/wasi-sysroot" CACHE PATH "Path to wasi sysroot") + set(clang "clang" CACHE FILEPATH "Path to wasm-capable clang executable") ++set(POWERSYNC_VERSION "0.3.9" CACHE STRING "PowerSync core version to use") + + include(FetchContent) + +@@ -27,6 +28,9 @@ FetchContent_MakeAvailable(sqlite3mc) + + file(DOWNLOAD https://raw.githubusercontent.com/sqlite/sqlite/master/src/test_vfstrace.c "${CMAKE_BINARY_DIR}/vfstrace.c") + ++set(POWERSYNC_A "${CMAKE_BINARY_DIR}/libpowersync-wasm.a") ++file(DOWNLOAD "https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v${POWERSYNC_VERSION}/libpowersync-wasm.a" "${POWERSYNC_A}") ++ + # Generate symbols we need to export from the sqlite3.wasm build + add_custom_command( + OUTPUT required_symbols.txt +@@ -88,8 +92,9 @@ macro(base_sqlite3_target name debug crypto) + -Wl,--import-memory + --sysroot ${wasi_sysroot} + ${sources} ++ ${POWERSYNC_A} + @${CMAKE_CURRENT_BINARY_DIR}/required_symbols.txt +- DEPENDS ${sources} required_symbols ++ DEPENDS ${sources} ${POWERSYNC_A} required_symbols + VERBATIM + ) + +diff --git a/sqlite3/assets/wasm/os_web.c b/sqlite3/assets/wasm/os_web.c +index 4a1df1d..be9c3c9 100644 +--- a/sqlite3/assets/wasm/os_web.c ++++ b/sqlite3/assets/wasm/os_web.c +@@ -6,7 +6,16 @@ + #include "bridge.h" + #include "sqlite3.h" + +-int sqlite3_os_init(void) { return SQLITE_OK; } ++extern int sqlite3_powersync_init(sqlite3 *db, char **pzErrMsg, ++ const sqlite3_api_routines *pApi); ++ ++int sqlite3_os_init(void) { ++ int rc = sqlite3_auto_extension((void (*)(void)) & sqlite3_powersync_init); ++ if (rc != SQLITE_OK) { ++ return rc; ++ } ++ return SQLITE_OK; ++} + + int sqlite3_os_end(void) { return SQLITE_OK; } + +diff --git a/sqlite3/assets/wasm/sqlite_cfg.h b/sqlite3/assets/wasm/sqlite_cfg.h +index 74e8dd7..682acbf 100644 +--- a/sqlite3/assets/wasm/sqlite_cfg.h ++++ b/sqlite3/assets/wasm/sqlite_cfg.h +@@ -42,7 +42,7 @@ + // Disable things we don't need + #define SQLITE_OMIT_DEPRECATED + #define SQLITE_OMIT_PROGRESS_CALLBACK +-#define SQLITE_OMIT_AUTHORIZATION ++// #define SQLITE_OMIT_AUTHORIZATION // This breaks the powersync-core build + #define SQLITE_UNTESTABLE + #define SQLITE_OMIT_COMPILEOPTION_DIAGS + #define SQLITE_OMIT_LOAD_EXTENSION +-- +2.39.5 (Apple Git-154) +