@@ -5,10 +5,13 @@ import 'dart:typed_data';
55
66import 'package:lib5/src/util/big_endian.dart' ;
77import 'package:lib5/util.dart' ;
8+ // ignore: implementation_imports
9+ import 'package:lib5/src/node/logger/base.dart' ;
810import 'package:ntp/ntp.dart' ;
911import 'package:s5/s5.dart' ;
1012import 'package:s5/src/hive_key_value_db.dart' ;
1113import 'package:s5_messenger/src/mls5/state/messenger.dart' ;
14+ import 'package:s5_messenger/src/mls5/util/logger.dart' ;
1215import 'package:s5_messenger/src/rust/api/simple.dart' ;
1316import 'package:s5_messenger/src/rust/frb_generated.dart' ;
1417import 'package:hive_ce/hive.dart' ;
@@ -42,7 +45,7 @@ class S5Messenger {
4245
4346 Future <void > init (S5 inputS5, String dbPath,
4447 [String prefix = 'default' ]) async {
45- logger = SimpleLogger (prefix: "[s5_messenger]" );
48+ logger = S5MessengerLogger (prefix: "[s5_messenger]" );
4649 s5 = inputS5;
4750 dataBox = await Hive .openBox ('s5-messenger-data' );
4851 groupsBox = await Hive .openBox ('s5-messenger-groups' );
@@ -61,22 +64,34 @@ class S5Messenger {
6164 keystoreBox = /* HiveKeyValueDB( */ await Hive .openBox ('$prefix -keystore' );
6265 // groupStateDB = HiveKeyValueDB(await Hive.openBox('group_state'));
6366
67+ initLogging ().listen ((entry) {
68+ final rustLogger = S5MessengerLogger (prefix: "[s5_messenger:rust]" );
69+ final msg = "${entry .tag }: ${entry .msg }" ;
70+ if (entry.level <= 1 ) {
71+ rustLogger.error (msg);
72+ } else if (entry.level == 2 ) {
73+ rustLogger.warn (msg);
74+ } else {
75+ rustLogger.info (msg);
76+ }
77+ });
78+
6479 config = await rust.crateApiSimpleOpenmlsInitConfig (dbPath: dbPath);
6580 logger.info ('Initialized Rust!' );
6681
6782 await setupIdentity ();
6883
69- Future .delayed (Duration (seconds: 1 )).then ((value) async {
70- await recoverGroups ();
71- messengerState.update ();
84+ await _setupTimeSync ().timeout (const Duration (seconds: 2 ), onTimeout: () {
85+ logger.warn ('NTP time sync timed out, using system clock.' );
7286 });
7387
74- _setupTimeSync ();
88+ await recoverGroups ();
89+ messengerState.update ();
7590 }
7691
7792 Duration timeOffset = Duration .zero;
7893
79- void _setupTimeSync () async {
94+ Future < void > _setupTimeSync () async {
8095 try {
8196 int offsetMillis = await NTP .getNtpOffset (localTime: DateTime .now ());
8297 timeOffset = Duration (milliseconds: offsetMillis);
@@ -123,7 +138,7 @@ class S5Messenger {
123138 'identity' : username,
124139 'publicKey' : base64UrlNoPaddingEncode (publicKey),
125140 });
126- print ('$key created' );
141+ logger. info ('$key created' );
127142 }
128143
129144 final groups = < String , GroupState > {};
@@ -310,7 +325,7 @@ class GroupState {
310325 ).timeout (const Duration (minutes: 5 ))) {
311326 retryDelaySeconds = 1 ;
312327
313- Logger logger = SimpleLogger (prefix: "[s5_messenger]" );
328+ Logger logger = S5MessengerLogger (prefix: "[s5_messenger]" );
314329 logger.info ('debug1 incoming $groupId ${event .ts }' );
315330 if (ignoreMessageIds.contains (event.ts)) {
316331 ignoreMessageIds.remove (event.ts);
@@ -363,15 +378,23 @@ class GroupState {
363378 }
364379 }
365380
381+ bool canLoadMore = true ;
382+ List <MLSApplicationMessage > messagesMemory = < MLSApplicationMessage > [];
383+
366384 void _processNewMessage (MLSApplicationMessage msg) {
367- messagesMemory.insert (0 , msg);
385+ if (messagesMemory.any ((m) => m.ts == msg.ts)) {
386+ return ;
387+ }
388+ final newMessages = List <MLSApplicationMessage >.from (messagesMemory);
389+ newMessages.add (msg);
390+ newMessages.sort ((a, b) => b.ts.compareTo (a.ts));
391+
392+ messagesMemory = newMessages;
393+
368394 mls.messageStoreBox.put (makeKey (msg), msg.serialize ());
369395 messageListStateNotifier.update ();
370396 }
371397
372- bool canLoadMore = true ;
373- final messagesMemory = < MLSApplicationMessage > [];
374-
375398 void loadMoreMessages () {
376399 final anchorLow = String .fromCharCodes (base64UrlNoPaddingDecode (groupId));
377400 final anchorHigh = messagesMemory.isEmpty
@@ -383,13 +406,14 @@ class GroupState {
383406 keys.sort ((a, b) => b.compareTo (a));
384407 // print(keys);
385408
386- if (keys.length < 50 ) {
409+ if (keys.length <= 50 ) {
387410 canLoadMore = false ;
388411 } else {
389412 keys.removeRange (50 , keys.length);
390413 }
414+ final newMessages = List <MLSApplicationMessage >.from (messagesMemory);
391415 for (final String k in keys) {
392- messagesMemory .add (
416+ newMessages .add (
393417 MLSApplicationMessage .deserialize (
394418 mls.messageStoreBox.get (k)! ,
395419 decodeEndian (
@@ -398,8 +422,7 @@ class GroupState {
398422 ),
399423 );
400424 }
401- /* if (keys.isEmpty) {
402- } */
425+ messagesMemory = newMessages;
403426
404427 messageListStateNotifier.update ();
405428 }
0 commit comments