• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Floating-Dartists / matomo-tracker / 6492014594

12 Oct 2023 06:19AM CUT coverage: 93.108%. First build
6492014594

Pull #124

github

web-flow
Merge 981f45404 into 27a0bf2df
Pull Request #124: chore: bump dependencies, fix formatting

743 of 798 relevant lines covered (93.11%)

2.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.88
/lib/src/persistent_queue.dart
1
import 'dart:async';
2
import 'dart:collection';
3
import 'dart:convert';
4

5
import 'package:collection/collection.dart';
6
import 'package:flutter/foundation.dart';
7
import 'package:matomo_tracker/src/dispatch_settings.dart';
8
import 'package:matomo_tracker/src/local_storage/local_storage.dart';
9

10
class PersistentQueue extends DelegatingQueue<Map<String, String>> {
11
  PersistentQueue._(this._storage, Queue<Map<String, String>> base)
1✔
12
      : _needsSave = false,
13
        super(base);
1✔
14

15
  static Future<PersistentQueue> load({
1✔
16
    required LocalStorage storage,
17
    required PersistenceFilter onLoadFilter,
18
  }) async {
19
    final actionsData = await storage.loadActions();
1✔
20
    final actions = decode(actionsData)..retainWhere(onLoadFilter);
2✔
21
    final queue = PersistentQueue._(storage, Queue.of(actions));
2✔
22
    await queue.save();
1✔
23
    return queue;
24
  }
25

26
  @visibleForTesting
1✔
27
  static List<Map<String, String>> decode(String? actionsData) {
28
    if (actionsData != null) {
29
      final actions = jsonDecode(actionsData);
1✔
30
      if (actions is! List) {
1✔
31
        throw FormatException('Expected a list of actions, but got: $actions');
×
32
      }
33
      return actions
34
          .cast<Map<String, dynamic>>()
1✔
35
          .map<Map<String, String>>((element) => element.cast())
3✔
36
          .toList();
1✔
37
    } else {
38
      return [];
1✔
39
    }
40
  }
41

42
  final LocalStorage _storage;
43
  bool _needsSave;
44
  Completer<void>? _saveInProgress;
45
  @visibleForTesting
1✔
46
  bool get saveInProgress => _saveInProgress != null;
1✔
47

48
  @visibleForTesting
1✔
49
  Future<void> save() {
50
    _needsSave = true;
1✔
51
    final effectiveSaveInProgress = _saveInProgress ?? Completer<void>();
2✔
52
    if (effectiveSaveInProgress != _saveInProgress) {
2✔
53
      assert(_saveInProgress == null);
1✔
54
      _saveInProgress = effectiveSaveInProgress;
1✔
55
      unawaited(
1✔
56
        Future(() async {
2✔
57
          try {
58
            while (_needsSave) {
1✔
59
              _needsSave = false;
1✔
60
              final data = json.encode(toList());
2✔
61
              await _storage.storeActions(data);
2✔
62
            }
63
            effectiveSaveInProgress.complete();
1✔
64
          } catch (error, stackTrace) {
65
            effectiveSaveInProgress.completeError(error, stackTrace);
×
66
          } finally {
67
            _saveInProgress = null;
1✔
68
          }
69
        }),
70
      );
71
    }
72
    return effectiveSaveInProgress.future;
1✔
73
  }
74

75
  void _unawaitedSave() => unawaited(save());
3✔
76

77
  @override
1✔
78
  void add(Map<String, String> value) {
79
    super.add(value);
1✔
80
    _unawaitedSave();
1✔
81
  }
82

83
  @override
1✔
84
  void addAll(Iterable<Map<String, String>> iterable) {
85
    super.addAll(iterable);
1✔
86
    _unawaitedSave();
1✔
87
  }
88

89
  @override
1✔
90
  void addFirst(Map<String, String> value) {
91
    super.addFirst(value);
1✔
92
    _unawaitedSave();
1✔
93
  }
94

95
  @override
1✔
96
  void addLast(Map<String, String> value) {
97
    super.addLast(value);
1✔
98
    _unawaitedSave();
1✔
99
  }
100

101
  @override
1✔
102
  void clear() {
103
    super.clear();
1✔
104
    _unawaitedSave();
1✔
105
  }
106

107
  @override
1✔
108
  bool remove(Object? object) {
109
    final result = super.remove(object);
1✔
110
    _unawaitedSave();
1✔
111
    return result;
112
  }
113

114
  @override
1✔
115
  Map<String, String> removeFirst() {
116
    final result = super.removeFirst();
1✔
117
    _unawaitedSave();
1✔
118
    return result;
119
  }
120

121
  @override
1✔
122
  Map<String, String> removeLast() {
123
    final result = super.removeLast();
1✔
124
    _unawaitedSave();
1✔
125
    return result;
126
  }
127

128
  @override
1✔
129
  void removeWhere(bool Function(Map<String, String> element) test) {
130
    super.removeWhere(test);
1✔
131
    _unawaitedSave();
1✔
132
  }
133

134
  @override
1✔
135
  void retainWhere(bool Function(Map<String, String> element) test) {
136
    super.retainWhere(test);
1✔
137
    _unawaitedSave();
1✔
138
  }
139
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc