Sip.js: Функция UserAgent.stop () занимает слишком много времени

Созданный на 6 окт. 2020  ·  7Комментарии  ·  Источник: onsip/SIP.js

Опишите ошибку
По какой-то причине при использовании функции «UserAgent.stop ()» требуется около 30 секунд, чтобы остановить все, пока оно не ответит соответствующим обещанием.

То, что я пытаюсь достичь, - это команда полной отмены регистрации, при которой она не только отменяет регистрацию, но также:

  1. Очистка всех подписок SIP.
  2. Закрытие соединения с веб-сокетом.

Насколько я понимаю, именно это и делает функция stop (). Только на это уходит слишком много времени.

Журналы
Вот логи из консоли: логи

Наблюдаемое поведение
Только примерно через ~ 32 секунды мы можем увидеть: 15: 14: 05.797
Следующий журнал:
sip.subscribe-dialog | Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.
Только после указанного выше журнала удаляются издатели и транспортный уровень (WS).
Что заставляет меня думать, что это может произойти в результате этого сообщения SUBSCRIBE, что его таймер истек, но не совсем уверен.

Информация об окружающей среде

  • Kamailio 5.3.5 (веб-сокет)
  • Google Chrome 85.0.4183.121

    • SIP.JS 0.17.1

Самый полезный комментарий

У меня такая же проблема. У меня нет подписок. Для меня закрытие WebSocket занимает слишком много времени (20-50 секунд)

Я старался:

  • уничтожение объекта вручную, как предлагает @slavikbialik .
  • закрытие WebSocket вручную с помощью userAgent.transport.ws.close() чтобы убедиться, что моя проблема связана с WebSocket.
  • в Chrome и Firefox.

У меня нет конкретных конфигураций, просто следовал руководству SIP.js. по воспроизведению. Я не знаю, помогает ли это или связано с моей проблемой, но я попытался открыть WebSocket с протоколом sip без какой-либо библиотеки и закрыл его. Оба они длились менее 1 секунды.

wss

Все 7 Комментарий

Подтверждено в коде ...

@ john-e-riordan, похоже, это проблема порядка действий.

Вверху user-agent.stop() мы переходим в состояние Stopped .

Затем мы перебираем registerers , sessions , затем subscriptions .

Функция subscription.dispose() праву отправляет SUBSCRIBE с заголовком Expires=0 . В результате в SIP.js отправляется сообщение NOTIFY указывающее, что подписка закрыта. Однако есть проверка в user-agent.onTransportMessage() которая проверяет, остановлен ли user-agent . А затем отбрасываем NOTIFY из-за состояния пользовательского агента. Заставить подписчика ждать тайм-аута.

Мы будем работать над исправлением этого. Спасибо.

в связи с тем, что подписка закрыта. Однако есть проверка в user-agent.onTransportMessage() которая проверяет, остановлен ли user-agent . А затем отказавшись от сообщения "УКАЗАТЬ" из-за

Большое спасибо за быстрый ответ и за обнаружение первопричины проблемы! Надеюсь, это скоро исправят :)
Между прочим, я тестировал функцию stop() когда я не выполняю свою первоначальную SIP SUBSCRIBE, что я также делаю при создании REGISTER, и все работает быстро. Но, конечно, мне понадобится ПОДПИСАТЬСЯ.
Еще раз спасибо!

Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом stop() в пользовательском агенте.

Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом stop() в пользовательском агенте.

Спасибо! Уже сделано, но, как мне кажется, неэффективно. Если вы можете предложить мне лучший способ, это будет очень полезно.
У меня есть несколько подписок, которые я делаю, пока пользователь зарегистрирован (например, присутствие, конференция и некоторые другие события).
Есть ли способ перебрать все активные подписки и вызвать метод dispose или unsubscribe ?
Я увидел, что могу получить список подписок, выполнив: userAgentObject._subscriptions и он получает некоторый массив подписчиков, и по какой-то причине я не могу взять его и сделать с ним что-либо, например, повторение или что-то еще.

То, как я это делал сейчас, но опять же, мне это не нравится, для каждого типа события подписки я сохранил подписчика в другой глобальной переменной в классе и для каждой переменной подписчика я вызываю unsubscribe method.

Кстати, а в чем разница между dispose и unsubscribe ? Я предполагаю, что dispose не откажется от подписки в АТС. Правильно? Если так, я думаю, что это менее рекомендуется, потому что в моем случае, если я не откажусь от подписки полностью, УАТС будет продолжать отправлять нерелевантные сообщения NOTIFY на мой Kamailio (что может привести к полной блокировке, потому что Kamailio заблокирует мою АТС, если она перегрузить его).

Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом stop() в пользовательском агенте.

Есть прогресс😊? Как это сделать до исправления ошибки?

У меня нет подписки, но UA.stop() тоже очень медленный. Почти 1мин ...

Спасибо.

Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом stop() в пользовательском агенте.

Есть прогресс😊? Как это сделать до исправления ошибки?

У меня нет подписки, но UA.stop() тоже очень медленный. Почти 1мин ...

Спасибо.

Нет, эта проблема еще не решена.
Но вы можете сделать то, что сделал я ... вы можете просто уничтожить свои объекты вручную один за другим в следующем логическом порядке:

  1. subscriberObj.unsubscribe ();
  2. registerer.unregister ();
  3. userAgent.transport.disconnect ();
  4. userAgent.stop ();

Желательно, чтобы каждое действие выполнялось с обещаниями. Я имею в виду, используйте then чтобы вы могли дождаться каждого обещания действия, чтобы вернуться и действовать соответственно, чтобы выполнить следующий шаг.

У меня такая же проблема. У меня нет подписок. Для меня закрытие WebSocket занимает слишком много времени (20-50 секунд)

Я старался:

  • уничтожение объекта вручную, как предлагает @slavikbialik .
  • закрытие WebSocket вручную с помощью userAgent.transport.ws.close() чтобы убедиться, что моя проблема связана с WebSocket.
  • в Chrome и Firefox.

У меня нет конкретных конфигураций, просто следовал руководству SIP.js. по воспроизведению. Я не знаю, помогает ли это или связано с моей проблемой, но я попытался открыть WebSocket с протоколом sip без какой-либо библиотеки и закрыл его. Оба они длились менее 1 секунды.

wss

Была ли эта страница полезной?
0 / 5 - 0 рейтинги