diff --git a/lib/analytics/storage.dart b/lib/analytics/storage.dart new file mode 100644 index 00000000..96640676 --- /dev/null +++ b/lib/analytics/storage.dart @@ -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 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> fetchAll() async { + var file = File(p.join(folderPath, 'analytics')); + var bytes = await file.readAsBytes(); + var events = []; + + 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; + } +} diff --git a/test/analytics/storage_test.dart b/test/analytics/storage_test.dart new file mode 100644 index 00000000..977bdbd9 --- /dev/null +++ b/test/analytics/storage_test.dart @@ -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); + }); +}