设置
我正在使用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);
...但是,由于code
和reason
几乎没有意义,因此无论其关闭原因,这都会自动重新启动连接。如果连接丢失或超出时间,这是很棒的,但是如果我想编程以编程方式关闭它,那就不太好了...
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()
方法 - 仅需要一条干净的代码线以将其关闭(而不是两个(。