@@ -2,7 +2,7 @@ import type { BucketState, Checkpoint } from '@powersync/service-core';
22import { Lock } from '../../utils/Lock.js' ;
33import { CrudManager } from '../sync/CrudManager.js' ;
44import { SystemDependencies } from '../system/SystemDependencies.js' ;
5- import type { BucketStorage , SyncDataBatch } from './BucketStorage.js' ;
5+ import type { BucketStorage , LocalState , SyncDataBatch } from './BucketStorage.js' ;
66import type { SyncOperation , SyncOperationsHandler } from './SyncOperationsHandler.js' ;
77import { constructKey , toStringOrNull } from './bucketHelpers.js' ;
88import { addChecksums , normalizeChecksum , subtractChecksums } from './checksumUtils.js' ;
@@ -23,6 +23,8 @@ export type MemoryBucketStorageImplOptions = {
2323
2424export class MemoryBucketStorageImpl implements BucketStorage {
2525 protected ps_buckets : PSBucket [ ] ;
26+ // TODO cleanup
27+ protected localBucket : PSBucket ;
2628 protected ps_oplog : PSOplog [ ] ;
2729 protected ps_updated_rows : PsUpdatedRows [ ] ;
2830 protected clientId : string ;
@@ -43,6 +45,18 @@ export class MemoryBucketStorageImpl implements BucketStorage {
4345
4446 protected initDefaultState ( ) {
4547 this . ps_buckets = [ ] ;
48+ this . localBucket = {
49+ id : 0 ,
50+ name : '$local' ,
51+ last_applied_op : 0n ,
52+ last_op : 0n ,
53+ target_op : 0n ,
54+ add_checksum : 0n ,
55+ op_checksum : 0n ,
56+ pending_delete : false ,
57+ count_at_last : 0 ,
58+ count_since_last : 0
59+ } ;
4660 this . ps_oplog = [ ] ;
4761 this . ps_updated_rows = [ ] ;
4862 this . lastSyncedAt = null ;
@@ -76,6 +90,15 @@ export class MemoryBucketStorageImpl implements BucketStorage {
7690 } ) ;
7791 }
7892
93+ async getLocalState ( ) : Promise < LocalState > {
94+ return await this . lock . runExclusive ( async ( ) => {
95+ return {
96+ lastOpId : this . localBucket . last_op ,
97+ targetOpId : this . localBucket . target_op
98+ } ;
99+ } ) ;
100+ }
101+
79102 async hasCompletedSync ( ) : Promise < boolean > {
80103 return await this . lock . runExclusive ( async ( ) => {
81104 return ! ! this . ps_buckets . find ( ( b ) => b . last_applied_op > 0 ) ;
@@ -90,18 +113,9 @@ export class MemoryBucketStorageImpl implements BucketStorage {
90113 if ( await this . crudManager ?. hasCrud ( ) ) {
91114 return ;
92115 }
93- const localBucket = this . ps_buckets . find ( ( b ) => b . name === '$local' ) ;
94- if ( ! localBucket ) {
95- throw new Error ( 'Local bucket not found' ) ;
96- }
97- localBucket . target_op = normalizeChecksum ( writeCheckpoint ) ;
116+ this . localBucket . target_op = normalizeChecksum ( writeCheckpoint ) ;
98117 } else {
99- // Set the target to the max op id
100- const localBucket = this . ps_buckets . find ( ( b ) => b . name === '$local' ) ;
101- if ( ! localBucket ) {
102- throw new Error ( 'Local bucket not found' ) ;
103- }
104- localBucket . target_op = normalizeChecksum ( MAX_OP_ID ) ;
118+ this . localBucket . target_op = normalizeChecksum ( MAX_OP_ID ) ;
105119 }
106120 } ) ;
107121 }
@@ -124,14 +138,8 @@ export class MemoryBucketStorageImpl implements BucketStorage {
124138 // SQL: SELECT target_op FROM ps_buckets WHERE name = '$local' AND target_op = CAST(? as INTEGER)
125139 // TODO: maybe store local state separately
126140 const shouldProceed = await this . lock . runExclusive ( async ( ) => {
127- const localBucket = this . ps_buckets . find ( ( b ) => b . name === '$local' ) ;
128- if ( ! localBucket ) {
129- // Nothing to update
130- return false ;
131- }
132-
133141 const maxOpIdBigint = BigInt ( MAX_OP_ID ) ;
134- if ( localBucket . target_op !== maxOpIdBigint ) {
142+ if ( this . localBucket . target_op !== maxOpIdBigint ) {
135143 // target_op is not MAX_OP_ID, nothing to update
136144 return false ;
137145 }
@@ -157,16 +165,10 @@ export class MemoryBucketStorageImpl implements BucketStorage {
157165 // This is typically called after completing uploads which can
158166 // be concurrent.
159167 return await this . lock . runExclusive ( async ( ) => {
160- const localBucket = this . ps_buckets . find ( ( b ) => b . name === '$local' ) ;
161- if ( ! localBucket ) {
162- // Nothing to update
163- return false ;
164- }
165-
166168 // Update the '$local' bucket's target_op to the new opId
167169 // SQL: UPDATE ps_buckets SET target_op = CAST(? as INTEGER) WHERE name='$local'
168170 const opIdBigint = normalizeChecksum ( opId ) ;
169- localBucket . target_op = opIdBigint ;
171+ this . localBucket . target_op = opIdBigint ;
170172 return true ;
171173 } ) ;
172174 }
@@ -400,10 +402,7 @@ export class MemoryBucketStorageImpl implements BucketStorage {
400402
401403 // Update '$local' bucket if write_checkpoint is provided and it's a complete sync
402404 if ( priority == null && checkpoint . write_checkpoint ) {
403- const localBucket = this . ps_buckets . find ( ( b ) => b . name === '$local' ) ;
404- if ( localBucket ) {
405- localBucket . last_op = normalizeChecksum ( checkpoint . write_checkpoint ) ;
406- }
405+ this . localBucket . last_op = normalizeChecksum ( checkpoint . write_checkpoint ) ;
407406 }
408407 } ) ;
409408
@@ -452,7 +451,7 @@ export class MemoryBucketStorageImpl implements BucketStorage {
452451 if ( priority == null ) {
453452 const bucketToCount = new Map ( checkpoint . buckets . map ( ( b ) => [ b . bucket , b . count ?? 0 ] ) ) ;
454453 for ( const bucket of this . ps_buckets ) {
455- if ( bucket . name !== '$local' && bucketToCount . has ( bucket . name ) ) {
454+ if ( bucketToCount . has ( bucket . name ) ) {
456455 bucket . count_at_last = bucketToCount . get ( bucket . name ) ! ;
457456 bucket . count_since_last = 0 ;
458457 }
@@ -479,8 +478,7 @@ export class MemoryBucketStorageImpl implements BucketStorage {
479478 if ( needsCheck ) {
480479 // Check if '$local' bucket has target_op > last_op
481480 // SQL: SELECT 1 FROM ps_buckets WHERE target_op > last_op AND name = '$local'
482- const localBucket = this . ps_buckets . find ( ( b ) => b . name === '$local' ) ;
483- if ( localBucket && localBucket . target_op > localBucket . last_op ) {
481+ if ( this . localBucket . target_op > this . localBucket . last_op ) {
484482 return false ;
485483 }
486484
0 commit comments