applySnapshotByteBudget function
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);
}