From 97f2673b558f24e0e4469470361f73dd05e22404 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 26 Jan 2026 19:39:02 +0000 Subject: [PATCH] working sync complete --- hook/build.dart | 5 +-- lib/controllers/client_controller.dart | 20 ++++++----- lib/helpers/extensions/get_full_room.dart | 13 ------- lib/helpers/extensions/gomuks_buffer.dart | 14 -------- lib/models/content_uri.dart | 14 -------- lib/models/event.dart | 42 +++++++++++------------ lib/models/lazy_load_summary.dart | 2 +- lib/models/room.dart | 6 ++-- lib/models/room_metadata.dart | 5 ++- lib/models/sync_complete.dart | 20 ----------- lib/models/sync_data.dart | 20 +++++++++++ 11 files changed, 61 insertions(+), 100 deletions(-) delete mode 100644 lib/helpers/extensions/get_full_room.dart delete mode 100644 lib/models/content_uri.dart delete mode 100644 lib/models/sync_complete.dart create mode 100644 lib/models/sync_data.dart diff --git a/hook/build.dart b/hook/build.dart index 6ebc80e..4cb2f91 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -25,7 +25,7 @@ Future main(List args) => build(args, (input, output) async { final gomuksBuildDir = buildDir.resolve("gomuks/"); final libFile = gomuksBuildDir.resolve(libFileName); - print("Building Gomuks shared library $libFileName..."); + print("Building Gomuks shared library $libFileName from source..."); final result = await Process.run("go", [ "build", "-o", @@ -48,6 +48,7 @@ Future main(List args) => build(args, (input, output) async { file: libFile, ), ) - ..dependencies.add(libFile); + ..dependencies.add(libFile) + ..dependencies.add(gomuksBuildDir); print("Done!"); }); diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index d0e1633..cd4aff2 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -9,7 +9,7 @@ import "package:nexus/controllers/sync_status_controller.dart"; import "package:nexus/helpers/extensions/gomuks_buffer.dart"; import "package:nexus/models/client_state.dart"; import "package:nexus/models/login.dart"; -import "package:nexus/models/sync_complete.dart"; +import "package:nexus/models/sync_data.dart"; import "package:nexus/models/sync_status.dart"; import "package:nexus/src/third_party/gomuks.g.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; @@ -20,17 +20,18 @@ class ClientController extends AsyncNotifier { final handle = await Isolate.run(GomuksInit); ref.onDispose(() => GomuksDestroy(handle)); - GomuksStart( + final errorCode = GomuksStart( handle, NativeCallable< - Void Function(Pointer, Int64, GomuksBorrowedBuffer) + Void Function(Pointer, Int64, GomuksOwnedBuffer) >.listener(( Pointer command, int requestId, - GomuksBorrowedBuffer data, + GomuksOwnedBuffer data, ) { try { final muksEventType = command.cast().toDartString(); + debugPrint("Handling $muksEventType..."); final Map decodedMuksEvent = data.toJson(); switch (muksEventType) { @@ -45,9 +46,9 @@ class ClientController extends AsyncNotifier { .set(SyncStatus.fromJson(decodedMuksEvent)); break; case "sync_complete": - debugger(message: jsonEncode(decodedMuksEvent)); - final thing = SyncComplete.fromJson(decodedMuksEvent); - debugger(message: jsonEncode(thing.toJson())); + final syncData = SyncData.fromJson(decodedMuksEvent); + debugPrint(jsonEncode(syncData.toJson())); + // ref // .watch(SyncStatusController.provider.notifier) // .set(SyncStatus.fromJson(decodedMuksEvent)); @@ -58,14 +59,17 @@ class ClientController extends AsyncNotifier { default: debugPrint("Unhandled event: $muksEventType"); } + debugPrint("Finished handling $muksEventType..."); } catch (error, stackTrace) { + debugger(); debugPrintStack(stackTrace: stackTrace, label: error.toString()); } }) .nativeFunction, ); - return handle; + if (errorCode == 0) return handle; + throw Exception("GomuksStart returned error code $errorCode"); } Future> sendCommand( diff --git a/lib/helpers/extensions/get_full_room.dart b/lib/helpers/extensions/get_full_room.dart deleted file mode 100644 index bbd0bc5..0000000 --- a/lib/helpers/extensions/get_full_room.dart +++ /dev/null @@ -1,13 +0,0 @@ -import "package:matrix/matrix.dart"; -import "package:nexus/models/full_room.dart"; - -extension GetFullRoom on Room { - Future get fullRoom async { - await loadHeroUsers(); - return FullRoom( - roomData: this, - title: getLocalizedDisplayname(), - avatar: await avatar?.getThumbnailUri(client, width: 24, height: 24), - ); - } -} diff --git a/lib/helpers/extensions/gomuks_buffer.dart b/lib/helpers/extensions/gomuks_buffer.dart index bfae939..aab1f1f 100644 --- a/lib/helpers/extensions/gomuks_buffer.dart +++ b/lib/helpers/extensions/gomuks_buffer.dart @@ -1,23 +1,9 @@ import "dart:convert"; import "dart:ffi"; import "dart:typed_data"; - import "package:ffi/ffi.dart"; import "package:nexus/src/third_party/gomuks.g.dart"; -extension GomuksBorrowedBufferToJson on GomuksBorrowedBuffer { - Uint8List toBytes() { - if (base == nullptr || length <= 0) return Uint8List(0); - return base.asTypedList(length); - } - - Map toJson() { - final bytes = toBytes(); - if (bytes.isEmpty) return {}; - return jsonDecode(utf8.decode(bytes)); - } -} - extension GomuksOwnedBufferToJson on GomuksOwnedBuffer { Uint8List toBytes() { try { diff --git a/lib/models/content_uri.dart b/lib/models/content_uri.dart deleted file mode 100644 index 92d3a44..0000000 --- a/lib/models/content_uri.dart +++ /dev/null @@ -1,14 +0,0 @@ -import "package:freezed_annotation/freezed_annotation.dart"; -part "content_uri.freezed.dart"; -part "content_uri.g.dart"; - -@freezed -abstract class ContentUri with _$ContentUri { - const factory ContentUri({ - required String homeserver, - required String fileID, - }) = _ContentUri; - - factory ContentUri.fromJson(Map json) => - _$ContentUriFromJson(json); -} diff --git a/lib/models/event.dart b/lib/models/event.dart index 3a3ecbd..ce621a3 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -9,24 +9,24 @@ abstract class Event with _$Event { @JsonKey(name: "rowid") required int rowId, @JsonKey(name: "timeline_rowid") required int timelineRowId, required String roomId, - required int eventId, - @JsonKey(name: "sender") required int authorId, + required String eventId, + @JsonKey(name: "sender") required String authorId, required String type, - required String stateKey, + String? stateKey, @EpochDateTimeConverter() required DateTime timestamp, required Map content, - required Map decrypted, - required Map decryptedType, - required Map unsigned, - required LocalContent localContent, - required String transactionId, - required String redactedBy, - required String relatesTo, - required String relatesType, - required String decryptionError, - required String sendError, - required Map reactions, - required int lastEditRowId, + Map? decrypted, + String? decryptedType, + @Default({}) Map unsigned, + LocalContent? localContent, + String? transactionId, + String? redactedBy, + String? relatesTo, + String? relatesType, + String? decryptionError, + String? sendError, + @Default({}) Map reactions, + int? lastEditRowId, @UnreadTypeConverter() UnreadType? unreadType, }) = _Event; @@ -36,13 +36,11 @@ abstract class Event with _$Event { @freezed abstract class LocalContent with _$LocalContent { const factory LocalContent({ - required String sanitizedHtml, - required String htmlVersion, - required bool wasPlaintext, - required bool bigEmoji, - required bool hasMath, - required String editSource, - required String replyFallbackRemoved, + String? sanitizedHtml, + bool? wasPlaintext, + bool? bigEmoji, + bool? hasMath, + bool? replyFallbackRemoved, }) = _LocalContent; factory LocalContent.fromJson(Map json) => diff --git a/lib/models/lazy_load_summary.dart b/lib/models/lazy_load_summary.dart index 5d7db14..5314af8 100644 --- a/lib/models/lazy_load_summary.dart +++ b/lib/models/lazy_load_summary.dart @@ -5,7 +5,7 @@ part "lazy_load_summary.g.dart"; @freezed abstract class LazyLoadSummary with _$LazyLoadSummary { const factory LazyLoadSummary({ - required List heroes, + required List? heroes, required int? joinedMemberCount, required int? invitedMemberCount, }) = _LazyLoadSummary; diff --git a/lib/models/room.dart b/lib/models/room.dart index c186863..a83daef 100644 --- a/lib/models/room.dart +++ b/lib/models/room.dart @@ -9,12 +9,12 @@ part "room.g.dart"; abstract class Room with _$Room { const factory Room({ @JsonKey(name: "meta") RoomMetadata? metadata, - required List timeline, + @Default([]) List timeline, required bool reset, required Map state, // required Map accountData, required List events, - required Map> receipts, + @Default({}) Map> receipts, required bool dismissNotifications, // required List notifications, }) = _Room; @@ -26,7 +26,7 @@ abstract class Room with _$Room { abstract class TimelineRowTuple with _$TimelineRowTuple { const factory TimelineRowTuple({ @JsonKey(name: "timeline_rowid") required int timelineRowId, - @JsonKey(name: "timeline_eventid") required int eventRowId, + @JsonKey(name: "timeline_eventid") int? eventRowId, }) = _TimelineRowTuple; factory TimelineRowTuple.fromJson(Map json) => diff --git a/lib/models/room_metadata.dart b/lib/models/room_metadata.dart index cfbc5d9..905f220 100644 --- a/lib/models/room_metadata.dart +++ b/lib/models/room_metadata.dart @@ -1,5 +1,4 @@ import "package:freezed_annotation/freezed_annotation.dart"; -import "package:nexus/models/content_uri.dart"; import "package:nexus/models/epoch_date_time_converter.dart"; import "package:nexus/models/lazy_load_summary.dart"; part "room_metadata.freezed.dart"; @@ -12,12 +11,12 @@ abstract class RoomMetadata with _$RoomMetadata { // required CreateEventContent creationContent, // required TombstoneEventContent tombstoneEventContent, String? name, - ContentUri? avatar, + Uri? avatar, String? topic, String? canonicalAlias, LazyLoadSummary? lazyLoadSummary, required bool hasMemberList, - @JsonKey(name: "preview_event_rowid") required String previewEventRowID, + @JsonKey(name: "preview_event_rowid") required int previewEventRowID, @EpochDateTimeConverter() required DateTime sortingTimestamp, @Default(false) bool markedUnread, }) = _RoomMetadata; diff --git a/lib/models/sync_complete.dart b/lib/models/sync_complete.dart deleted file mode 100644 index f01f533..0000000 --- a/lib/models/sync_complete.dart +++ /dev/null @@ -1,20 +0,0 @@ -import "package:freezed_annotation/freezed_annotation.dart"; -import "package:nexus/models/room.dart"; -part "sync_complete.freezed.dart"; -part "sync_complete.g.dart"; - -@freezed -abstract class SyncComplete with _$SyncComplete { - const factory SyncComplete({ - @Default(false) bool clearState, - // required Map accountData, - required Map rooms, - required List leftRooms, - // required List invitedRooms, - // required List spaceEdges, - required List topLevelSpaces, - }) = _SyncComplete; - - factory SyncComplete.fromJson(Map json) => - _$SyncCompleteFromJson(json); -} diff --git a/lib/models/sync_data.dart b/lib/models/sync_data.dart new file mode 100644 index 0000000..4da57c2 --- /dev/null +++ b/lib/models/sync_data.dart @@ -0,0 +1,20 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/room.dart"; +part "sync_data.freezed.dart"; +part "sync_data.g.dart"; + +@freezed +abstract class SyncData with _$SyncData { + const factory SyncData({ + @Default(false) bool clearState, + // required Map accountData, + @Default({}) Map rooms, + @Default([]) List leftRooms, + // required List invitedRooms, + // required List spaceEdges, + @Default([]) List topLevelSpaces, + }) = _SyncData; + + factory SyncData.fromJson(Map json) => + _$SyncDataFromJson(json); +}