diff --git a/.changeset/moody-shoes-remain.md b/.changeset/moody-shoes-remain.md new file mode 100644 index 000000000..124533949 --- /dev/null +++ b/.changeset/moody-shoes-remain.md @@ -0,0 +1,5 @@ +--- +'@powersync/common': patch +--- + +Fix issue where local changes could be reverted when a replication delay is present. diff --git a/packages/common/src/client/AbstractPowerSyncDatabase.ts b/packages/common/src/client/AbstractPowerSyncDatabase.ts index d9927c5bf..8dc50477a 100644 --- a/packages/common/src/client/AbstractPowerSyncDatabase.ts +++ b/packages/common/src/client/AbstractPowerSyncDatabase.ts @@ -582,12 +582,12 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver imp async getBucketStates(): Promise { const result = await this.db.getAll( - 'SELECT name as bucket, cast(last_op as TEXT) as op_id FROM ps_buckets WHERE pending_delete = 0' + "SELECT name as bucket, cast(last_op as TEXT) as op_id FROM ps_buckets WHERE pending_delete = 0 AND name != '$local'" ); return result; } @@ -249,9 +249,10 @@ export class SqliteBucketStorage extends BaseObserver imp } async updateLocalTarget(cb: () => Promise): Promise { - const rs1 = await this.db.getAll("SELECT target_op FROM ps_buckets WHERE name = '$local' AND target_op = ?", [ - MAX_OP_ID - ]); + const rs1 = await this.db.getAll( + "SELECT target_op FROM ps_buckets WHERE name = '$local' AND target_op = CAST(? as INTEGER)", + [MAX_OP_ID] + ); if (!rs1.length) { // Nothing to update return false;