46 lines
1.1 KiB
Dart
46 lines
1.1 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:dio/dio.dart';
|
|
|
|
import 'events/events.dart';
|
|
|
|
class AnalyticsSender {
|
|
final Dio _dio;
|
|
final String endpoint;
|
|
|
|
AnalyticsSender({required this.endpoint, Dio? dio}) : _dio = dio ?? Dio();
|
|
|
|
Future<void> send(List<BaseAnalyticsEvent> events) async {
|
|
if (events.isEmpty) return;
|
|
|
|
final body = {'events': events.map((e) => e.toJson()).toList()};
|
|
|
|
try {
|
|
await _dio.post(
|
|
endpoint,
|
|
data: jsonEncode(body),
|
|
options: Options(
|
|
headers: {'Content-Type': 'application/json'},
|
|
sendTimeout: const Duration(seconds: 10),
|
|
receiveTimeout: const Duration(seconds: 10),
|
|
),
|
|
);
|
|
} on DioException catch (e) {
|
|
throw AnalyticsSendException(
|
|
'Failed to send analytics events: ${e.message}',
|
|
events: events,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
class AnalyticsSendException implements Exception {
|
|
final String message;
|
|
final List<BaseAnalyticsEvent> events;
|
|
|
|
AnalyticsSendException(this.message, {required this.events});
|
|
|
|
@override
|
|
String toString() => 'AnalyticsSendException: $message';
|
|
}
|