batchGetFeedEntries method

Future<BatchFeedEntriesResult?> batchGetFeedEntries({
  1. required List<Map<String, dynamic>> queries,
  2. PeerId? fromServer,
})

Batch get feed entries from multiple feeds in a single request. Each query is a map with keys: ownerPeerId, path, fromSequence (optional), limit (optional). Returns results keyed by "ownerPeerId/path".

Implementation

Future<BatchFeedEntriesResult?> batchGetFeedEntries({
  required List<Map<String, dynamic>> queries,
  PeerId? fromServer,
}) async {
  final serverId = fromServer ?? await _serverSelector.selectServer(config.preferredServers);
  if (serverId == null) {
    _logger.warning('No S&F server available for batch feed entries retrieval');
    return null;
  }

  try {
    final context = Context();
    final stream = await host.newStream(
      serverId,
      [FeedHandler.protocolId],
      context,
    ).timeout(config.connectionTimeout);

    final response = await FeedHandler.batchGetFeedEntries(
      stream,
      batchQueries: queries,
    ).timeout(config.messageTimeout);

    await stream.close();

    if (!response.isSuccess) {
      _logger.warning('BATCH_GET feed entries: ${response.status}');
      return null;
    }

    final body = jsonDecode(utf8.decode(response.body!)) as Map<String, dynamic>;
    final feedsRaw = body['feeds'] as Map<String, dynamic>? ?? {};

    final feeds = <String, BatchFeedResult>{};
    for (final entry in feedsRaw.entries) {
      final feedData = entry.value as Map<String, dynamic>;
      final entriesList = feedData['entries'] as List<dynamic>? ?? [];
      final entries = entriesList.map((e) {
        final entryMap = e as Map<String, dynamic>;
        return FeedEntry(
          sequence: entryMap['seq'] as int,
          entryType: entryMap['type'] as String?,
          content: Uint8List.fromList(
            base64Decode(entryMap['content'] as String? ?? ''),
          ),
          contentHash: entryMap['hash'] as String? ?? '',
          createdAt: entryMap['createdAt'] as int? ?? 0,
          createdBy: entryMap['createdBy'] as String?,
        );
      }).toList();

      feeds[entry.key] = BatchFeedResult(
        entries: entries,
        hasMore: feedData['hasMore'] as bool? ?? false,
        error: feedData['error'] as String?,
      );
    }

    return BatchFeedEntriesResult(feeds: feeds);
  } on TimeoutException {
    _logger.warning('BATCH_GET feed entries timed out');
    return null;
  } catch (e) {
    _logger.warning('Failed to BATCH_GET feed entries: $e');
    return null;
  }
}