applySnapshotByteBudget function

UiSnapshot? applySnapshotByteBudget(
  1. UiSnapshot snap, {
  2. int maxBytes = kSnapshotSendCapBytes,
})

Keep the highest-ranked nodes whose full baseline fits maxBytes.

Measure the actual JSON encoded as UTF-8, including paths and envelope. A very large node is skipped so it cannot evict every smaller control. Returns null if even an empty baseline's metadata cannot fit.

Implementation

UiSnapshot? applySnapshotByteBudget(UiSnapshot snap,
    {int maxBytes = kSnapshotSendCapBytes}) {
  final empty = _selectNodes(snap, const []);
  final envelope = SnapshotDiffEngine.diff(null, empty).toWire();
  final emptyBytes = utf8.encode(jsonEncode(envelope)).length;
  if (emptyBytes > maxBytes) return null;
  var usedBytes = utf8.encode(jsonEncode({...envelope, 'added': []})).length;
  final ranked = List<int>.generate(snap.nodes.length, (i) => i)
    ..sort((a, b) {
      final rank =
          snapshotBudgetRank(snap.nodes[a]) - snapshotBudgetRank(snap.nodes[b]);
      return rank != 0 ? rank : a - b;
    });
  final keep = <int>[];
  for (final i in ranked) {
    final node = snap.nodes[i];
    final encodedNode = jsonEncode({
      ...node.toWire(),
      'path': snap.paths[node.stableId] ?? '',
    });
    final size = utf8.encode(encodedNode).length + (keep.isEmpty ? 0 : 1);
    if (usedBytes + size > maxBytes) continue;
    usedBytes += size;
    keep.add(i);
  }
  if (keep.length == snap.nodes.length) return snap;
  keep.sort();
  return _selectNodes(snap, keep);
}