From 1b86360f38a14257bdc503ce7bff6b2b2e8d3589 Mon Sep 17 00:00:00 2001 From: vauvenal5 Date: Sat, 14 Mar 2026 18:20:05 +0100 Subject: [PATCH] feat(neon_framework): queue for request manager to limit parallel requests to server Signed-off-by: vauvenal5 --- .../lib/src/utils/request_manager.dart | 26 ++++++++++++++++- packages/neon_framework/pubspec.yaml | 1 + pubspec.lock | 28 +++++++++---------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/packages/neon_framework/lib/src/utils/request_manager.dart b/packages/neon_framework/lib/src/utils/request_manager.dart index df72b9c0a18..1b26e25455d 100644 --- a/packages/neon_framework/lib/src/utils/request_manager.dart +++ b/packages/neon_framework/lib/src/utils/request_manager.dart @@ -11,6 +11,7 @@ import 'package:neon_framework/src/bloc/result.dart'; import 'package:neon_framework/storage.dart'; import 'package:neon_http_client/neon_http_client.dart'; import 'package:nextcloud/utils.dart'; +import 'package:queue/queue.dart'; import 'package:rxdart/rxdart.dart'; import 'package:timezone/timezone.dart' as tz; @@ -67,7 +68,11 @@ class RequestManager { @visibleForTesting http.Client? httpClient; - /// Executes a generic [http.Request]. + /// This allows us to limit the amount of parallel requests to the server. + /// This is especially important when opening a gallery with a lot of images which require previews. + final _requestQueue = Queue(parallel: 10); + + /// Executes a generic [http.Request] in a quened manner. Future wrap({ required Account account, required BehaviorSubject> subject, @@ -75,6 +80,25 @@ class RequestManager { required Converter converter, required UnwrapCallback unwrap, AsyncValueGetter>? getCacheHeaders, + }) async { + await _requestQueue.add(() => _wrap( + account: account, + subject: subject, + getRequest: getRequest, + converter: converter, + unwrap: unwrap, + getCacheHeaders: getCacheHeaders, + )); + } + + /// Executes a generic [http.Request]. + Future _wrap({ + required Account account, + required BehaviorSubject> subject, + required http.Request Function() getRequest, + required Converter converter, + required UnwrapCallback unwrap, + AsyncValueGetter>? getCacheHeaders, }) async { if (subject.isClosed) { return; diff --git a/packages/neon_framework/pubspec.yaml b/packages/neon_framework/pubspec.yaml index 46044b6a4bb..997e5271d79 100644 --- a/packages/neon_framework/pubspec.yaml +++ b/packages/neon_framework/pubspec.yaml @@ -56,6 +56,7 @@ dependencies: path_provider: ^2.1.0 permission_handler: ^12.0.0 provider: ^6.0.0 + queue: ^3.0.0 quick_actions: ^1.0.0 rxdart: ^0.28.0 scrollable_positioned_list: ^0.3.0 diff --git a/pubspec.lock b/pubspec.lock index 1c4c8f53715..8c34307f51a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -931,26 +931,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lint_maker: dependency: transitive description: @@ -1696,26 +1696,26 @@ packages: dependency: transitive description: name: test - sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" url: "https://pub.dev" source: hosted - version: "1.25.15" + version: "1.26.2" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" test_core: dependency: transitive description: name: test_core - sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.11" timezone: dependency: transitive description: @@ -1880,10 +1880,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" version: dependency: transitive description: