Skip to content

Commit fdd9844

Browse files
committed
Dexie-cloud addon websocket client-side rate-limits:
Decrease pause period from 10 to 1 second when more than 10 WebSocket messages per 10 seconds limit is reached. + simplify the loop + make it confifurable with const variables in top of the module. Remove the panic pause of one minute if getting into the limit over and over. Instead let it do it but at most 10 messages per second. If we see this becoming a problem we could enforce a limit on the server instead.
1 parent a09b699 commit fdd9844

File tree

1 file changed

+9
-14
lines changed

1 file changed

+9
-14
lines changed

addons/dexie-cloud/src/sync/messagesFromServerQueue.ts

+9-14
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ import { updateBaseRevs } from './updateBaseRevs';
1515
import { getLatestRevisionsPerTable } from './getLatestRevisionsPerTable';
1616
import { refreshAccessToken } from '../authentication/authenticate';
1717

18+
const LIMIT_NUM_MESSAGES_PER_TIME = 10; // Allow a maximum of 10 messages per...
19+
const TIME_WINDOW = 10_000; // ...10 seconds.
20+
const PAUSE_PERIOD = 1_000; // Pause for 1 second if reached
21+
1822
export type MessagesFromServerConsumer = ReturnType<
1923
typeof MessagesFromServerConsumer
2024
>;
@@ -25,8 +29,7 @@ export function MessagesFromServerConsumer(db: DexieCloudDB) {
2529
const event = new BehaviorSubject(null);
2630
let isWorking = false;
2731

28-
let loopWarning = 0;
29-
let loopDetection = [0, 0, 0, 0, 0, 0, 0, 0, 0, Date.now()];
32+
let loopDetection = new Array(LIMIT_NUM_MESSAGES_PER_TIME).fill(0);
3033

3134
event.subscribe(async () => {
3235
if (isWorking) return;
@@ -40,20 +43,12 @@ export function MessagesFromServerConsumer(db: DexieCloudDB) {
4043
} finally {
4144
if (
4245
loopDetection[loopDetection.length - 1] - loopDetection[0] <
43-
10000
46+
TIME_WINDOW
4447
) {
4548
// Ten loops within 10 seconds. Slow down!
46-
if (Date.now() - loopWarning < 5000) {
47-
// Last time we did this, we ended up here too. Wait for a minute.
48-
console.warn(`Slowing down websocket loop for one minute`);
49-
loopWarning = Date.now() + 60000;
50-
await new Promise((resolve) => setTimeout(resolve, 60000));
51-
} else {
52-
// This is a one-time event. Just pause 10 seconds.
53-
console.warn(`Slowing down websocket loop for 10 seconds`);
54-
loopWarning = Date.now() + 10000;
55-
await new Promise((resolve) => setTimeout(resolve, 10000));
56-
}
49+
// This is a one-time event. Just pause 10 seconds.
50+
console.warn(`Slowing down websocket loop for ${PAUSE_PERIOD} milliseconds`);
51+
await new Promise((resolve) => setTimeout(resolve, PAUSE_PERIOD));
5752
}
5853
isWorking = false;
5954
readyToServe.next(true);

0 commit comments

Comments
 (0)