Hlc<T>.send constructor
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);
}