From f47b11c44d39590f928ba0492e5257b18bf4317f Mon Sep 17 00:00:00 2001 From: Steven Ontong Date: Mon, 25 Mar 2024 15:05:51 +0200 Subject: [PATCH 1/3] fix rerender of watched queries --- .../src/client/AbstractPowerSyncDatabase.ts | 9 +++-- .../powersync-sdk-web/tests/watch.test.ts | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts b/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts index 7dec6d10d..d0fd70df0 100644 --- a/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts +++ b/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts @@ -592,9 +592,12 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver { if (changedTables.size > 0) { - eventOptions.push({ - changedTables: [...changedTables] - }); + const intersection = Array.from(changedTables.values()).filter((change) => watchedTables.has(change)); + if (intersection.length) { + eventOptions.push({ + changedTables: [...changedTables] + }); + } } changedTables.clear(); }, diff --git a/packages/powersync-sdk-web/tests/watch.test.ts b/packages/powersync-sdk-web/tests/watch.test.ts index 15eabd820..2464dd69b 100644 --- a/packages/powersync-sdk-web/tests/watch.test.ts +++ b/packages/powersync-sdk-web/tests/watch.test.ts @@ -101,4 +101,44 @@ describe('Watch Tests', () => { // There should be one initial result plus one throttled result expect(receivedUpdatesCount).equals(2); }); + + it('should only watch tables inside query', async () => { + const assetsAbortController = new AbortController(); + + const watchAssets = powersync.watch('SELECT count() AS count FROM assets', [], { + signal: assetsAbortController.signal + }); + + const customersAbortController = new AbortController(); + + const watchCustomers = powersync.watch('SELECT count() AS count FROM customers', [], { + signal: customersAbortController.signal + }); + + let receivedAssetsUpdatesCount = 0; + // Listen to assets updates + (async () => { + for await (const update of watchAssets) { + receivedAssetsUpdatesCount++; + } + })(); + + let receivedCustomersUpdatesCount = 0; + (async () => { + for await (const update of watchCustomers) { + receivedCustomersUpdatesCount++; + } + })(); + + // Create the inserts as fast as possible + await powersync.execute('INSERT INTO assets(id, make, customer_id) VALUES (uuid(), ?, ?)', ['test', uuid()]); + + await new Promise((resolve) => setTimeout(resolve, throttleDuration * 2)); + assetsAbortController.abort(); + customersAbortController.abort(); + + // There should be one initial result plus one throttled result + expect(receivedAssetsUpdatesCount).equals(2); + expect(receivedCustomersUpdatesCount).equals(1); + }); }); From e3c6ca4cdbc3c13f7fa94013a9b7c737bef8fc50 Mon Sep 17 00:00:00 2001 From: Steven Ontong Date: Mon, 25 Mar 2024 15:26:47 +0200 Subject: [PATCH 2/3] added changeset --- .changeset/metal-vans-grin.md | 5 +++++ .changeset/shaggy-apples-lick.md | 5 +++++ .../src/db/sync/SharedWebStreamingSyncImplementation.ts | 8 ++++++-- .../src/worker/sync/SharedSyncImplementation.ts | 2 +- packages/powersync-sdk-web/tests/watch.test.ts | 2 ++ 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 .changeset/metal-vans-grin.md create mode 100644 .changeset/shaggy-apples-lick.md diff --git a/.changeset/metal-vans-grin.md b/.changeset/metal-vans-grin.md new file mode 100644 index 000000000..ece7c3a6d --- /dev/null +++ b/.changeset/metal-vans-grin.md @@ -0,0 +1,5 @@ +--- +'@journeyapps/powersync-sdk-common': patch +--- + +Fixed regression where watched queries would update for table changes in external (not in query) tables. diff --git a/.changeset/shaggy-apples-lick.md b/.changeset/shaggy-apples-lick.md new file mode 100644 index 000000000..fe75a78e6 --- /dev/null +++ b/.changeset/shaggy-apples-lick.md @@ -0,0 +1,5 @@ +--- +'@journeyapps/powersync-sdk-web': patch +--- + +Minor code cleanup for shared sync worker. diff --git a/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts b/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts index b53f48a2d..28c681c4b 100644 --- a/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts +++ b/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts @@ -42,8 +42,12 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider { }; } - uploadCrud(): Promise { - return this.options.uploadCrud(); + async uploadCrud(): Promise { + /** + * Don't return anything here, just incase something which is not + * serializable is returned from the `uploadCrud` function. + */ + await this.options.uploadCrud(); } get logger() { diff --git a/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts b/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts index d4ac15dc0..2fddf1762 100644 --- a/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts +++ b/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts @@ -204,7 +204,7 @@ export class SharedSyncImplementation async disconnect() { this.abortController?.abort('Disconnected'); - this.iterateListeners((l) => l.statusChanged?.(new SyncStatus({ connected: false }))); + this.updateAllStatuses({ connected: false }); } /** diff --git a/packages/powersync-sdk-web/tests/watch.test.ts b/packages/powersync-sdk-web/tests/watch.test.ts index 2464dd69b..67c399d57 100644 --- a/packages/powersync-sdk-web/tests/watch.test.ts +++ b/packages/powersync-sdk-web/tests/watch.test.ts @@ -139,6 +139,8 @@ describe('Watch Tests', () => { // There should be one initial result plus one throttled result expect(receivedAssetsUpdatesCount).equals(2); + + // Only the initial result should have yielded. expect(receivedCustomersUpdatesCount).equals(1); }); }); From 560806304a9bf6bd04ae06f13573777bd74702d4 Mon Sep 17 00:00:00 2001 From: Steven Ontong Date: Mon, 25 Mar 2024 15:36:49 +0200 Subject: [PATCH 3/3] only update intersection of changed tables --- .../src/client/AbstractPowerSyncDatabase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts b/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts index d0fd70df0..502adfa65 100644 --- a/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts +++ b/packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts @@ -595,7 +595,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver watchedTables.has(change)); if (intersection.length) { eventOptions.push({ - changedTables: [...changedTables] + changedTables: intersection }); } }