catchUpToLive

suspend fun catchUpToLive(timeoutMs: Long? = null): CatchUpSummary

Bring the local store current with the network, then stop — for background fetch and cold start, where holding a live stream is wasted because the wire is about to go away.

Pass timeoutMs to bound the run against a background budget (a WorkManager job, an FCM handler); null runs to the live edge. A negative value is treated as 0 (return immediately). Cutting it short is safe: everything processed is persisted and a later call resumes from durable state.

Check CatchUpSummary.completed before treating the counts as the whole story: on the deadline path it is false, whatever was processed before the cut is already stored (the counts may undercount it), and a later call resumes from there.