queue.dart
2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:auto_track/auto_track/config/manager.dart';
import 'package:auto_track/auto_track/utils/track_model.dart';
import '../log/logger.dart';
class AutoTrackQueue {
static final AutoTrackQueue instance = AutoTrackQueue._();
AutoTrackQueue._() {
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
Timer? _timer;
final List<TrackModel> _queue = [];
final httpClient = HttpClient();
void appendQueue(TrackModel model) {
if (_timer == null) return;
_queue.add(model);
}
void start() {
if (_timer != null) return;
_timer = Timer.periodic(
Duration(
seconds: AutoTrackConfigManager.instance.config.uploadInterval ??
10), (timer) {
flush();
});
}
void stop() {
_timer?.cancel();
_timer = null;
}
void flush() {
if (_queue.isEmpty) return;
final uploadList = List.from(_queue);
_queue.clear();
final config = AutoTrackConfigManager.instance.config;
final host = config.host;
if (config.samplingRate != 1) {
if (Random().nextDouble() > config.samplingRate) {
// 不在采样范围不上传
return;
}
}
if (host != null) {
final t = DateTime.now().millisecondsSinceEpoch;
httpClient.postUrl(Uri.parse(host)).then((request) {
request.headers.contentType = ContentType.json;
request.write(json.encode({
'app_key': config.appKey ?? '',
'signature': config.signature!(t),
't': t,
'user_id': config.userId ?? '',
'track_id': config.trackId ?? '',
'unique_id':
config.uniqueId ?? AutoTrackConfigManager.instance.deviceId,
'device_id': AutoTrackConfigManager.instance.deviceId,
'data_list': uploadList.map((e) => e.toMap()).toList(),
'app_version': AutoTrackConfigManager.instance.appVersion,
'device_info': AutoTrackConfigManager.instance.deviceInfo
}));
return request.close();
}).then((response) {
AutoTrackLogger.getInstance()
.debug('upload status => ${response.statusCode}');
}).catchError((error) {
AutoTrackLogger.getInstance().error(error);
});
}
}
}