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 {