@ -1,4 +1,7 @@
// / D e c i d e s w h e n a r e c e i v e r c o u n t s a s s t a l l e d a n d w h e n t o t r y r e c o n n e c t i n g .
// / D e c i d e s w h e n a r e c e i v e r c o u n t s a s s t a l l e d a n d w h e n t o t r y r e c o n n e c t i n g .
// /
// / F r a m e s a n d a c o n f i r m e d c o n n e c t i o n b o t h c o u n t a s s i g n s o f l i f e : s o m e s e n d e r s ( e . g . N D I T e s t P a t t e r n s )
// / s e n d a s t i l l i m a g e o n l y o n c e , w h i c h i s n o t a n o u t a g e .
public struct ConnectionWatchdog : Sendable , Equatable {
public struct ConnectionWatchdog : Sendable , Equatable {
public enum State : Equatable , Sendable {
public enum State : Equatable , Sendable {
case connecting
case connecting
@ -11,6 +14,7 @@ public struct ConnectionWatchdog: Sendable, Equatable {
public var retryInterval : Double
public var retryInterval : Double
private var lastFrame : Double ?
private var lastFrame : Double ?
private var lastAlive : Double ?
private var lastRetry : Double ?
private var lastRetry : Double ?
private let startedAt : Double
private let startedAt : Double
@ -22,11 +26,17 @@ public struct ConnectionWatchdog: Sendable, Equatable {
public mutating func frameArrived ( at now : Double ) {
public mutating func frameArrived ( at now : Double ) {
lastFrame = now
lastFrame = now
connectionConfirmed ( at : now )
}
// / T h e s e n d e r s t i l l h o l d s a c o n n e c t i o n t o u s , e v e n i f n o n e w f r a m e s a r r i v e .
public mutating func connectionConfirmed ( at now : Double ) {
lastAlive = now
lastRetry = nil
lastRetry = nil
}
}
public func state ( at now : Double ) -> State {
public func state ( at now : Double ) -> State {
let reference = lastFrame ? ? startedAt
let reference = last Aliv e ? ? startedAt
guard now - reference >= stallAfter else { return lastFrame = = nil ? . connecting : . live }
guard now - reference >= stallAfter else { return lastFrame = = nil ? . connecting : . live }
let since = lastRetry ? ? reference + stallAfter
let since = lastRetry ? ? reference + stallAfter
return . stalled ( retryIn : max ( 0 , retryInterval - ( now - since ) ) )
return . stalled ( retryIn : max ( 0 , retryInterval - ( now - since ) ) )