From f532257d2b777c6c13781a1c49583af39406505d Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 13 Aug 2024 17:06:42 +0200 Subject: [PATCH 1/2] Debounce update notifications to improve web performance. --- .../db/adapters/wa-sqlite/WASQLiteDBAdapter.ts | 8 ++++---- packages/web/src/shared/open-db.ts | 16 +++++++++++++++- packages/web/src/shared/types.ts | 4 ++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts b/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts index 395cfeed0..05a5f7d1d 100644 --- a/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts +++ b/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts @@ -90,16 +90,16 @@ export class WASQLiteDBAdapter extends BaseObserver implement this.methods = await dbOpener(this.options.dbFilename); this.methods.registerOnTableChange( - Comlink.proxy((opType: number, tableName: string, rowId: number) => { - this.iterateListeners((cb) => cb.tablesUpdated?.({ opType, table: tableName, rowId })); + Comlink.proxy((event) => { + this.iterateListeners((cb) => cb.tablesUpdated?.(event)); }) ); return; } this.methods = await _openDB(this.options.dbFilename, { useWebWorker: false }); - this.methods.registerOnTableChange((opType: number, tableName: string, rowId: number) => { - this.iterateListeners((cb) => cb.tablesUpdated?.({ opType, table: tableName, rowId })); + this.methods.registerOnTableChange((event) => { + this.iterateListeners((cb) => cb.tablesUpdated?.(event)); }); } diff --git a/packages/web/src/shared/open-db.ts b/packages/web/src/shared/open-db.ts index bf02aa7be..4b679d653 100644 --- a/packages/web/src/shared/open-db.ts +++ b/packages/web/src/shared/open-db.ts @@ -3,6 +3,7 @@ import '@journeyapps/wa-sqlite'; import * as Comlink from 'comlink'; import type { DBFunctionsInterface, OnTableChangeCallback, WASQLExecuteResult } from './types'; import { Mutex } from 'async-mutex'; +import { BatchedUpdateNotification } from '@powersync/common'; let nextId = 1; @@ -26,8 +27,21 @@ export async function _openDB( */ const listeners = new Map(); + let updatedTables = new Set(); + let updateTimer: any = null; + + function fireUpdates() { + updateTimer = null; + const event: BatchedUpdateNotification = { tables: [...updatedTables], groupedUpdates: {}, rawUpdates: [] }; + updatedTables.clear(); + Array.from(listeners.values()).forEach((l) => l(event)); + } + sqlite3.register_table_onchange_hook(db, (opType: number, tableName: string, rowId: number) => { - Array.from(listeners.values()).forEach((l) => l(opType, tableName, rowId)); + updatedTables.add(tableName); + if (updateTimer == null) { + updateTimer = setTimeout(fireUpdates, 0); + } }); /** diff --git a/packages/web/src/shared/types.ts b/packages/web/src/shared/types.ts index a798023df..15a7ba1e1 100644 --- a/packages/web/src/shared/types.ts +++ b/packages/web/src/shared/types.ts @@ -1,4 +1,4 @@ -import type { QueryResult } from '@powersync/common'; +import type { BatchedUpdateNotification, QueryResult } from '@powersync/common'; export type WASQLExecuteResult = Omit & { rows: { @@ -22,7 +22,7 @@ export type DBWorkerInterface = DBFunctionsInterface; export type WASQLiteExecuteMethod = (sql: string, params?: any[]) => Promise; export type WASQLiteExecuteBatchMethod = (sql: string, params?: any[]) => Promise; -export type OnTableChangeCallback = (opType: number, tableName: string, rowId: number) => void; +export type OnTableChangeCallback = (event: BatchedUpdateNotification) => void; export type OpenDB = (dbFileName: string) => DBWorkerInterface; export type SQLBatchTuple = [string] | [string, Array | Array>]; From 2db0e8f5249c3916711496062058c7b0193f3582 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Tue, 13 Aug 2024 17:15:15 +0200 Subject: [PATCH 2/2] Add changeset. --- .changeset/strange-feet-explain.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strange-feet-explain.md diff --git a/.changeset/strange-feet-explain.md b/.changeset/strange-feet-explain.md new file mode 100644 index 000000000..a7c04427f --- /dev/null +++ b/.changeset/strange-feet-explain.md @@ -0,0 +1,5 @@ +--- +'@powersync/web': patch +--- + +Debounce update notifications to fix performance issue with large amounts of data synced