nextWakeDelay function

Duration nextWakeDelay({
  1. required DateTime now,
  2. required DateTime deadline,
  3. required int heartbeatMin,
  4. required DateTime lastHeartbeat,
  5. required Iterable<int> timerDueMs,
})

Nearest wake delay for the --wait-for-jobs loop (issue #450): the minimum of the ceiling deadline, each armed timer's due moment, and the heartbeat cadence. Pure — unit-tested directly.

Implementation

Duration nextWakeDelay({
  required DateTime now,
  required DateTime deadline,
  required int heartbeatMin,
  required DateTime lastHeartbeat,
  required Iterable<int> timerDueMs,
}) {
  var delay = deadline.difference(now);
  for (final due in timerDueMs) {
    final d = Duration(milliseconds: due - now.millisecondsSinceEpoch);
    if (d < delay) delay = d;
  }
  if (heartbeatMin > 0) {
    final beat =
        lastHeartbeat.difference(now) + Duration(minutes: heartbeatMin);
    if (beat < delay) delay = beat;
  }
  return delay;
}