Как мы подружили WebRTC с Asterisk: детективная история одного звонка
Habr ·

Задача звучала невинно: два браузера, кнопка «Call», голос в обе стороны. Под капотом — Asterisk 22 в Docker, Coturn, JsSIP и SIP поверх WebSocket. На деле — пять разных багов с одним и тем же симптомом «нет звука»: заблокированный STUN, зависший ICE gathering, забытый event.ready() на 40 секунд, приватные IP в SDP и петля 403 Forbidden на собственном TURN-сервере. Детективная история одного WebRTC-звонка: улики, ложные следы, RTP-дебаг в двух терминалах — и финальный pjsip show channelstats с голосом в обе стороны. Кто убил звук?
Задача звучала невинно: два браузера, кнопка «Call», голос в обе стороны. Под капотом — Asterisk 22 в Docker, Coturn, JsSIP и SIP поверх WebSocket. На деле — пять разных багов с одним и тем же симптомом «нет звука»: заблокированный STUN, зависший ICE gathering, забытый event.ready() на 40 секунд, приватные IP в SDP и петля 403 Forbidden на собственном TURN-сервере. Детективная история одного WebRTC-звонка: улики, ложные следы, RTP-дебаг в двух терминалах — и финальный pjsip show channelstats с голосом в обе стороны. Кто убил звук?