Sip.js: UserAgent.stop() 函数花费太多时间

创建于 2020-10-06  ·  7评论  ·  资料来源: onsip/SIP.js

描述错误
出于某种原因,当使用“UserAgent.stop()”函数时,它需要大约 30 秒来停止一切,直到它以适当的承诺响应。

我想要实现的是一个完整的取消注册命令,它不仅可以取消注册,还可以:

  1. 清除所有 SIP 订阅。
  2. 关闭网络套接字连接。

据我所知,“stop()”函数正是这样做的。 只是时间太长了。

日志
以下是来自控制台的日志: logs

观察到的行为
只有在大约 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(网络套接字)
  • 谷歌浏览器 85.0.4183.121

    • SIP.JS 0.17.1

最有用的评论

我有同样的问题。 我没有任何订阅。 对我来说,关闭 WebSocket 花费的时间太长(20-50 秒)

我试过了:

  • 按照@slavikbialik 的建议手动销毁对象。
  • 使用userAgent.transport.ws.close()手动关闭 WebSocket 以确保我的问题是否与 WebSocket 有关。
  • 在 Chrome 和 Firefox 中。

我没有任何具体的配置,只是按照SIP.js指南进行复制。 我不知道这是否对我的问题有帮助或与我的问题有关,但我尝试使用没有任何库的 sip 协议打开一个 WebSocket 并关闭它。 他们都持续了不到1秒。

wss

所有7条评论

在代码中确认...

@john-e-riordan 这看起来是一个操作顺序问题。

user-agent.stop()的顶部,我们转换到Stopped状态。

然后我们循环遍历registererssessions ,然后subscriptions

subscription.dispose()功能理所当然发送SUBSCRIBEExpires=0报头。 这会导致NOTIFY被发送到 SIP.js,表明订阅已关闭。 但是, user-agent.onTransportMessage()中有一个检查,用于检查user-agent是否已停止。 然后由于用户代理状态而删除NOTIFY 。 导致订阅者等待超时。

我们将努力修补这个问题。 谢谢。

说明订阅已关闭。 但是, user-agent.onTransportMessage()中有一个检查,用于检查user-agent是否已停止。 然后丢弃`NOTIFY 因为

非常感谢您的快速响应并找到问题的根本原因! 希望它会尽快修复:)
顺便说一句,当我没有进行初始 SIP SUBSCRIBE 时,我测试了stop()函数,而我在进行注册时也在这样做,并且一切都运行得很快。 但我当然需要这个订阅。
再次感谢!

要解决此问题,您可以在用户代理上调用stop()之前手动处理您的订阅。

要解决此问题,您可以在用户代理上调用stop()之前手动处理您的订阅。

谢谢! 已经完成,但我认为不是有效的方式。 如果您能建议我更好的方法,那将非常有帮助。
我在用户注册时进行了一些订阅(例如出席、会议和其他一些活动)。
有没有办法对所有活动订阅进行迭代并调用disposeunsubscribe方法?
我看到我可以通过执行以下操作来获取订阅列表: userAgentObject._subscriptions并且它正在获取一些订阅者数组,由于某种原因,我无法接受它并对其进行任何操作,例如迭代或其他操作。

我目前的做法,但同样,我不喜欢它,对于每个订阅事件类型,我将订阅者存储到类中的不同全局变量中,对于每个订阅者变量,我调用unsubscribe方法。

顺便说一句, disposeunsubscribe之间有什么区别? 我假设dispose不会取消订阅 PBX 中的订阅。 对? 如果是这样,我认为不建议这样做,因为在我的情况下,如果我不完全取消订阅,PBX 将继续向我的 Kamailio 发送不相关的 NOTIFY 消息(这可能会导致完全阻止,因为 Kamailio 会阻止我的 PBX,如果它超载他)。

要解决此问题,您可以在用户代理上调用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 的建议手动销毁对象。
  • 使用userAgent.transport.ws.close()手动关闭 WebSocket 以确保我的问题是否与 WebSocket 有关。
  • 在 Chrome 和 Firefox 中。

我没有任何具体的配置,只是按照SIP.js指南进行复制。 我不知道这是否对我的问题有帮助或与我的问题有关,但我尝试使用没有任何库的 sip 协议打开一个 WebSocket 并关闭它。 他们都持续了不到1秒。

wss

此页面是否有帮助?
0 / 5 - 0 等级