diff --git a/.changeset/weak-chairs-complain.md b/.changeset/weak-chairs-complain.md new file mode 100644 index 000000000..ffa280fdc --- /dev/null +++ b/.changeset/weak-chairs-complain.md @@ -0,0 +1,5 @@ +--- +'@powersync/react-native': patch +--- + +Fix issues forwarding array buffers to Rust sync client. diff --git a/demos/react-native-supabase-todolist/library/powersync/system.ts b/demos/react-native-supabase-todolist/library/powersync/system.ts index 8f1c2713e..83cdae037 100644 --- a/demos/react-native-supabase-todolist/library/powersync/system.ts +++ b/demos/react-native-supabase-todolist/library/powersync/system.ts @@ -1,6 +1,6 @@ import '@azure/core-asynciterator-polyfill'; -import { createBaseLogger, LogLevel, PowerSyncDatabase } from '@powersync/react-native'; +import { createBaseLogger, LogLevel, PowerSyncDatabase, SyncClientImplementation } from '@powersync/react-native'; import React from 'react'; import { SupabaseStorageAdapter } from '../storage/SupabaseStorageAdapter'; @@ -68,7 +68,7 @@ export class System { async init() { await this.powersync.init(); - await this.powersync.connect(this.supabaseConnector); + await this.powersync.connect(this.supabaseConnector, { clientImplementation: SyncClientImplementation.RUST }); if (this.attachmentQueue) { await this.attachmentQueue.init(); diff --git a/packages/react-native/src/db/PowerSyncDatabase.ts b/packages/react-native/src/db/PowerSyncDatabase.ts index 3d37a7e9b..efd40e8bb 100644 --- a/packages/react-native/src/db/PowerSyncDatabase.ts +++ b/packages/react-native/src/db/PowerSyncDatabase.ts @@ -5,12 +5,12 @@ import { DBAdapter, PowerSyncBackendConnector, PowerSyncDatabaseOptionsWithSettings, - type RequiredAdditionalConnectionOptions, - SqliteBucketStorage + type RequiredAdditionalConnectionOptions } from '@powersync/common'; import { ReactNativeRemote } from '../sync/stream/ReactNativeRemote'; import { ReactNativeStreamingSyncImplementation } from '../sync/stream/ReactNativeStreamingSyncImplementation'; import { ReactNativeQuickSqliteOpenFactory } from './adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory'; +import { ReactNativeBucketStorageAdapter } from './../sync/bucket/ReactNativeBucketStorageAdapter'; /** * A PowerSync database which provides SQLite functionality @@ -39,7 +39,7 @@ export class PowerSyncDatabase extends AbstractPowerSyncDatabase { } protected generateBucketStorageAdapter(): BucketStorageAdapter { - return new SqliteBucketStorage(this.database, AbstractPowerSyncDatabase.transactionMutex); + return new ReactNativeBucketStorageAdapter(this.database, AbstractPowerSyncDatabase.transactionMutex); } protected generateSyncStreamImplementation( diff --git a/packages/react-native/src/sync/bucket/ReactNativeBucketStorageAdapter.ts b/packages/react-native/src/sync/bucket/ReactNativeBucketStorageAdapter.ts new file mode 100644 index 000000000..b27bbae52 --- /dev/null +++ b/packages/react-native/src/sync/bucket/ReactNativeBucketStorageAdapter.ts @@ -0,0 +1,13 @@ +import { PowerSyncControlCommand, SqliteBucketStorage } from '@powersync/common'; + +export class ReactNativeBucketStorageAdapter extends SqliteBucketStorage { + control(op: PowerSyncControlCommand, payload: string | ArrayBuffer | null): Promise { + if (payload != null && typeof payload != 'string') { + // For some reason, we need to copy array buffers for RNQS to recognize them. We're doing that here because we + // don't want to pay the cost of a copy on platforms where it's not necessary. + payload = new Uint8Array(payload).buffer; + } + + return super.control(op, payload); + } +}