]> jfr.im git - irc/quakenet/qwebirc.git/commitdiff
Fixes issue 68 (proper command queuing).
authorChris Porter <redacted>
Sat, 25 Jul 2009 23:18:27 +0000 (00:18 +0100)
committerChris Porter <redacted>
Sat, 25 Jul 2009 23:18:27 +0000 (00:18 +0100)
js/irc/ircconnection.js

index 687dc7361260b64ee3532d9cb837b6e11856147b..2dfb9a32ccf5329398bf54fddda7e9e89843b9e0 100644 (file)
@@ -29,6 +29,9 @@ qwebirc.irc.IRCConnection = new Class({
     this.__timeoutId = null;
     this.__lastActiveRequest = null;
     this.__activeRequest = null;
+    
+    this.__sendQueue = [];
+    this.__sendQueueActive = false;
   },
   __error: function(text) {
     this.fireEvent("error", text);
@@ -91,20 +94,46 @@ qwebirc.irc.IRCConnection = new Class({
   send: function(data, synchronous) {
     if(this.disconnected)
       return false;
-    var r = this.newRequest("p", false, synchronous);
     
+    if(synchronous) {
+      this.__send(data, false);
+    } else {
+      this.__sendQueue.push(data);
+      this.__processSendQueue();
+    }
+    
+    return true;
+  },
+  __processSendQueue: function() {
+    if(this.__sendQueueActive || this.__sendQueue.length == 0)
+      return;
+
+    this.sendQueueActive = true;      
+    this.__send(this.__sendQueue.shift(), true);
+  },
+  __send: function(data, queued) {
+    var r = this.newRequest("p", false, !queued); /* !queued == synchronous */
+    if(r === null)
+      return;
+      
     r.addEvent("complete", function(o) {
+      if(queued)
+        this.__sendQueueActive = false;
+
       if(!o || (o[0] == false)) {
+        this.__sendQueue = [];
+        
         if(!this.disconnected) {
           this.disconnected = true;
           this.__error("An error occured: " + o[1]);
         }
         return false;
       }
+      
+      this.__processSendQueue();
     }.bind(this));
     
     r.send("s=" + this.sessionid + "&c=" + encodeURIComponent(data));
-    return true;
   },
   __processData: function(o) {
     if(o[0] == false) {