Sip.js: La función UserAgent.stop () lleva demasiado tiempo

Creado en 6 oct. 2020  ·  7Comentarios  ·  Fuente: onsip/SIP.js

Describe el error
Por alguna razón, cuando se usa la función "UserAgent.stop ()", se necesitan alrededor de 30 segundos para detener todo hasta que responda con la promesa adecuada.

Lo que estoy tratando de lograr es un comando de desregistro completo, donde no solo hace un desregister sino también:

  1. Borrando todas las suscripciones SIP.
  2. Cerrando la conexión del enchufe web.

Por lo que tengo entendido, la función "stop ()" hace exactamente eso. Solo que está tomando demasiado tiempo.

Registros
Aquí están los registros de la consola: registros

Comportamiento observado
Solo después de unos ~ 32 segundos podemos ver en: 15: 14: 05.797
El siguiente registro:
sip.subscribe-dialog | Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.
Solo después del registro anterior se eliminan los editores y el nivel de transporte (WS).
Lo que me hace pensar que puede ocurrir como resultado de ese mensaje de SUBSCRIBE que el temporizador expiró, pero no estoy del todo seguro.

Información medioambiental

  • Kamailio 5.3.5 (Web Socket)
  • Google Chrome 85.0.4183.121

    • SIP.JS 0.17.1

bug

Comentario más útil

Tengo el mismo problema. No tengo suscripciones. Para mí, cerrar WebSocket lleva demasiado tiempo (20-50 segundos)

Lo intenté:

  • destruir el objeto manualmente como sugiere @slavikbialik .
  • cerrando el WebSocket manualmente con userAgent.transport.ws.close() para asegurarme si mi problema está relacionado con WebSocket.
  • en Chrome y Firefox.

No tengo ninguna configuración específica, solo seguí la guía SIP.js para reproducir. No sé si esto ayuda o está relacionado con mi problema, pero intenté abrir un WebSocket con protocolo sip sin ninguna biblioteca y lo cerré. Ambos duraron menos de 1 segundo.

wss

Todos 7 comentarios

Confirmado en el código ...

@ john-e-riordan, esto parece ser un problema de orden de operaciones.

En la parte superior de user-agent.stop() hacemos la transición al estado Stopped .

Luego recorremos registerers , sessions , luego subscriptions .

La función subscription.dispose() envía legítimamente un SUBSCRIBE con un encabezado Expires=0 . Eso hace que se envíe NOTIFY a SIP.js, lo que indica que la suscripción se ha cerrado. Sin embargo, hay un cheque en user-agent.onTransportMessage() que verifica si el user-agent está detenido. Y luego descartar el NOTIFY debido al estado del agente de usuario. Causando que el suscriptor espere el tiempo de espera.

Trabajaremos para arreglar esto. Gracias.

señalando que la suscripción se ha cerrado. Sin embargo, hay un cheque en user-agent.onTransportMessage() que verifica si el user-agent está detenido. Y luego dejar caer el`NOTIFY debido a

¡Muchas gracias por responder rápidamente y encontrar la causa raíz del problema! Espero que se solucione pronto :)
Por cierto, probé la función stop() cuando no estoy haciendo mi SIP SUBSCRIBE inicial que también estoy haciendo al hacer el REGISTRO, y todo está funcionando rápido. Pero, por supuesto, necesitaré este SUSCRIBIRSE.
¡Gracias de nuevo!

Para solucionar esto, puede deshacerse de sus suscripciones manualmente antes de llamar a stop() en el agente de usuario.

Para solucionar esto, puede deshacerse de sus suscripciones manualmente antes de llamar a stop() en el agente de usuario.

¡Gracias! Ya hecho, pero creo que no de una manera eficiente. Si puede sugerirme una mejor manera, será de gran ayuda.
Tengo algunas suscripciones que estoy haciendo mientras el usuario está registrado (como presencia, conferencia y algunos otros eventos).
¿Hay alguna forma de iterar en todas las suscripciones activas y llamar al método dispose o unsubscribe ?
Vi que puedo obtener la lista de suscripciones haciendo: userAgentObject._subscriptions y está obteniendo una serie de suscriptores y, por alguna razón, no puedo tomarla y hacer nada con ella, como iterar o algo más.

De la forma en que lo hice actualmente, pero nuevamente, no me gusta, para cada tipo de evento de suscripción, almacené el suscriptor en una variable global diferente en la clase y para cada variable de suscriptor estoy llamando a unsubscribe método.

Por cierto, ¿cuál es la diferencia entre dispose y unsubscribe ? Supongo que dispose no cancelará la suscripción en el PBX. ¿Correcto? Si es así, creo que es menos recomendable, porque en mi caso, si no me doy de baja por completo, el PBX seguirá enviando mensajes NOTIFICAR irrelevantes a mi Kamailio (lo que puede llevar a un bloqueo total porque Kamailio bloqueará mi PBX si sobrecargarlo).

Para solucionar este problema, puede deshacerse de sus suscripciones manualmente antes de llamar a stop() en el agente de usuario.

¿Algún progreso😊? ¿Cómo hacer esto antes de que se solucione el error?

No tengo ninguna suscripción, pero el UA.stop() es muy lento. Casi 1min ...

Gracias.

Para solucionar este problema, puede deshacerse de sus suscripciones manualmente antes de llamar a stop() en el agente de usuario.

¿Algún progreso😊? ¿Cómo hacer esto antes de que se solucione el error?

No tengo ninguna suscripción, pero el UA.stop() es muy lento. Casi 1min ...

Gracias.

No, este problema aún no se ha resuelto.
Pero puedes hacer lo que yo hice ... puedes destruir tus objetos manualmente uno por uno con el siguiente orden lógico:

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

Preferiblemente, haga todas las acciones con promesas. Quiero decir, use then para que pueda esperar cada promesa de acción para volver y actuar en consecuencia para hacer el siguiente paso.

Tengo el mismo problema. No tengo suscripciones. Para mí, cerrar WebSocket lleva demasiado tiempo (20-50 segundos)

Lo intenté:

  • destruir el objeto manualmente como sugiere @slavikbialik .
  • cerrando el WebSocket manualmente con userAgent.transport.ws.close() para asegurarme si mi problema está relacionado con WebSocket.
  • en Chrome y Firefox.

No tengo ninguna configuración específica, solo seguí la guía SIP.js para reproducir. No sé si esto ayuda o está relacionado con mi problema, pero intenté abrir un WebSocket con protocolo sip sin ninguna biblioteca y lo cerré. Ambos duraron menos de 1 segundo.

wss

¿Fue útil esta página
0 / 5 - 0 calificaciones