我在客户端 js 中初始化 Twilio.Device 时遇到问题,我无法追踪涉及设备的 websocket 在设置设备时不断断开连接。
我已经将我的代码剥离到它的准系统,只需获取一个访问令牌并在单击按钮时创建设备。我已经排除了浏览器问题和网络问题,并且无法在我自己的代码中查明问题所在。我已经尝试了多个版本的 twilio.js 到 1.4,所有版本中都出现了相同的问题。我目前正在使用来自 twilio CDN 的 1.7。我目前无法使用 npm。
我在仍然遇到此问题时减少到的 javascript 代码是:
$(document).ready(function(){
$('#readyButton').click(function(e){
$.get("/token", {forPage: window.location.pathname}, function(data){
console.log("testing");
var token = data.token;
}).then(function(token){
token = token.token;
Device = new Twilio.Device(token, {debug: true});
})
});
})
获取令牌的python烧瓶代码是:
@app.route('/token', methods=['POST', 'GET'])
def get_token():
token = AccessToken(app.config['ACCOUNT_SID'],
app.config['API_SID'],
app.config['API_KEY']
)
voice_grant = VoiceGrant(
outgoing_application_sid=app.config['TWIML_APP_ID'],
incoming_allow=True
)
token.add_grant(voice_grant)
token = token.to_jwt()
return jsonify({'token': token.decode("utf-8")})
单击 html 中的就绪键时,一切都按预期调用,在 jwt 调试器中测试了令牌,它看起来是正确的
但是,在所有浏览器中,当我在我得到的选项中将调试设置为 true 时:
Setting up VSP
WSTransport.open() called...
Attempting to connect...
Closing and cleaning up WebSocket...
No WebSocket to clean up.
WebSocket opened successfully.
[PStream] Setting token and publishing listen
Closing and cleaning up WebSocket...
Will attempt to reconnect WebSocket in 127ms
Steam is offline.
这种情况无限期地继续下去。
我试图在 twilio js 中调试它但没有成功,因为当我在套接字中有一个断点时突然在 Firefox 上保持连接,并且 chrome/edge 继续遇到同样的问题。我添加了多个console.logs,以及一些睡眠语句,以确保它不仅仅是一个异步计时问题,没有成功。
我在具有静态 IP 地址的 Azure 虚拟机上使用带有自签名证书的 https。
这是我在断开连接之前的流对象
{
"options": {
"debug": true,
"logPrefix": "[PStream]"
},
"token": "ommitted",
"status": "connected",
"uri": "wss://chunderw-vpc-gll.twilio.com/signal",
"gateway": "ec2-52-215-127-237.eu-west-1.compute.amazonaws.com",
"region": "EU_IRELAND",
"_messageQueue": [],
"_events": {
"error": [
null,
null
],
"ready": [
null,
null
],
"offline": [
null,
null
],
"close": [
null,
null
]
},
"_eventsCount": 6,
"transport": {
"_events": {},
"_eventsCount": 4,
"state": "open",
"_backoff": {
"_events": {},
"_eventsCount": 2,
"backoffStrategy_": {
"initialDelay_": 100,
"maxDelay_": 20000,
"randomisationFactor_": 0.4,
"backoffDelay_": 1600,
"nextBackoffDelay_": 3200,
"factor_": 2
},
"maxNumberOfRetry_": -1,
"backoffNumber_": 5,
"backoffDelay_": 1710,
"timeoutID_": -1,
"handlers": {}
},
"_log": {
"_logLevel": "debug",
"_console": {
"IS_NATIVE_CONSOLE": true
}
},
"_uri": "wss://chunderw-vpc-gll.twilio.com/signal",
"_connectTimeout": 33,
"_heartbeatTimeout": 34,
"_socket": {},
"_timeOpened": 1565713445219
}
}
和 _closeSocket 中的 websocket
{
"_events": {},
"_eventsCount": 4,
"state": "open",
"_backoff": {
"_events": {},
"_eventsCount": 2,
"backoffStrategy_": {
"initialDelay_": 100,
"maxDelay_": 20000,
"randomisationFactor_": 0.4,
"backoffDelay_": 1600,
"nextBackoffDelay_": 3200,
"factor_": 2
},
"maxNumberOfRetry_": -1,
"backoffNumber_": 5,
"backoffDelay_": 1710,
"timeoutID_": -1,
"handlers": {}
},
"_log": {
"_logLevel": "debug",
"_console": {
"IS_NATIVE_CONSOLE": true
}
},
"_uri": "wss://chunderw-vpc-gll.twilio.com/signal",
"_connectTimeout": 33,
"_heartbeatTimeout": 34,
"_socket": {},
"_timeOpened": 1565713445219
}
_closeSocket 中的堆栈跟踪(IP_Address 省略)
console.trace() twilio.js:6913:17
_closeSocket https://xxx.xxx.xxx.xxx:5443/static/js/twilio.js:6913
_onSocketClose https://xxx.xxx.xxx.xxx:5443/static/js/twilio.js:6786
所有对象在断点之前和之后都是相同的,但是由于某种原因,在断点在 Firefox 上命中后,websocket 仍保持连接。
任何帮助将不胜感激,因为我觉得我现在已经碰到了砖墙
-------编辑-------
我现在通过创建一个绝对基本的静态 html 页面来排除 Flask 问题,该页面运行一个测试 js 脚本。唯一的其他库是 twilio.js 和 jquery.js 我正在使用静态令牌进行测试而不是生成,我给出了 24 小时的 ttl(省略)
$(document).ready(function(){
token = 'xxx'
Twilio.Device.setup(token, {debug: true});
})
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="jquery.js"></script>
<title>TEST</title>
<script src="twilio.js"></script>
<script src="test.js"></script>
</head>
<body>
Testing
</body>
</html>
-----编辑-----
决定这与我的代码无关,因此打开了 Twilio 的问题。