# Connectivity detectors

Connection establishment, handshake failures and path changes.

Version coverage: /docs/reference/versions/


{{< detector-table >}}
{{< detector-row name="IceReachabilityDetector" description="Detects when ICE cannot find a reachable network path." trigger="gathering complete, no local candidates, never connected; failing state or 6000 ms wait" recovery="candidates appear, connected, or closed; remembers prior success" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceReachabilityDetector.ts#L49" displayName="ICE Reachability" collects="ICE gathering state, local candidates and connection history." example="A completed ICE gathering produces no usable local candidates." >}}
{{< detector-row name="IcePathEstablishmentDetector" description="Reports slow connection establishment." trigger="connection stays connecting ≥5000 ms; emits slow-stage event" recovery="resets outside connecting; event once per episode" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IcePathEstablishmentDetector.ts#L43" recoveryLabel="Reset and lifecycle behavior" displayName="ICE Path Establishment" collects="Time spent in the connecting state." example="A peer connection remains connecting for five seconds." >}}
{{< detector-row name="IceEstablishmentFailedDetector" description="Detects failure to establish an ICE connection." trigger="candidates exist, no historical connected/succeeded/nominated path, sustained 15000 ms" recovery="established path or closed; distinguishes no-network from failed establishment" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceEstablishmentFailedDetector.ts#L57" displayName="ICE Establishment Failed" collects="Candidate availability and historical connection, pair and nomination states." example="Candidates exist, but no path becomes established during the timeout." >}}
{{< detector-row name="DtlsHandshakeFailedDetector" description="Detects a failed DTLS handshake." trigger="`dtlsState` failed, immediate" recovery="connected or transport removed; per-transport raise map" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/DtlsHandshakeFailedDetector.ts#L38" displayName="DTLS Handshake Failed" collects="The DTLS state of each transport." example="A transport reports a failed DTLS handshake." >}}
{{< detector-row name="DtlsHandshakeStalledDetector" description="Detects a DTLS handshake that stops progressing." trigger="DTLS new/connecting while real ICE evidence is healthy for 6000 ms" recovery="connected/failed/removal; generation and missing-evidence paths reset accumulation" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/DtlsHandshakeStalledDetector.ts#L61" displayName="DTLS Handshake Stalled" collects="DTLS progress and evidence of a healthy ICE path." example="ICE works, but DTLS remains connecting without completing its handshake." >}}
{{< detector-row name="IceDisconnectedDetector" description="Detects a sustained ICE disconnection." trigger="per-transport disconnected for 5000 ms" recovery="connected/completed, ICE restart or removal" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceDisconnectedDetector.ts#L57" displayName="ICE Disconnected" collects="Each transport's ICE state and disconnection duration." example="A previously active ICE transport remains disconnected for five seconds." >}}
{{< detector-row name="IceConnectionFailedDetector" description="Detects an ICE connection failure." trigger="per-transport failed immediately" recovery="connected/completed, restart or removal" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceConnectionFailedDetector.ts#L51" displayName="ICE Connection Failed" collects="Each transport's ICE connection state." example="A transport enters the failed ICE state." >}}
{{< detector-row name="IceTransportStalledDetector" description="Detects a connected transport that stops receiving expected data." trigger="succeeded connected path previously received data; sends but no inbound, expected inbound media, 5000 ms" recovery="inbound resumes, connectivity lost, restart/removal; send-only/paused situations gated" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceTransportStalledDetector.ts#L65" displayName="ICE Transport Stalled" collects="Sending and receiving activity, ICE health and expected inbound media." example="The connection stays established and sends data, but expected inbound traffic stops." >}}
{{< detector-row name="UnstableIcePathDetector" description="Detects frequent changes to the selected ICE path." trigger="at least 3 switches in 30000 ms observation window" recovery="completed quieter window or transport removal" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/UnstableIcePathDetector.ts#L60" displayName="Unstable Ice Path" collects="Selected ICE path changes over an observation window." example="The selected path switches three times within thirty seconds." >}}
{{< /detector-table >}}

Each row links through its named class in [client-monitor-js/src/detectors/Detector.ts](https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/Detector.ts) and the [detector implementation reference](/reference/detector-implementation-reference.md); connectivity state machine context is in [client-monitor-js/src/monitors/SelectedIcePath.ts](https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/monitors/SelectedIcePath.ts).

