Twilio Reject 侦听器未在客户端调用,而是调用断开连接 .on('reject', handler())

问题描述

TL;DR:Twilio javascript 客户端中的“拒绝”事件侦听器在被调用方被拒绝后不会被调用,但“断开连接”事件侦听器是。我想知道出站呼叫何时被对方拒绝,但找不到方法

我使用 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,如果正文包含一个 DialCallStatus 等于 busy,我会用 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
  });

我的代码有问题吗? 如果拒绝事件侦听器从未被触发而只有断开连接的侦听器被触发,我怎么知道断开连接发生的原因?

提前致谢。

解决方法

这里是 Twilio 开发者布道者。

来自the documentation on the reject event

.on('reject',handler())

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

只有当您的 reject 对象拒绝来电时才会调用 Connection 事件。外呼被拒绝时不会。

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

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