Sip.js: A função UserAgent.stop () leva muito tempo

Criado em 6 out. 2020  ·  7Comentários  ·  Fonte: onsip/SIP.js

Descreva o bug
Por alguma razão, ao usar a função "UserAgent.stop ()" leva cerca de 30 segundos para parar tudo até que responda com a promessa apropriada.

O que estou tentando alcançar é um comando de cancelamento de registro completo, em que não apenas cancela o registro, mas também:

  1. Limpando todas as assinaturas SIP.
  2. Fechando a conexão do web socket.

Pelo que entendi, a função "stop ()" faz exatamente isso. Só que está demorando muito.

Histórico
Aqui estão os registros do console: registros

Comportamento observado
Só depois de cerca de 32 segundos podemos ver em: 15: 14: 05.797
O seguinte registro:
sip.subscribe-dialog | Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.
Somente após o log acima ele está descartando os editores e o nível de transporte (WS).
O que me faz pensar que pode ocorrer como resultado da mensagem ASSINAR que seu cronômetro expirou, mas não tenho certeza absoluta.

Informação Ambiental

  • Kamailio 5.3.5 (Web Socket)
  • Google Chrome 85.0.4183.121

    • SIP.JS 0.17.1

bug

Comentários muito úteis

Eu tenho o mesmo problema. Eu não tenho nenhuma assinatura. Para mim, fechar o WebSocket demora muito, (20-50 segundos)

Tentei:

  • destruindo o objeto manualmente como @slavikbialik sugere.
  • fechando o WebSocket manualmente com userAgent.transport.ws.close() para ter certeza se meu problema está relacionado ao WebSocket.
  • no Chrome e Firefox.

Não tenho nenhuma configuração específica, apenas segui o guia SIP.js para reproduzir. Não sei se isso ajuda ou está relacionado ao meu problema, mas tentei abrir um WebSocket com protocolo sip sem nenhuma biblioteca e fechei-o. Ambos duraram menos de 1 segundo.

wss

Todos 7 comentários

Confirmei no código ...

@ john-e-riordan isso parece ser um problema de ordem de operações.

No topo de user-agent.stop() fazemos a transição para o estado Stopped .

Em seguida, percorremos registerers , sessions , em seguida, subscriptions .

A função subscription.dispose() corretamente envia um SUBSCRIBE com um cabeçalho Expires=0 . Isso faz com que um NOTIFY seja enviado para SIP.js, indicando que a assinatura foi encerrada. No entanto, há uma verificação em user-agent.onTransportMessage() que verifica se user-agent está parado. E, em seguida, descartando NOTIFY por causa do estado do agente do usuário. Fazendo com que o assinante espere o tempo limite.

Vamos trabalhar para conseguir esse patch. Obrigado.

indicando que a assinatura foi encerrada. No entanto, há uma verificação em user-agent.onTransportMessage() que verifica se user-agent está parado. E, em seguida, descartar o `NOTIFY por causa de

Muito obrigado por responder rapidamente e encontrar a causa raiz do problema! Espero que seja corrigido em breve :)
A propósito, eu testei a função stop() quando não estou fazendo meu SIP SUBSCRIBE inicial que também estou fazendo ao fazer o REGISTRO, e tudo está funcionando rápido. Mas é claro que vou precisar ASSINAR.
Agradeço mais uma vez!

Para contornar isso, você pode descartar suas assinaturas manualmente antes de chamar stop() no agente de usuário.

Para contornar isso, você pode descartar suas assinaturas manualmente antes de chamar stop() no agente de usuário.

Obrigado! Já feito, mas não de uma forma eficiente, eu acho. Se você puder me sugerir uma maneira melhor, será muito útil.
Tenho algumas inscrições que estou fazendo enquanto o usuário está registrado (como presença, conferência e alguns outros eventos).
Existe uma maneira de itterar em todas as assinaturas ativas e chamar o método dispose ou unsubscribe ?
Eu vi que posso obter a lista de assinaturas fazendo: userAgentObject._subscriptions e está obtendo uma série de assinantes e, por algum motivo, não posso pegá-la e fazer nada com ela, como iteração ou outra coisa.

Da maneira como fiz atualmente, mas, novamente, não gosto disso, para cada tipo de evento de assinatura, armazenei o assinante em uma variável global diferente na classe e para cada variável de assinante estou chamando de unsubscribe método.

A propósito, qual é a diferença entre dispose e unsubscribe ? Presumo que dispose não cancelará a assinatura no PBX. Certo? Se for assim, acho que é menos recomendado, porque no meu caso, se eu não cancelar totalmente a inscrição, o PBX continuará enviando mensagens de NOTIFICAÇÃO irrelevantes para meu Kamailio (o que pode levar a um bloqueio total porque Kamailio bloqueará meu PBX se for sobrecarregá-lo).

Para contornar isso, você pode descartar suas assinaturas manualmente antes de chamar stop() no agente de usuário.

Algum progresso😊? Como fazer isso antes que o bug seja corrigido?

Não tenho nenhuma assinatura, mas o UA.stop() é muito lento. Quase 1min ...

Obrigada.

Para contornar isso, você pode descartar suas assinaturas manualmente antes de chamar stop() no agente de usuário.

Algum progresso😊? Como fazer isso antes que o bug seja corrigido?

Não tenho nenhuma assinatura, mas o UA.stop() é muito lento. Quase 1min ...

Obrigada.

Não, esse problema ainda não foi resolvido.
Mas, você pode fazer o que eu fiz ... você pode simplesmente destruir seus objetos manualmente um por um com a seguinte ordem lógica:

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

De preferência, faça todas as ações com promessas. Quero dizer, use then para que você possa esperar cada promessa de ação para voltar e agir de acordo com a próxima etapa.

Eu tenho o mesmo problema. Eu não tenho nenhuma assinatura. Para mim, fechar o WebSocket demora muito, (20-50 segundos)

Tentei:

  • destruindo o objeto manualmente como @slavikbialik sugere.
  • fechando o WebSocket manualmente com userAgent.transport.ws.close() para ter certeza se meu problema está relacionado ao WebSocket.
  • no Chrome e Firefox.

Não tenho nenhuma configuração específica, apenas segui o guia SIP.js para reproduzir. Não sei se isso ajuda ou está relacionado ao meu problema, mas tentei abrir um WebSocket com protocolo sip sem nenhuma biblioteca e fechei-o. Ambos duraram menos de 1 segundo.

wss

Esta página foi útil?
0 / 5 - 0 avaliações