first commit
This commit is contained in:
76
build/node_modules/ssh2/lib/keepalivemgr.js
generated
vendored
Normal file
76
build/node_modules/ssh2/lib/keepalivemgr.js
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
var spliceOne = require('./utils').spliceOne;
|
||||
|
||||
function Manager(interval, streamInterval, kaCountMax) {
|
||||
var streams = this._streams = [];
|
||||
this._timer = undefined;
|
||||
this._timerInterval = interval;
|
||||
this._timerfn = function() {
|
||||
var now = Date.now();
|
||||
for (var i = 0, len = streams.length, s, last; i < len; ++i) {
|
||||
s = streams[i];
|
||||
last = s._kalast;
|
||||
if (last && (now - last) >= streamInterval) {
|
||||
if (++s._kacnt > kaCountMax) {
|
||||
var err = new Error('Keepalive timeout');
|
||||
err.level = 'client-timeout';
|
||||
s.emit('error', err);
|
||||
s.disconnect();
|
||||
spliceOne(streams, i);
|
||||
--i;
|
||||
len = streams.length;
|
||||
} else {
|
||||
s._kalast = now;
|
||||
// XXX: if the server ever starts sending real global requests to the
|
||||
// client, we will need to add a dummy callback here to keep the
|
||||
// correct reply order
|
||||
s.ping();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Manager.prototype.start = function() {
|
||||
if (this._timer)
|
||||
this.stop();
|
||||
this._timer = setInterval(this._timerfn, this._timerInterval);
|
||||
};
|
||||
|
||||
Manager.prototype.stop = function() {
|
||||
if (this._timer) {
|
||||
clearInterval(this._timer);
|
||||
this._timer = undefined;
|
||||
}
|
||||
};
|
||||
|
||||
Manager.prototype.add = function(stream) {
|
||||
var streams = this._streams,
|
||||
self = this;
|
||||
|
||||
stream.once('end', function() {
|
||||
self.remove(stream);
|
||||
}).on('packet', resetKA);
|
||||
|
||||
streams[streams.length] = stream;
|
||||
|
||||
resetKA();
|
||||
|
||||
if (!this._timer)
|
||||
this.start();
|
||||
|
||||
function resetKA() {
|
||||
stream._kalast = Date.now();
|
||||
stream._kacnt = 0;
|
||||
}
|
||||
};
|
||||
|
||||
Manager.prototype.remove = function(stream) {
|
||||
var streams = this._streams,
|
||||
index = streams.indexOf(stream);
|
||||
if (index > -1)
|
||||
spliceOne(streams, index);
|
||||
if (!streams.length)
|
||||
this.stop();
|
||||
};
|
||||
|
||||
module.exports = Manager;
|
||||
Reference in New Issue
Block a user