【问题标题】:Twilio Reject listener not called on client, disconnect called instead客户端上未调用 Twilio Reject 侦听器,而是调用了断开连接
【发布时间】:2021-01-29 14:53:00
【问题描述】:

TL;DR:Twilio javascript 客户端中的“reject”事件监听器在被调用者被拒绝后没有被调用,但“disconnect”事件监听器被调用。我想知道呼出呼叫何时被其他对等方拒绝,但找不到如何。

我正在使用 Twilio 进行浏览器到浏览器的调用(基于此存储库:https://github.com/TwilioDevEd/browser-calls-node)。

呼叫者客户端正在使用 device.connect 发起呼叫。 我收到一个连接到我的服务器的钩子(在 Twilio 应用程序控制台中定义的路由)。 然后,我的服务器使用包含拨号命令的 twiml 字符串响应 Twilio,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
   <Dial answerOnBridge="true" action="/calls/webhooks/status" record="record-from-answer">
      <Client>
         600b3a66ebc8f8ba51d7aed6
         <Parameter name="sessionId" value="53d70205-6723-4402-afe5-68169c2bd018" />
      </Client>
   </Dial>
   <Record />
</Response>

客户端字符串是注册代理。 当被叫方收到来电时,UI 会显示一个带有接听和拒绝按钮的弹出窗口。 当用户点击拒绝时,我使用call.reject() 拒绝来电。 然后 Twilio 访问了我定义的状态 webhook,如果正文包含等于 busyDialCallStatus,我将使用 Twiml 字符串响应拒绝命令,如下所示:

<?xml version="1.0" encoding="UTF-8"?><Response><Reject/></Response>

现在问题来了: 调用者“拒绝”事件侦听器不会被触发,也不会被“取消”。 调用者“断开连接”事件监听器确实被调用了——但是当每一方挂断时它也会被调用。 当被叫方接听电话时,一切正常,连接“接受”事件监听器被触发。

无法区分这两种状态 - 呼叫是否已接听并挂断,或者呼叫是否被座席拒绝。

我已经尝试了所有方法 - 将事件侦听器连接到呼叫、设备,但我不知道为什么它没有被调用。

我在调用方的代码如下所示:

   const device = new Twilio.Device(token, {
       codecPreferences: ["opus", "pcmu"],
       fakeLocalDTMF: true,
       enableRingingState: true,
    });

  device.on('disconnect', () => {
    // this is actually being called after the Reject response from the server... but I want the reject listener to be called instead.
  })
  const call = device?.connect({ sessionId: state.sessionId });
 

  state.call.on('reject', (call) => {
     // this is not being called... :(
  });
  state.call.on('canceled', (call) => {
     // this is not being called either
  });

我的代码有问题吗? 如果拒绝事件监听器从未被触发并且只有断开连接,我怎么知道为什么会发生断开连接?

提前致谢。

【问题讨论】:

    标签: javascript node.js twilio


    【解决方案1】:

    这里是 Twilio 开发者宣传员。

    来自the documentation on the reject event

    .on('reject', handler())

    注册一个处理函数以在连接被拒绝并且Connection.status() 已转换为关闭时调用。这是在调用 Connection.reject() 时引发的。

    reject 事件仅在您的Connection 对象拒绝来电时调用。拨出电话被拒绝时不会。

    如果您想区分通话是否被另一端应答,您应该监听事件ringingaccept。如果呼叫仅通过ringingdisconnect 事件,则它被挂断。如果它被接受然后断开连接,那么就建立了连接。

    您还可以在action webhook 中查看调用发生了什么。 DialCallStatus will tell you whether the call was completed, no-answer, busy, etc

    【讨论】:

    • @ASpirin 此答案适用于版本 1 SDK。我建议你写一个新问题并充分解释发生了什么。请比“不工作”更具体,并分享您的代码。
    猜你喜欢
    • 2011-04-29
    • 2018-02-09
    • 2013-01-23
    • 2018-12-05
    • 1970-01-01
    • 2017-03-07
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多