问题描述
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
事件。外呼被拒绝时不会。
如果您想区分另一端是否接听了一个呼叫,您应该监听事件 ringing
和 accept
。如果呼叫仅通过 ringing
和 disconnect
事件,则它已挂断。如果它被接受然后断开连接,那么就建立了连接。
您还可以在 action
网络钩子中查看调用发生了什么。 DialCallStatus
will tell you whether the call was completed,no-answer,busy,etc。