Skip to content

Instantly share code, notes, and snippets.

@dsamarin
Created December 25, 2011 07:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dsamarin/1518849 to your computer and use it in GitHub Desktop.
Save dsamarin/1518849 to your computer and use it in GitHub Desktop.
Flood control queue
/* Connection#send: Sends a message with flood control */
Connection.prototype.send = function(message) {
var queue, now;
now = Date.now();
queue = this.message_queue;
/* If the last message was sent early enough... */
if (this.message_time < (now - this.message_speed)) {
/* Send it through without queueing it. */
this.raw (message);
return;
}
this.message_queue.push (message);
if (this.message_queue.length === 1) this.run_queue ();
};
Connection.prototype.run_queue = function() {
var now, last, delay, self = this;
if (!this.message_queue.length) return;
now = Date.now ();
last = this.message_time;
delay = this.message_speed;
setTimeout (function() {
var queue;
queue = self.message_queue;
self.raw (queue.shift ());
self.run_queue ();
}, delay - now + last);
};
/* Connection#raw: Sends a message directly to the server */
Connection.prototype.raw = function(message) {
if (this.connection.readyState !== "open") {
return false;
}
this.connection.write(message + "\r\n", this.encoding);
this.message_time = Date.now();
return true;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment