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



设置

我正在使用WebSockets/WS库来收听WSS feed。它运行良好,它很轻,似乎是周围最快的之一(这很重要(。

我试图区分我以编程方式关闭连接,并出于任何原因关闭连接。

根据文档,我可以发送code(INT(和reason(String(,这两者都发送到关闭事件。但是从所有方面来看,这种功能不再存在。

测试

  • 大多数代码抛出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。我可以在自己的代码中覆盖关闭方法吗?

还是有同样轻巧且闪电的库,它具有我想要的功能?我只需要能够可靠地发送唯一的code和/或reason,所以我知道当我尝试手动关闭它时。我知道提出建议是禁忌的,但是有太多的库可以测试每个库,也找不到我可以找到的基准。

来自@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()方法 - 仅需要一条干净的代码线以将其关闭(而不是两个(。

最新更新