Use a Duration for batching delay
diff --git a/example/ga.dart b/example/ga.dart index 3526fc3..e160ad6 100644 --- a/example/ga.dart +++ b/example/ga.dart
@@ -8,7 +8,7 @@ import 'package:usage/usage_io.dart'; void main(List args) async { - final defaultUA = 'UA-55029513-1'; + final defaultUA = 'UA-188575324-1'; if (args.isEmpty) { print('usage: dart ga <GA tracking ID>'); @@ -27,6 +27,8 @@ .sendException('foo error:\n${sanitizeStacktrace(StackTrace.current)}'); await ga.sendTiming('writeDuration', 123); await ga.sendEvent('create', 'consoleapp', label: 'Console App'); + await ga.sendEvent('destroy', 'consoleapp', label: 'Console App'); + print('pinged ${ua}'); await ga.waitForLastPing();
diff --git a/lib/src/usage_impl.dart b/lib/src/usage_impl.dart index 872e481..f3939b9 100644 --- a/lib/src/usage_impl.dart +++ b/lib/src/usage_impl.dart
@@ -6,8 +6,6 @@ import 'dart:collection'; import 'dart:math' as math; -import 'package:pedantic/pedantic.dart'; - import '../usage.dart'; import '../uuid/uuid.dart'; @@ -81,7 +79,7 @@ @override AnalyticsOpt analyticsOpt = AnalyticsOpt.optOut; - late Future<void>? Function() _batchingDelay; + late Duration _batchingDelay; final Queue<String> _batchedEvents = Queue<String>(); bool _isSendingScheduled = false; @@ -99,14 +97,14 @@ this.applicationVersion, String? analyticsUrl, String? analyticsBatchingUrl, - Future<void>? Function()? batchingDelay, + Duration? batchingDelay, }) { if (applicationName != null) setSessionValue('an', applicationName); if (applicationVersion != null) setSessionValue('av', applicationVersion); _url = analyticsUrl ?? _defaultAnalyticsUrl; _batchingUrl = analyticsBatchingUrl ?? _defaultAnalyticsBatchingUrl; - _batchingDelay = batchingDelay ?? () => Future(() {}); + _batchingDelay = batchingDelay ?? const Duration(); } bool? _firstRun; @@ -272,16 +270,12 @@ _batchedEvents.add(postHandler.encodeHit(eventArgs)); if (!_isSendingScheduled) { - final delay = _batchingDelay(); - if (delay == null) { + _isSendingScheduled = true; + // ignore: unawaited_futures + Future.delayed(_batchingDelay).then((value) { + _isSendingScheduled = false; _trySendBatches(completer); - } else { - _isSendingScheduled = true; - unawaited(delay.then((value) { - _isSendingScheduled = false; - _trySendBatches(completer); - })); - } + }); } return completer.future; }
diff --git a/lib/src/usage_impl_html.dart b/lib/src/usage_impl_html.dart index 97c2567..b2501aa 100644 --- a/lib/src/usage_impl_html.dart +++ b/lib/src/usage_impl_html.dart
@@ -24,7 +24,7 @@ String applicationName, String applicationVersion, { String? analyticsUrl, - Future<void>? Function()? batchingDelay, + Duration? batchingDelay, }) : super( trackingId, HtmlPersistentProperties(applicationName),
diff --git a/lib/src/usage_impl_io.dart b/lib/src/usage_impl_io.dart index 800d591..f4d257a 100644 --- a/lib/src/usage_impl_io.dart +++ b/lib/src/usage_impl_io.dart
@@ -26,12 +26,10 @@ /// be supplied. For Flutter applications, you should pass in a value like /// `PathProvider.getApplicationDocumentsDirectory()`. /// -/// [batchingDelay] is used to control batching behaviour. It should return a -/// [Future] that will be awaited before attempting sending the enqueued -/// messages. The default [batchingDelay] is `() => Future(() {})`. That implies -/// messages will be sent whem control returns to the event loop. -/// -/// If [batchingDelay] returns `null`, events will not be batched. +/// [batchingDelay] is used to control batching behaviour. Events will be sent +/// batches of 20 after the duration is over from when the first message was +/// sent. The default is 0 milliseconds, meaning that messages will be sent when +/// control returns to the event loop. /// /// Batched messages are sent in batches of up to 20 messages. They will be sent /// to [analyticsBatchingUrl] defaulting to @@ -45,7 +43,7 @@ String? analyticsBatchingUrl, Directory? documentDirectory, HttpClient? client, - Future<void>? Function()? batchingDelay, + Duration? batchingDelay, }) : super( trackingId, IOPersistentProperties(applicationName,
diff --git a/pubspec.yaml b/pubspec.yaml index 6e51cfe..42b2e18 100644 --- a/pubspec.yaml +++ b/pubspec.yaml
@@ -11,8 +11,8 @@ sdk: '>=2.12.0-0 <3.0.0' dependencies: - pedantic: ^1.9.0 path: ^1.8.0 dev_dependencies: + pedantic: ^1.9.0 test: ^1.16.0-nullsafety
diff --git a/test/usage_impl_io_test.dart b/test/usage_impl_io_test.dart index ea4535e..65f6708 100644 --- a/test/usage_impl_io_test.dart +++ b/test/usage_impl_io_test.dart
@@ -59,30 +59,6 @@ }); group('batching', () { - test('With batch-delay returning null sends all events individually', - () async { - final mockClient = MockHttpClient(); - - final analytics = AnalyticsIO('<TRACKING-ID', 'usage-test', '0.0.1', - client: mockClient, batchingDelay: () => null); - unawaited(analytics.sendEvent('my-event1', 'something')); - unawaited(analytics.sendEvent('my-event2', 'something')); - unawaited(analytics.sendEvent('my-event3', 'something')); - await analytics.waitForLastPing(); - analytics.close(); - expect(mockClient.requests.length, 3); - final clientId = analytics.clientId; - expect(mockClient.requests[0].buffer.toString(), ''' -Request to https://www.google-analytics.com/collect with ${createUserAgent()} -ec=my-event1&ea=something&an=usage-test&av=0.0.1&ul=en-us&v=1&tid=%3CTRACKING-ID&cid=$clientId&t=event'''); - expect(mockClient.requests[1].buffer.toString(), ''' -Request to https://www.google-analytics.com/collect with ${createUserAgent()} -ec=my-event2&ea=something&an=usage-test&av=0.0.1&ul=en-us&v=1&tid=%3CTRACKING-ID&cid=$clientId&t=event'''); - expect(mockClient.requests[2].buffer.toString(), ''' -Request to https://www.google-analytics.com/collect with ${createUserAgent()} -ec=my-event3&ea=something&an=usage-test&av=0.0.1&ul=en-us&v=1&tid=%3CTRACKING-ID&cid=$clientId&t=event'''); - }); - test( 'with default batch-delay hits from the same sync span are batched together', () async {