From a3b1cc1e2fd7c80df0cfb4111d7f72bad864c0d5 Mon Sep 17 00:00:00 2001 From: Kirk Morrow <9563562+kirkmorrow@users.noreply.github.com> Date: Thu, 11 Dec 2025 07:09:34 -0600 Subject: [PATCH 1/4] feat: Add client-to-server request retry parameter support --- packages/flutter/lib/parse_server_sdk_flutter.dart | 4 ++++ packages/flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/parse_server_sdk_flutter.dart b/packages/flutter/lib/parse_server_sdk_flutter.dart index 4a8dd7c12..f2223cd1f 100644 --- a/packages/flutter/lib/parse_server_sdk_flutter.dart +++ b/packages/flutter/lib/parse_server_sdk_flutter.dart @@ -66,6 +66,8 @@ class Parse extends sdk.Parse Map? registeredSubClassMap, sdk.ParseUserConstructor? parseUserConstructor, sdk.ParseFileConstructor? parseFileConstructor, + List? restRetryIntervals, + List? restRetryIntervalsForWrites, List? liveListRetryIntervals, sdk.ParseConnectivityProvider? connectivityProvider, String? fileDirectory, @@ -102,6 +104,8 @@ class Parse extends sdk.Parse registeredSubClassMap: registeredSubClassMap, parseUserConstructor: parseUserConstructor, parseFileConstructor: parseFileConstructor, + restRetryIntervals: restRetryIntervals, + restRetryIntervalsForWrites: restRetryIntervalsForWrites, liveListRetryIntervals: liveListRetryIntervals, connectivityProvider: connectivityProvider ?? this, fileDirectory: diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index 27a53cf9b..981a825f9 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: flutter: sdk: flutter - parse_server_sdk: ">=9.4.2 <10.0.0" + parse_server_sdk: ">=9.5.0 <10.0.0" # Uncomment for local testing #parse_server_sdk: # path: ../dart From fc8a38b1f425b68e6ddd05f9263aaca84cdc0831 Mon Sep 17 00:00:00 2001 From: Kirk Morrow <9563562+kirkmorrow@users.noreply.github.com> Date: Thu, 11 Dec 2025 07:30:42 -0600 Subject: [PATCH 2/4] Add missing comments and parameter test --- packages/flutter/lib/parse_server_sdk_flutter.dart | 10 ++++++++++ .../flutter/test/parse_client_configuration_test.dart | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/packages/flutter/lib/parse_server_sdk_flutter.dart b/packages/flutter/lib/parse_server_sdk_flutter.dart index f2223cd1f..6a85d1b40 100644 --- a/packages/flutter/lib/parse_server_sdk_flutter.dart +++ b/packages/flutter/lib/parse_server_sdk_flutter.dart @@ -47,6 +47,16 @@ class Parse extends sdk.Parse /// ``` /// [appName], [appVersion] and [appPackageName] are automatically set on Android and IOS, if they are not defined. You should provide a value on web. /// [fileDirectory] is not used on web + /// + /// [restRetryIntervals] - Retry intervals in milliseconds for read operations. + /// Applies to: GET, DELETE, and getBytes methods. + /// Default: [0, 250, 500, 1000, 2000] (5 retry attempts with exponential backoff). + /// Set to [] to disable retries for read operations. + /// + /// [restRetryIntervalsForWrites] - Retry intervals in milliseconds for write operations. + /// Applies to: POST, PUT, and postBytes methods. + /// Default: [] (no retries to prevent duplicate data creation). + /// Configure only if you have idempotency guarantees in place. @override Future initialize( String appId, diff --git a/packages/flutter/test/parse_client_configuration_test.dart b/packages/flutter/test/parse_client_configuration_test.dart index 60a384508..630b09d5a 100644 --- a/packages/flutter/test/parse_client_configuration_test.dart +++ b/packages/flutter/test/parse_client_configuration_test.dart @@ -19,6 +19,8 @@ void main() { sessionId: 'sessionId', fileDirectory: 'someDirectory', debug: true, + restRetryIntervals: [100, 200, 300], + restRetryIntervalsForWrites: [500, 1000], ); // assert @@ -33,5 +35,7 @@ void main() { expect(ParseCoreData().sessionId, 'sessionId'); expect(ParseCoreData().debug, true); expect(ParseCoreData().fileDirectory, 'someDirectory'); + expect(ParseCoreData().restRetryIntervals, [100, 200, 300]); + expect(ParseCoreData().restRetryIntervalsForWrites, [500, 1000]); }); } From ec1a67ab6aefe7143055e09fd92eff2c414e3ec5 Mon Sep 17 00:00:00 2001 From: Kirk Morrow <9563562+kirkmorrow@users.noreply.github.com> Date: Thu, 11 Dec 2025 07:46:54 -0600 Subject: [PATCH 3/4] Add defaults test --- .../test/parse_client_configuration_test.dart | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/flutter/test/parse_client_configuration_test.dart b/packages/flutter/test/parse_client_configuration_test.dart index 630b09d5a..6ac3f4ff9 100644 --- a/packages/flutter/test/parse_client_configuration_test.dart +++ b/packages/flutter/test/parse_client_configuration_test.dart @@ -38,4 +38,27 @@ void main() { expect(ParseCoreData().restRetryIntervals, [100, 200, 300]); expect(ParseCoreData().restRetryIntervalsForWrites, [500, 1000]); }); + + test('testDefaultValues', () async { + // arrange - initialize with only required parameters + await Parse().initialize( + 'appId', + 'serverUrl', + appName: 'appName', + appPackageName: 'somePackageName', + appVersion: 'someAppVersion', + ); + + // assert - verify default values are used + expect(ParseCoreData().applicationId, 'appId'); + expect(ParseCoreData().serverUrl, 'serverUrl'); + expect(ParseCoreData().debug, false); // default + expect(ParseCoreData().autoSendSessionId, true); // default + expect(ParseCoreData().clientKey, null); // not provided + expect(ParseCoreData().masterKey, null); // not provided + expect(ParseCoreData().sessionId, null); // not provided + expect(ParseCoreData().liveQueryURL, null); // not provided + expect(ParseCoreData().restRetryIntervals, [0, 250, 500, 1000, 2000]); + expect(ParseCoreData().restRetryIntervalsForWrites, []); + }); } From da9471760dbcd1b6aa6d0131616529009bccee0f Mon Sep 17 00:00:00 2001 From: Kirk Morrow <9563562+kirkmorrow@users.noreply.github.com> Date: Thu, 11 Dec 2025 07:53:41 -0600 Subject: [PATCH 4/4] Fix new test --- .../flutter/test/parse_client_configuration_test.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/flutter/test/parse_client_configuration_test.dart b/packages/flutter/test/parse_client_configuration_test.dart index 6ac3f4ff9..048b3ae77 100644 --- a/packages/flutter/test/parse_client_configuration_test.dart +++ b/packages/flutter/test/parse_client_configuration_test.dart @@ -3,6 +3,7 @@ import 'package:parse_server_sdk_flutter/parse_server_sdk_flutter.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); SharedPreferences.setMockInitialValues({}); test('testBuilder', () async { @@ -40,24 +41,30 @@ void main() { }); test('testDefaultValues', () async { - // arrange - initialize with only required parameters + // arrange - initialize with minimal parameters to test defaults await Parse().initialize( 'appId', 'serverUrl', appName: 'appName', appPackageName: 'somePackageName', appVersion: 'someAppVersion', + fileDirectory: 'someDirectory', ); // assert - verify default values are used expect(ParseCoreData().applicationId, 'appId'); expect(ParseCoreData().serverUrl, 'serverUrl'); + expect(ParseCoreData().appName, 'appName'); + expect(ParseCoreData().appPackageName, 'somePackageName'); + expect(ParseCoreData().appVersion, 'someAppVersion'); expect(ParseCoreData().debug, false); // default expect(ParseCoreData().autoSendSessionId, true); // default expect(ParseCoreData().clientKey, null); // not provided expect(ParseCoreData().masterKey, null); // not provided expect(ParseCoreData().sessionId, null); // not provided expect(ParseCoreData().liveQueryURL, null); // not provided + // Note: default retry values mirror parse_server_sdk defaults and may need + // updating if those change in future versions expect(ParseCoreData().restRetryIntervals, [0, 250, 500, 1000, 2000]); expect(ParseCoreData().restRetryIntervalsForWrites, []); });