mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-25 16:19:58 +08:00
Add AnalyticsStorage class
A simple way to store the events. Since we are using protobufs, we can efficiently store events in a binary form.
This commit is contained in:
46
lib/analytics/storage.dart
Normal file
46
lib/analytics/storage.dart
Normal file
@ -0,0 +1,46 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:buffer/buffer.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:universal_io/io.dart';
|
||||
|
||||
import 'generated/analytics.pb.dart' as pb;
|
||||
|
||||
class AnalyticsStorage {
|
||||
final String folderPath;
|
||||
|
||||
AnalyticsStorage(this.folderPath);
|
||||
|
||||
Future<void> appendEvent(pb.Event event) async {
|
||||
var eventData = event.writeToBuffer();
|
||||
|
||||
var filePath = p.join(folderPath, 'analytics');
|
||||
// print(filePath);
|
||||
|
||||
var intData = ByteData(4);
|
||||
intData.setInt32(0, eventData.length);
|
||||
|
||||
var builder = BytesBuilder();
|
||||
builder.add(intData.buffer.asUint8List());
|
||||
builder.add(eventData);
|
||||
|
||||
await File(filePath).writeAsBytes(builder.toBytes(), mode: FileMode.append);
|
||||
}
|
||||
|
||||
Future<List<pb.Event>> fetchAll() async {
|
||||
var file = File(p.join(folderPath, 'analytics'));
|
||||
var bytes = await file.readAsBytes();
|
||||
var events = <pb.Event>[];
|
||||
|
||||
var reader = ByteDataReader(copy: false);
|
||||
reader.add(bytes);
|
||||
while (reader.remainingLength != 0) {
|
||||
var len = reader.readUint32();
|
||||
var bytes = reader.read(len);
|
||||
|
||||
var event = pb.Event.fromBuffer(bytes);
|
||||
events.add(event);
|
||||
}
|
||||
return events;
|
||||
}
|
||||
}
|
31
test/analytics/storage_test.dart
Normal file
31
test/analytics/storage_test.dart
Normal file
@ -0,0 +1,31 @@
|
||||
import 'package:fixnum/fixnum.dart';
|
||||
import 'package:test/test.dart';
|
||||
import 'package:universal_io/io.dart';
|
||||
|
||||
import 'package:gitjournal/analytics/generated/analytics.pb.dart' as pb;
|
||||
import 'package:gitjournal/analytics/storage.dart';
|
||||
|
||||
void main() {
|
||||
test('Read and write', () async {
|
||||
var dt = DateTime.now().add(const Duration(days: -1));
|
||||
var ev = pb.Event(
|
||||
name: 'test',
|
||||
date: Int64(dt.millisecondsSinceEpoch ~/ 1000),
|
||||
params: {'a': 'hello'},
|
||||
pseudoId: 'id',
|
||||
userProperties: {'b': 'c'},
|
||||
sessionID: 'session',
|
||||
);
|
||||
|
||||
var dir = await Directory.systemTemp.createTemp('_analytics_');
|
||||
var storage = AnalyticsStorage(dir.path);
|
||||
await storage.appendEvent(ev);
|
||||
await storage.appendEvent(ev);
|
||||
|
||||
var events = await storage.fetchAll();
|
||||
expect(events.length, 2);
|
||||
expect(events[0].toDebugString(), ev.toDebugString());
|
||||
expect(events[1].toDebugString(), ev.toDebugString());
|
||||
// expect(events[0], ev);
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user