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:
Vishesh Handa
2021-08-09 15:07:17 +02:00
parent 54c36af040
commit 371bd996ec
2 changed files with 77 additions and 0 deletions

View 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;
}
}

View 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);
});
}