You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.2 KiB
87 lines
2.2 KiB
'use strict'; |
|
|
|
var inherits = require('inherits') |
|
, EventEmitter = require('events').EventEmitter |
|
; |
|
|
|
var debug = function() {}; |
|
if (process.env.NODE_ENV !== 'production') { |
|
debug = require('debug')('sockjs-client:buffered-sender'); |
|
} |
|
|
|
function BufferedSender(url, sender) { |
|
debug(url); |
|
EventEmitter.call(this); |
|
this.sendBuffer = []; |
|
this.sender = sender; |
|
this.url = url; |
|
} |
|
|
|
inherits(BufferedSender, EventEmitter); |
|
|
|
BufferedSender.prototype.send = function(message) { |
|
debug('send', message); |
|
this.sendBuffer.push(message); |
|
if (!this.sendStop) { |
|
this.sendSchedule(); |
|
} |
|
}; |
|
|
|
// For polling transports in a situation when in the message callback, |
|
// new message is being send. If the sending connection was started |
|
// before receiving one, it is possible to saturate the network and |
|
// timeout due to the lack of receiving socket. To avoid that we delay |
|
// sending messages by some small time, in order to let receiving |
|
// connection be started beforehand. This is only a halfmeasure and |
|
// does not fix the big problem, but it does make the tests go more |
|
// stable on slow networks. |
|
BufferedSender.prototype.sendScheduleWait = function() { |
|
debug('sendScheduleWait'); |
|
var self = this; |
|
var tref; |
|
this.sendStop = function() { |
|
debug('sendStop'); |
|
self.sendStop = null; |
|
clearTimeout(tref); |
|
}; |
|
tref = setTimeout(function() { |
|
debug('timeout'); |
|
self.sendStop = null; |
|
self.sendSchedule(); |
|
}, 25); |
|
}; |
|
|
|
BufferedSender.prototype.sendSchedule = function() { |
|
debug('sendSchedule', this.sendBuffer.length); |
|
var self = this; |
|
if (this.sendBuffer.length > 0) { |
|
var payload = '[' + this.sendBuffer.join(',') + ']'; |
|
this.sendStop = this.sender(this.url, payload, function(err) { |
|
self.sendStop = null; |
|
if (err) { |
|
debug('error', err); |
|
self.emit('close', err.code || 1006, 'Sending error: ' + err); |
|
self.close(); |
|
} else { |
|
self.sendScheduleWait(); |
|
} |
|
}); |
|
this.sendBuffer = []; |
|
} |
|
}; |
|
|
|
BufferedSender.prototype._cleanup = function() { |
|
debug('_cleanup'); |
|
this.removeAllListeners(); |
|
}; |
|
|
|
BufferedSender.prototype.close = function() { |
|
debug('close'); |
|
this._cleanup(); |
|
if (this.sendStop) { |
|
this.sendStop(); |
|
this.sendStop = null; |
|
} |
|
}; |
|
|
|
module.exports = BufferedSender;
|
|
|