Skip to content

Commit d1cf8c9

Browse files
committed
feat: add throttle and delay to connect
1 parent e79ed9b commit d1cf8c9

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

packages/common/src/client/AbstractPowerSyncDatabase.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,11 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
243243
protected abstract openDBAdapter(options: PowerSyncDatabaseOptionsWithSettings): DBAdapter;
244244

245245
protected abstract generateSyncStreamImplementation(
246-
connector: PowerSyncBackendConnector
246+
connector: PowerSyncBackendConnector,
247+
options?: {
248+
retryDelayMs?: number;
249+
crudUploadThrottleMs?: number;
250+
}
247251
): StreamingSyncImplementation;
248252

249253
protected abstract generateBucketStorageAdapter(): BucketStorageAdapter;
@@ -388,7 +392,10 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
388392
throw new Error('Cannot connect using a closed client');
389393
}
390394

391-
this.syncStreamImplementation = this.generateSyncStreamImplementation(connector);
395+
this.syncStreamImplementation = this.generateSyncStreamImplementation(connector, {
396+
crudUploadThrottleMs: options?.crudUploadThrottleMs,
397+
retryDelay: options?.retryDelayMs
398+
});
392399
this.syncStatusListenerDisposer = this.syncStreamImplementation.registerListener({
393400
statusChanged: (status) => {
394401
this.currentStatus = new SyncStatus({

packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,17 @@ export interface PowerSyncConnectionOptions {
7979
* These parameters are passed to the sync rules, and will be available under the`user_parameters` object.
8080
*/
8181
params?: Record<string, StreamingSyncRequestParameterType>;
82+
/**
83+
* Delay for retrying sync streaming operations
84+
* from the PowerSync backend after an error occurs.
85+
*/
86+
retryDelayMs?: number;
87+
/**
88+
* Backend Connector CRUD operations are throttled
89+
* to occur at most every `crudUploadThrottleMs`
90+
* milliseconds.
91+
*/
92+
crudUploadThrottleMs?: number;
8293
}
8394

8495
export interface StreamingSyncImplementation extends BaseObserver<StreamingSyncImplementationListener>, Disposable {
@@ -102,14 +113,15 @@ export interface StreamingSyncImplementation extends BaseObserver<StreamingSyncI
102113
}
103114

104115
export const DEFAULT_CRUD_UPLOAD_THROTTLE_MS = 1000;
116+
export const DEFAULT_RETRY_DELAY_MS = 5000;
105117

106118
export const DEFAULT_STREAMING_SYNC_OPTIONS = {
107-
retryDelayMs: 5000,
119+
retryDelayMs: DEFAULT_RETRY_DELAY_MS,
108120
logger: Logger.get('PowerSyncStream'),
109121
crudUploadThrottleMs: DEFAULT_CRUD_UPLOAD_THROTTLE_MS
110122
};
111123

112-
export const DEFAULT_STREAM_CONNECTION_OPTIONS: Required<PowerSyncConnectionOptions> = {
124+
export const DEFAULT_STREAM_CONNECTION_OPTIONS: Required<Omit<PowerSyncConnectionOptions, 'retryDelayMs' | 'crudUploadThrottleMs'>> = {
113125
connectionMethod: SyncStreamConnectionMethod.WEB_SOCKET,
114126
params: {}
115127
};
@@ -427,7 +439,7 @@ The next upload iteration will be delayed.`);
427439
type: LockType.SYNC,
428440
signal,
429441
callback: async () => {
430-
const resolvedOptions: Required<PowerSyncConnectionOptions> = {
442+
const resolvedOptions: Required<Omit<PowerSyncConnectionOptions, 'retryDelayMs' | 'crudUploadThrottleMs'>> = {
431443
...DEFAULT_STREAM_CONNECTION_OPTIONS,
432444
...(options ?? {})
433445
};

packages/react-native/src/db/PowerSyncDatabase.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,12 @@ export class PowerSyncDatabase extends AbstractPowerSyncDatabase {
4242
}
4343

4444
protected generateSyncStreamImplementation(
45-
connector: PowerSyncBackendConnector
45+
connector: PowerSyncBackendConnector,
46+
// This is used to pass in options on connection instead of only during db creation
47+
options?: {
48+
retryDelayMs: number;
49+
crudUploadThrottleMs: number;
50+
}
4651
): AbstractStreamingSyncImplementation {
4752
const remote = new ReactNativeRemote(connector);
4853

@@ -53,8 +58,8 @@ export class PowerSyncDatabase extends AbstractPowerSyncDatabase {
5358
await this.waitForReady();
5459
await connector.uploadData(this);
5560
},
56-
retryDelayMs: this.options.retryDelay,
57-
crudUploadThrottleMs: this.options.crudUploadThrottleMs,
61+
retryDelayMs: options?.retryDelayMs || this.options.retryDelay,
62+
crudUploadThrottleMs: options?.crudUploadThrottleMs || this.options.crudUploadThrottleMs,
5863
identifier: this.database.name
5964
});
6065
}

0 commit comments

Comments
 (0)