1

我在客户端 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 的问题。

4

1 回答 1

0

我在使用最新的 Twilio JS 客户端 SDK 1.8.1 和 3.x nodejs twilio helper 的 nodejs/reactjs 堆栈上遇到了同样的问题。原来问题是我在生成 twilio JWT 时使用了错误的 ACCOUNT SID / Auth Key。

我正在使用我为 Twilio 控制台中的特定应用程序生成的特定于应用程序的身份验证密钥 --> 主页 --> API 密钥 --> 我的 Twilio 应用程序密钥。但是我试图将该身份验证密钥与在控制台-> 主页-> 设置--> 常规-> API 凭据-> 帐户 SID 下找到的帐户 SID 结合起来。

就我而言,我必须使用正确的凭据组合来获取有效令牌。所以我使用了 Home-->Settings-->General-->API Credentials 中的 Account SID 和 Auth Token。然后 websocket 保持不变。

遗憾的是,Twilio API/SDK 没有更明确地说明 websocket 无法建立的原因。

于 2019-09-05T21:56:41.910 回答