@@ -16,7 +16,6 @@ import { Schema } from '../db/schema/Schema.js';
1616import { BaseObserver } from '../utils/BaseObserver.js' ;
1717import { ControlledExecutor } from '../utils/ControlledExecutor.js' ;
1818import { throttleTrailing } from '../utils/async.js' ;
19- import { mutexRunExclusive } from '../utils/mutex.js' ;
2019import { ConnectionManager } from './ConnectionManager.js' ;
2120import { SQLOpenFactory , SQLOpenOptions , isDBAdapter , isSQLOpenFactory , isSQLOpenOptions } from './SQLOpenFactory.js' ;
2221import { PowerSyncBackendConnector } from './connection/PowerSyncBackendConnector.js' ;
@@ -28,6 +27,7 @@ import { CrudTransaction } from './sync/bucket/CrudTransaction.js';
2827import {
2928 DEFAULT_CRUD_UPLOAD_THROTTLE_MS ,
3029 DEFAULT_RETRY_DELAY_MS ,
30+ InternalConnectionOptions ,
3131 StreamingSyncImplementation ,
3232 StreamingSyncImplementationListener ,
3333 type AdditionalConnectionOptions ,
@@ -129,7 +129,6 @@ export const DEFAULT_WATCH_THROTTLE_MS = 30;
129129
130130export const DEFAULT_POWERSYNC_DB_OPTIONS = {
131131 retryDelayMs : 5000 ,
132- logger : Logger . get ( 'PowerSyncDatabase' ) ,
133132 crudUploadThrottleMs : DEFAULT_CRUD_UPLOAD_THROTTLE_MS
134133} ;
135134
@@ -151,12 +150,6 @@ export const isPowerSyncDatabaseOptionsWithSettings = (test: any): test is Power
151150} ;
152151
153152export abstract class AbstractPowerSyncDatabase extends BaseObserver < PowerSyncDBListener > {
154- /**
155- * Transactions should be queued in the DBAdapter, but we also want to prevent
156- * calls to `.execute` while an async transaction is running.
157- */
158- protected static transactionMutex : Mutex = new Mutex ( ) ;
159-
160153 /**
161154 * Returns true if the connection is closed.
162155 */
@@ -188,6 +181,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
188181 * Allows creating SQLite triggers which can be used to track various operations on SQLite tables.
189182 */
190183 readonly triggers : TriggerManager ;
184+ logger : ILogger ;
191185
192186 constructor ( options : PowerSyncDatabaseOptionsWithDBAdapter ) ;
193187 constructor ( options : PowerSyncDatabaseOptionsWithOpenFactory ) ;
@@ -212,6 +206,8 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
212206 throw new Error ( 'The provided `database` option is invalid.' ) ;
213207 }
214208
209+ this . logger = options . logger ?? Logger . get ( `PowerSyncDatabase[${ this . _database . name } ]` ) ;
210+
215211 this . bucketStorageAdapter = this . generateBucketStorageAdapter ( ) ;
216212 this . closed = false ;
217213 this . currentStatus = new SyncStatus ( { } ) ;
@@ -439,7 +435,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
439435 try {
440436 schema . validate ( ) ;
441437 } catch ( ex ) {
442- this . options . logger ? .warn ( 'Schema validation failed. Unexpected behaviour could occur' , ex ) ;
438+ this . logger . warn ( 'Schema validation failed. Unexpected behaviour could occur' , ex ) ;
443439 }
444440 this . _schema = schema ;
445441
@@ -448,10 +444,6 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
448444 this . iterateListeners ( async ( cb ) => cb . schemaChanged ?.( schema ) ) ;
449445 }
450446
451- get logger ( ) {
452- return this . options . logger ! ;
453- }
454-
455447 /**
456448 * Wait for initialization to complete.
457449 * While initializing is automatic, this helps to catch and report initialization errors.
@@ -483,7 +475,10 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
483475 * Connects to stream of events from the PowerSync instance.
484476 */
485477 async connect ( connector : PowerSyncBackendConnector , options ?: PowerSyncConnectionOptions ) {
486- return this . connectionManager . connect ( connector , options ) ;
478+ const resolvedOptions : InternalConnectionOptions = options ?? { } ;
479+ resolvedOptions . serializedSchema = this . schema . toJSON ( ) ;
480+
481+ return this . connectionManager . connect ( connector , resolvedOptions ) ;
487482 }
488483
489484 /**
@@ -692,8 +687,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
692687 * @returns The query result as an object with structured key-value pairs
693688 */
694689 async execute ( sql : string , parameters ?: any [ ] ) {
695- await this . waitForReady ( ) ;
696- return this . database . execute ( sql , parameters ) ;
690+ return this . writeLock ( ( tx ) => tx . execute ( sql , parameters ) ) ;
697691 }
698692
699693 /**
@@ -767,7 +761,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
767761 */
768762 async readLock < T > ( callback : ( db : DBAdapter ) => Promise < T > ) {
769763 await this . waitForReady ( ) ;
770- return mutexRunExclusive ( AbstractPowerSyncDatabase . transactionMutex , ( ) => callback ( this . database ) ) ;
764+ return this . database . readLock ( callback ) ;
771765 }
772766
773767 /**
@@ -776,10 +770,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
776770 */
777771 async writeLock < T > ( callback : ( db : DBAdapter ) => Promise < T > ) {
778772 await this . waitForReady ( ) ;
779- return mutexRunExclusive ( AbstractPowerSyncDatabase . transactionMutex , async ( ) => {
780- const res = await callback ( this . database ) ;
781- return res ;
782- } ) ;
773+ return this . database . writeLock ( callback ) ;
783774 }
784775
785776 /**
@@ -897,7 +888,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
897888 * @param options Options for configuring watch behavior
898889 */
899890 watchWithCallback ( sql : string , parameters ?: any [ ] , handler ?: WatchHandler , options ?: SQLWatchOptions ) : void {
900- const { onResult, onError = ( e : Error ) => this . options . logger ? .error ( e ) } = handler ?? { } ;
891+ const { onResult, onError = ( e : Error ) => this . logger . error ( e ) } = handler ?? { } ;
901892 if ( ! onResult ) {
902893 throw new Error ( 'onResult is required' ) ;
903894 }
@@ -1052,7 +1043,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
10521043 * @returns A dispose function to stop watching for changes
10531044 */
10541045 onChangeWithCallback ( handler ?: WatchOnChangeHandler , options ?: SQLWatchOptions ) : ( ) => void {
1055- const { onChange, onError = ( e : Error ) => this . options . logger ? .error ( e ) } = handler ?? { } ;
1046+ const { onChange, onError = ( e : Error ) => this . logger . error ( e ) } = handler ?? { } ;
10561047 if ( ! onChange ) {
10571048 throw new Error ( 'onChange is required' ) ;
10581049 }
0 commit comments