Hlc<T>.send constructor

Hlc<T>.send(
  1. Hlc<T> canonical, {
  2. int? millis,
})

Generates a unique, monotonic timestamp suitable for transmission to another system in string format. Local wall time will be used if millis isn't supplied.

Implementation

factory Hlc.send(Hlc<T> canonical, {int? millis}) {
  // Retrieve the local wall time if millis is null
  millis = millis ?? DateTime.now().millisecondsSinceEpoch;

  // Unpack the canonical time and counter
  final millisOld = canonical.millis;
  final counterOld = canonical.counter;

  // Calculate the next time and counter
  // * ensure that the logical time never goes backward
  // * increment the counter if time does not advance
  final millisNew = max(millisOld, millis);
  final counterNew = millisOld == millisNew ? counterOld + 1 : 0;

  // Check the result for drift and counter overflow
  if (millisNew - millis > _maxDrift) {
    throw ClockDriftException(millisNew, millis);
  }
  if (counterNew > _maxCounter) {
    throw OverflowException(counterNew);
  }

  return Hlc(millisNew, counterNew, canonical.nodeId);
}