11/// This file needs to be compiled to JavaScript with the command
2- /// dart compile js -O4 packages/powersync/lib/src/web/sync_worker.worker. dart -o assets/db_worker .js
2+ /// dart compile js -O4 packages/powersync/lib/src/web/sync_worker.dart -o assets/powersync_sync.worker .js
33/// The output should then be included in each project's `web` directory
44library ;
55
@@ -9,12 +9,13 @@ import 'dart:js_interop';
99import 'package:async/async.dart' ;
1010import 'package:fetch_client/fetch_client.dart' ;
1111import 'package:powersync/powersync.dart' ;
12+ import 'package:powersync/sqlite_async.dart' ;
13+ import 'package:powersync/src/database/powersync_db_mixin.dart' ;
1214import 'package:powersync/src/streaming_sync.dart' ;
1315import 'package:sqlite_async/web.dart' ;
1416import 'package:web/web.dart' hide RequestMode;
1517
1618import '../bucket_storage.dart' ;
17- import '../database/powersync_db_mixin.dart' ;
1819import 'sync_worker_protocol.dart' ;
1920
2021final _logger = autoLogger;
@@ -40,10 +41,10 @@ class _SyncWorker {
4041 });
4142 }
4243
43- _SyncRunner referenceSyncTask (
44- String databaseIdentifier , _ConnectedClient client) {
44+ _SyncRunner referenceSyncTask (String databaseIdentifier,
45+ int crudThrottleTimeMs , _ConnectedClient client) {
4546 return _requestedSyncTasks.putIfAbsent (databaseIdentifier, () {
46- return _SyncRunner (databaseIdentifier);
47+ return _SyncRunner (databaseIdentifier, crudThrottleTimeMs );
4748 })
4849 ..registerClient (client);
4950 }
@@ -63,7 +64,8 @@ class _ConnectedClient {
6364 switch (type) {
6465 case SyncWorkerMessageType .startSynchronization:
6566 final request = payload as StartSynchronization ;
66- _runner = _worker.referenceSyncTask (request.databaseName, this );
67+ _runner = _worker.referenceSyncTask (
68+ request.databaseName, request.crudThrottleTimeMs, this );
6769 return (JSObject (), null );
6870 case SyncWorkerMessageType .abortSynchronization:
6971 _runner? .unregisterClient (this );
@@ -103,6 +105,7 @@ class _ConnectedClient {
103105
104106class _SyncRunner {
105107 final String identifier;
108+ final int crudThrottleTimeMs;
106109
107110 final StreamGroup <_RunnerEvent > _group = StreamGroup ();
108111 final StreamController <_RunnerEvent > _mainEvents = StreamController ();
@@ -111,7 +114,7 @@ class _SyncRunner {
111114 _ConnectedClient ? databaseHost;
112115 final connections = < _ConnectedClient > [];
113116
114- _SyncRunner (this .identifier) {
117+ _SyncRunner (this .identifier, this .crudThrottleTimeMs ) {
115118 _group.add (_mainEvents.stream);
116119
117120 Future (() async {
@@ -209,13 +212,26 @@ class _SyncRunner {
209212 }
210213 });
211214
215+ final tables = ['ps_crud' ];
216+ final crudThrottleTime = Duration (milliseconds: crudThrottleTimeMs);
217+ Stream <UpdateNotification > crudStream =
218+ powerSyncUpdateNotifications (Stream .empty ());
219+ if (database.updates != null ) {
220+ final filteredStream = database.updates!
221+ .transform (UpdateNotification .filterTablesTransformer (tables));
222+ crudStream = UpdateNotification .throttleStream (
223+ filteredStream,
224+ crudThrottleTime,
225+ addOne: UpdateNotification .empty (),
226+ );
227+ }
228+
212229 sync = StreamingSyncImplementation (
213230 adapter: BucketStorage (database),
214231 credentialsCallback: client.channel.credentialsCallback,
215232 invalidCredentialsCallback: client.channel.invalidCredentialsCallback,
216233 uploadCrud: client.channel.uploadCrud,
217- updateStream: powerSyncUpdateNotifications (
218- database.updates ?? const Stream .empty ()),
234+ crudUpdateTriggerStream: crudStream,
219235 retryDelay: Duration (seconds: 3 ),
220236 client: FetchClient (mode: RequestMode .cors),
221237 identifier: identifier,
0 commit comments