# Server detectors

Correlate evidence across clients or calls with explicit registration.

Version coverage: /docs/reference/versions/


Server detectors compare evidence across participants or calls. They help answer questions a browser alone cannot answer, such as whether one publisher is failing for several receivers. Register the detectors relevant to your service; they do not run automatically on a new Observer.

| Scope | Classes | Evidence / purpose |
|---|---|---|
| Call | `AudioEchoDetector` | sustained correlation between one participant’s outgoing audio and another participant’s voice |
| Call | `CallConcurrentIssueDetector` | active issue prevalence and onset bursts within one call |
| Call | `IssueFanOutDetector` | same publisher-associated failure appears across receivers |
| Call | `PublisherFaultCorroborationDetector` | publisher-side issues corroborated by receiver degradation/issues |
| Call | `TrackDeliveryMismatchDetector` | publisher/receiver delivery disagreement with resolved track links |
| Call | `UnconsumedTrackDetector` | outbound track has no known consumer after configured grace; requires a resolver |
| Observer | `ObserverConcurrentIssueDetector` | same issue spans independent calls / synchronized onsets |
| Observer | `SfuCongestionDetector` | correlated infrastructure/SFU degradation, consumes client issues |
| Observer | `ClientPopulationIssueDetector` | group client issues by browser/OS/location or supported axis |
| Observer | `TurnServerHealthDetector` | group current client findings around relays |
| Observer | `TurnServerOutageDetector` | detect relay outage patterns across clients |
| One-shot validation | `SimulcastReceiverValidator` | whether receivers select layers independently |
| One-shot validation | `RemoteTrackResolverValidator` | whether remote publisher/subscriber linkage can be established |
| One-shot validation | `CodecConsistencyValidator` | cross-end codec consistency / deployment behavior |

Exact configs/defaults, state and triggers for all server detector classes are in the [detector reference](/reference/detector-implementation-reference.md). Configurations and defaults are defined in each detector constructor. See [Validators](/docs/observer-js/validators/) for one-shot structural checks.

{{< details "Source references" >}}

- [observer-js/src/validators/Validators.ts](https://github.com/ObserveRTC/observer-js/blob/b4a1ccb85468c94084a89ed2c007708c14ead551/src/validators/Validators.ts)
- [observer-js/src/validators/Validator.ts](https://github.com/ObserveRTC/observer-js/blob/b4a1ccb85468c94084a89ed2c007708c14ead551/src/validators/Validator.ts)
- [observer-js/examples/detectors.ts](https://github.com/ObserveRTC/observer-js/blob/b4a1ccb85468c94084a89ed2c007708c14ead551/examples/detectors.ts)

{{< /details >}}

## Registration scope

- `observer.addObserverDetector(...)` registers observer-wide analysis.
- `observer.addCallDetector(...)` registers a factory for future calls.
- `call.addDetector(...)` registers on an existing call.

Constructor configurations belong to each detector. Do not assume a default enabled set or a shared `DetectorsConfig` module.

## Investigate suspected audio echo

Register `audio-echo-detector` on a call or as a factory for future calls:

```javascript
observer.addCallDetector('audio-echo-detector');
// For a call that already exists:
// call.addDetector('audio-echo-detector');
```

The detector raises `AUDIO_ECHO_SUSPECTED` when outgoing audio follows the loudest other participant in enough active buckets and their dB levels correlate. `minFollowRatio` and `minCorrelation` gate the evidence. Its payload identifies the suspected echoing and source tracks/clients, capture-device label when available, and whether a `loopback-audio-input` issue is open. Ambiguous direction can be explicitly flagged.

This is evidence of suspected echo, not a confirmed acoustic diagnosis. Sampling granularity limits detection of faint or intermittent echo. Receiver-derived publisher audio levels need a `RemoteTrackResolver`; without usable levels, those tracks are not evaluated. Inspect the payload and capture configuration before deciding on remediation.

Source: [AudioEchoDetector implementation and limitations](https://github.com/ObserveRTC/observer-js/blob/1.2.0/src/detectors/AudioEchoDetector.ts).

