mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-26 16:46:51 +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