Sync cache for acks
continuous-integration/drone/pr Build is pending Details

Also remove defunct calls.
This commit is contained in:
Sarah Jamie Lewis 2024-02-26 18:26:49 -08:00
parent da0d63b0dc
commit 058fba7e69
Signed by: sarah
GPG Key ID: F27FD21A270837EF
6 changed files with 35 additions and 23 deletions

View File

@ -577,9 +577,6 @@ class MainActivity: FlutterActivity() {
result.success(Cwtch.searchConversations(profile, pattern))
return
}
"ReconnectCwtchForeground" -> {
Cwtch.reconnectCwtchForeground()
}
"Shutdown" -> {
Cwtch.shutdownCwtch();
}

View File

@ -11,8 +11,6 @@ abstract class Cwtch {
// ignore: non_constant_identifier_names
Future<void> Start();
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground();
Future<String> getCwtchDir();

View File

@ -3,6 +3,7 @@ import 'package:cwtch/cwtch/cwtch.dart';
import 'package:cwtch/main.dart';
import 'package:cwtch/models/appstate.dart';
import 'package:cwtch/models/contact.dart';
import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/profilelist.dart';
import 'package:cwtch/models/remoteserver.dart';
import 'package:cwtch/models/servers.dart';
@ -58,7 +59,7 @@ class CwtchNotifier {
// EnvironmentConfig.debugLog("NewEvent $type $data");
switch (type) {
case "CwtchStarted":
if (data["Reload"] == "true" && profileCN.num > 0 ) {
if (data["Reload"] == "true" && profileCN.num > 0) {
// don't reload...
// unless we have loaded no profiles...then there isnt a risk and this
// might be a first time (e.g. new apk, existing service)
@ -66,6 +67,7 @@ class CwtchNotifier {
EnvironmentConfig.debugLog("Reloading....${data}");
flwtchState.cwtch.LoadProfiles(DefaultPassword);
}
appState.SetCwtchInit();
break;
case "CwtchStartError":

View File

@ -270,14 +270,6 @@ class CwtchFfi implements Cwtch {
return _cwtchDir;
}
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground() async {
var reconnectCwtch = library.lookup<NativeFunction<Void Function()>>("c_ReconnectCwtchForeground");
// ignore: non_constant_identifier_names
final ReconnectCwtchForeground = reconnectCwtch.asFunction<void Function()>();
ReconnectCwtchForeground();
}
// Called on object being disposed to (presumably on app close) to close the isolate that's listening to libcwtch-go events
@override
void dispose() {

View File

@ -86,12 +86,6 @@ class CwtchGomobile implements Cwtch {
cwtchPlatform.invokeMethod("Start", {"appDir": _cwtchDir, "torPath": torPath});
}
@override
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground() async {
cwtchPlatform.invokeMethod("ReconnectCwtchForeground", {});
}
// Handle libcwtch-go events (received via kotlin) and dispatch to the cwtchNotifier
Future<void> _handleAppbusEvent(MethodCall call) async {
final String json = call.arguments;

View File

@ -64,6 +64,7 @@ Message compileOverlay(MessageInfo messageInfo) {
abstract class CacheHandler {
Future<MessageInfo?> get(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache);
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache);
}
class ByIndex implements CacheHandler {
@ -128,7 +129,7 @@ class ByIndex implements CacheHandler {
List<dynamic> messagesWrapper = jsonDecode(msgs);
for (; i < messagesWrapper.length; i++) {
var messageInfo = messageWrapperToInfo(profileOnion, conversationIdentifier, messagesWrapper[i]);
var messageInfo = MessageWrapperToInfo(profileOnion, conversationIdentifier, messagesWrapper[i]);
cache.addIndexed(messageInfo, start + i);
}
} catch (e, stacktrace) {
@ -143,6 +144,13 @@ class ByIndex implements CacheHandler {
void add(MessageCache cache, MessageInfo messageInfo) {
cache.addIndexed(messageInfo, index);
}
@override
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache) {
EnvironmentConfig.debugLog("performing a resync on message ${index}");
fetchAndProcess(index, 1, cwtch, profileOnion, conversationIdentifier, cache);
return get(cwtch, profileOnion, conversationIdentifier, cache);
}
}
class ById implements CacheHandler {
@ -172,6 +180,11 @@ class ById implements CacheHandler {
}
return fetch(cwtch, profileOnion, conversationIdentifier, cache);
}
@override
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache) {
return get(cwtch, profileOnion, conversationIdentifier, cache);
}
}
class ByContentHash implements CacheHandler {
@ -200,6 +213,11 @@ class ByContentHash implements CacheHandler {
}
return fetch(cwtch, profileOnion, conversationIdentifier, cache);
}
@override
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache) {
return get(cwtch, profileOnion, conversationIdentifier, cache);
}
}
List<Message> getReplies(MessageCache cache, int messageIdentifier) {
@ -257,6 +275,16 @@ Future<Message> messageHandler(BuildContext context, String profileOnion, int co
MessageInfo? messageInfo = await cacheHandler.get(cwtch, profileOnion, conversationIdentifier, cache);
if (messageInfo != null) {
if (messageInfo.metadata.ackd == false) {
if (messageInfo.metadata.lastChecked == null || messageInfo.metadata.lastChecked!.difference(DateTime.now()).abs().inSeconds > 30) {
messageInfo.metadata.lastChecked = DateTime.now();
// NOTE: Only ByIndex lookups will trigger
messageInfo = await cacheHandler.sync(cwtch, profileOnion, conversationIdentifier, cache);
}
}
}
if (messageInfo != null) {
return compileOverlay(messageInfo);
} else {
@ -272,14 +300,14 @@ MessageInfo? messageJsonToInfo(String profileOnion, int conversationIdentifier,
return null;
}
return messageWrapperToInfo(profileOnion, conversationIdentifier, messageWrapper);
return MessageWrapperToInfo(profileOnion, conversationIdentifier, messageWrapper);
} catch (e, stacktrace) {
EnvironmentConfig.debugLog("message handler exception on parse message and cache: " + e.toString() + " " + stacktrace.toString());
return null;
}
}
MessageInfo messageWrapperToInfo(String profileOnion, int conversationIdentifier, dynamic messageWrapper) {
MessageInfo MessageWrapperToInfo(String profileOnion, int conversationIdentifier, dynamic messageWrapper) {
// Construct the initial metadata
var messageID = messageWrapper['ID'];
var timestamp = DateTime.tryParse(messageWrapper['Timestamp'])!;
@ -312,6 +340,7 @@ class MessageMetadata extends ChangeNotifier {
final String? signature;
final String contenthash;
DateTime? lastChecked;
dynamic get attributes => this._attributes;