// Ported from filius-ipad (GPLv2/GPLv3): // State/TopologyNetworkRuntimeEngine.swift (TopologyNetworkRuntimeSpeed) // Java counterpart: filius.hardware.Verbindung (MIN_VERZOEGERUNG_IN_MILLIS, // verzoegerungsFaktor) and GUIMainMenu.updateLatency. export const MINIMUM_SPEED_PERCENT = 1; export const MAXIMUM_SPEED_PERCENT = 100; export const DEFAULT_SPEED_PERCENT = 90; export const JAVA_MINIMUM_LINK_DELAY_MILLISECONDS = 5; /** Java's Verbindung.MAX_HOPS: the round trip time is this many cables. */ export const JAVA_MAXIMUM_HOPS = 50; export class RuntimeSpeed { readonly percent: number; constructor(percent: number = DEFAULT_SPEED_PERCENT) { this.percent = Math.min(MAXIMUM_SPEED_PERCENT, Math.max(MINIMUM_SPEED_PERCENT, Math.trunc(percent))); } /** Java's delay factor: 1 at full speed, 100 at the slowest. */ get javaDelayFactor(): number { return MAXIMUM_SPEED_PERCENT - this.percent + 1; } /** How long a frame travels over one cable. */ get linkTransmissionDelayMilliseconds(): number { return JAVA_MINIMUM_LINK_DELAY_MILLISECONDS * this.javaDelayFactor; } /** * Java's Verbindung.holeRTT: how long an answer may take, 50 cables (2750 ms * at the default 90 %). Java's RTT factor (a start option, 1 to 5) is 1. */ get roundTripTimeMilliseconds(): number { return JAVA_MAXIMUM_HOPS * this.linkTransmissionDelayMilliseconds; } /** A base delay scaled like a cable, or undefined past the safe integer range. */ scaledLinkDelay(baseMilliseconds: number): number | undefined { const delay = baseMilliseconds * this.javaDelayFactor; return Number.isSafeInteger(delay) ? delay : undefined; } }