节点websockets / ws - WSS:如何判断我是否关闭了连接,或者他们做了什么?

时间:2018-02-12 18:53:19

标签: javascript node.js websocket

设置

我正在使用websockets/ws库来收听WSS Feed。效果很好,它足够轻巧,似乎是fastest around之一(,这很重要)。

我试图区分我以编程方式关闭连接,并且无论出于何种原因关闭它。

根据the docs,我可以发送code(int)和reason(字符串),这两个都发送到on close event。但从各方面来看,这个功能已不复存在。

测试

  • 大多数代码都会抛出First argument must be a valid error code number错误
  • 将其留空会将code = 1005和空reason发送给活动
  • 如果我输入1005代码,则会收到无效错误
  • 如果我输入的代码为1000,则该活动会收到code = 1006且仍为空reason(无论我放的是什么)

^测试很简单......

var WebSocket = require('ws');

var ws = new WebSocket(url);
ws.on('close', function(code, reason) {
    console.log(code);
    console.log(reason);
});

var code = 1234, 
    reason = 'whatever reason';

setTimeout(function() {
    ws.close(code, reason);
}, 5000);

可是...

我需要能够判断我是否已关闭连接,或者是否由于其他原因而关闭(连接丢失,由于时间限制而关闭它等)。根据它被关闭的原因,我有时需要立即重新打开连接,但只有有时

我可以做点像......

_initWS(url) {
    var ws = new WebSocket(url);

    ws.on('open', function() {...});

    ws.on('close', function(code, reason) {
        ws = null;          // Don't know if needed
        ws = _initWS(url);  // Reopen the connection, for ever and ever...
    });

    ws.on('message', funciton(msg) {...});

    return ws;
}

var someFeed = _initWS(someURL);

...但由于codereason几乎没有任何意义,因此无论关闭的原因如何,都会自动重新启动连接。如果连接丢失或超时,这很好,但如果我想以编程方式关闭它,那就太好了......

someFeed.close(); // Connection immediately reopens, always and forever

问题(S)

如何区分不同的关闭?我不想更改库代码,因为当我移动自己的代码时,我不能使用npm install。我可以在自己的代码中覆盖close方法吗?

或者是否有一个同样轻量级且闪电般快速的库,它具有我正在寻找的功能?我只需要能够可靠地发送一个唯一的code和/或reason,所以我知道我何时尝试手动关闭它。我知道要求提供建议是禁忌,但是有太多的库可以测试每一个,而且没有我能找到的基准。

1 个答案:

答案 0 :(得分:0)

来自@Bergi

的建议
_initWS(url) {
    var ws = new WebSocket(url);

    ws.didIClose = false;  // This is the flag to set if I close it manually

    ws.forceClose = function() {
        ws.didIClose = true;
        ws.close();
    };

    ws.on('open', function() {...});

    ws.on('close', function(code, reason) {
        if(!ws.didIClose) {    // If I didn't close it, reopen
            ws = null;          
            ws = _initWS(url);  
        }

    });

    ws.on('message', funciton(msg) {...});

    return ws;
}

var someFeed = _initWS(someURL);

然后使用它......

someFeed.didIClose = true;
someFeed.close();    // Won't reopen the connection

或者,有点清洁......

someFeed.forceClose();

编辑#1

修改后的解决方案包含forceClose()方法 - 只需要一行代码就可以通过编程方式关闭它(而不是两行)。