I do since/until filters. If traversing back (newest first), I track oldest timestamp of event seen, and then use that as the until on next call, end if no new event ids seen before starting again at the head. If going forward (oldest to newest), I just reverse this with the newest timestamp of event seen.