aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2022-05-28 14:18:22 -0700
committerAnton Tananaev <anton@traccar.org>2022-05-28 14:18:22 -0700
commit941b4d5b8d365653f25937961c4b931ebebd4e6f (patch)
treef059067a816e024ddc790e901702e6180503231b
parentb61bf1e1ca6a8ff2ef3cacd4c38d57f6a46ee69b (diff)
downloadtrackermap-web-941b4d5b8d365653f25937961c4b931ebebd4e6f.tar.gz
trackermap-web-941b4d5b8d365653f25937961c4b931ebebd4e6f.tar.bz2
trackermap-web-941b4d5b8d365653f25937961c4b931ebebd4e6f.zip
Throttle frequent updates (fix #932)
-rw-r--r--modern/src/store/index.js6
-rw-r--r--modern/src/store/throttleMiddleware.js39
2 files changed, 44 insertions, 1 deletions
diff --git a/modern/src/store/index.js b/modern/src/store/index.js
index 72867b76..2ab0c982 100644
--- a/modern/src/store/index.js
+++ b/modern/src/store/index.js
@@ -8,6 +8,7 @@ import { geofencesReducer as geofences } from './geofences';
import { groupsReducer as groups } from './groups';
import { driversReducer as drivers } from './drivers';
import { maintenancesReducer as maintenances } from './maintenances';
+import throttleMiddleware from './throttleMiddleware';
const reducer = combineReducers({
errors,
@@ -29,4 +30,7 @@ export { groupsActions } from './groups';
export { driversActions } from './drivers';
export { maintenancesActions } from './maintenances';
-export default configureStore({ reducer });
+export default configureStore({
+ reducer,
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(throttleMiddleware),
+});
diff --git a/modern/src/store/throttleMiddleware.js b/modern/src/store/throttleMiddleware.js
new file mode 100644
index 00000000..9954b139
--- /dev/null
+++ b/modern/src/store/throttleMiddleware.js
@@ -0,0 +1,39 @@
+import { batch } from "react-redux";
+
+const threshold = 3;
+const interval = 1500;
+
+export default () => (next) => {
+ const buffer = [];
+ let throttle = false;
+ let counter = 0;
+
+ setInterval(() => {
+ console.log('batch');
+ if (throttle) {
+ if (buffer.length < threshold) {
+ throttle = false;
+ }
+ batch(() => buffer.splice(0, buffer.length).forEach((action) => next(action)));
+ } else {
+ if (counter > threshold) {
+ throttle = true;
+ }
+ counter = 0;
+ }
+ }, interval);
+
+ return (action) => {
+ console.log(action);
+ if (action.type === 'devices/update' || action.type === 'positions/update') {
+ if (throttle) {
+ buffer.push(action);
+ } else {
+ counter += 1;
+ return next(action);
+ }
+ } else {
+ return next(action);
+ }
+ };
+};