getMessagesForSync method

Future<List<Message>> getMessagesForSync(
  1. String peerNodeId
)

Returns messages that should be sent to a specific peer during sync.

This includes:

  • Messages targeting the peer's node ID directly
  • Broadcast messages (targetId == '*')
  • Messages still pending/sent that have TTL > 0
  • Excludes messages already delivered to this peer (per-peer dedup)

Implementation

Future<List<Message>> getMessagesForSync(String peerNodeId) async {
  // Get IDs of messages already delivered to this peer
  final deliveredIds = await (selectOnly(messageDeliveries)
        ..addColumns([messageDeliveries.messageId])
        ..where(messageDeliveries.peerNodeId.equals(peerNodeId)))
      .map((row) => row.read(messageDeliveries.messageId)!)
      .get();

  // Query eligible messages, excluding already-delivered ones
  var query = select(messages)
    ..where((t) =>
        t.ttl.isBiggerThanValue(0) &
        (t.status.equals(MessageStatus.pending.value) |
            t.status.equals(MessageStatus.sent.value)));

  if (deliveredIds.isNotEmpty) {
    query = query..where((t) => t.messageId.isNotIn(deliveredIds));
  }

  return query.get();
}