src/connectionhealthpolicy/SendingAudioFailureConnectionHealthPolicy.ts (62 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import Logger from '../logger/Logger'; import BaseConnectionHealthPolicy from './BaseConnectionHealthPolicy'; import ConnectionHealthData from './ConnectionHealthData'; import ConnectionHealthPolicy from './ConnectionHealthPolicy'; import ConnectionHealthPolicyConfiguration from './ConnectionHealthPolicyConfiguration'; export default class SendingAudioFailureConnectionHealthPolicy extends BaseConnectionHealthPolicy implements ConnectionHealthPolicy { private readonly sendingAudioFailureSamplesToConsider: number; private readonly sendingAudioFailureInitialWaitTimeMs: number; private readonly coolDownTimeMs: number; private readonly maximumTimesToWarn: number; private warnCount: number; private lastWarnTimestampMs: number; constructor( private logger: Logger, configuration: ConnectionHealthPolicyConfiguration, data: ConnectionHealthData ) { super(configuration, data, 'Sending Audio Health'); this.sendingAudioFailureSamplesToConsider = configuration.sendingAudioFailureSamplesToConsider > 0 ? configuration.sendingAudioFailureSamplesToConsider : 1; this.sendingAudioFailureInitialWaitTimeMs = configuration.sendingAudioFailureInitialWaitTimeMs; this.maximumTimesToWarn = configuration.maximumTimesToWarn; this.coolDownTimeMs = configuration.cooldownTimeMs; this.lastWarnTimestampMs = 0; this.warnCount = 0; } private isSendingAudioUnhealthy(): boolean { const hasEnoughTimeElapsedToEvaluateStatus = !this.currentData.isConnectionStartRecent( this.sendingAudioFailureInitialWaitTimeMs ); const areAudioPacketsNotBeingSent = this.currentData.consecutiveStatsWithNoAudioPacketsSent >= this.sendingAudioFailureSamplesToConsider; return hasEnoughTimeElapsedToEvaluateStatus && areAudioPacketsNotBeingSent; } health(): number { if (this.isSendingAudioUnhealthy()) { const didWarnRecently = Date.now() - this.lastWarnTimestampMs < this.coolDownTimeMs; if (this.currentHealth > this.minimumHealth() && !didWarnRecently) { this.logger.warn( `Sending Audio is unhealthy for ${this.sendingAudioFailureSamplesToConsider} seconds consecutively.` ); this.warnCount++; if (this.warnCount > this.maximumTimesToWarn) { this.logger.warn( 'SendingAudioFailure health policy maximum warnings breached. Falling back to reporting healthy.' ); return this.maximumHealth(); } this.lastWarnTimestampMs = Date.now(); return this.minimumHealth(); } else { return this.currentHealth; } } return this.maximumHealth(); } }