浏览代码

Refactor the session resumption code and fix a bug after recent merge.

Split the code into two new methods for the prebind and non-prebind
usecase.
JC Brand 10 年之前
父节点
当前提交
f86ef934e8
共有 1 个文件被更改,包括 66 次插入43 次删除
  1. 66 43
      converse.js

+ 66 - 43
converse.js

@@ -5671,8 +5671,66 @@
             });
         };
 
+        this.attemptPreboundSession = function (tokens) {
+            /* Handle session resumption or initialization when prebind is being used.
+             */
+            var rid = tokens.rid, jid = tokens.jid, sid = tokens.sid;
+            if (this.keepalive) {
+                if (!this.jid) {
+                    throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");
+                }
+                if (rid && sid && jid && Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(this.jid)) {
+                    this.session.save({rid: rid}); // The RID needs to be increased with each request.
+                    return this.connection.attach(jid, sid, rid, this.onConnStatusChanged);
+                }
+            } else { // Not keepalive
+                if (this.jid && this.sid && this.rid) {
+                    return this.connection.attach(this.jid, this.sid, this.rid, this.onConnStatusChanged);
+                } else {
+                    throw new Error("initConnection: If you use prebind and not keepalive, "+
+                        "then you MUST supply JID, RID and SID values");
+                }
+            }
+            // We haven't been able to attach yet. Let's see if there
+            // is a prebind_url, otherwise there's nothing with which
+            // we can attach.
+            if (this.prebind_url) {
+                this.startNewBOSHSession();
+            } else {
+                delete this.connection;
+                this.emit('noResumeableSession');
+            }
+        };
+
+        this.attemptNonPreboundSession = function (tokens) {
+            /* Handle session resumption or initialization when prebind is not being used.
+             *
+             * Two potential options exist and are handled in this method:
+             *  1. keepalive
+             *  2. auto_login
+             */
+            var rid = tokens.rid, jid = tokens.jid, sid = tokens.sid;
+            if (this.keepalive && rid && sid && jid) {
+                this.session.save({rid: rid}); // The RID needs to be increased with each request.
+                this.connection.attach(jid, sid, rid, this.onConnStatusChanged);
+            } else if (this.auto_login) {
+                if (!this.jid) {
+                    throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");
+                }
+                if (this.authentication === ANONYMOUS) {
+                    this.connection.connect(this.jid, null, this.onConnStatusChanged);
+                } else if (this.authentication === LOGIN) {
+                    if (!this.password) {
+                        throw new Error("initConnection: If you use auto_login and "+
+                            "authentication='login' then you also need to provide a password.");
+                    }
+                    this.connection.connect(this.jid, this.password, this.onConnStatusChanged);
+                }
+            }
+        };
+
         this.initConnection = function () {
-            var rid, sid, jid;
+            var tokens = {};
             if (this.connection && this.connection.connected) {
                 this.setUpXMLLogging();
                 this.onConnected();
@@ -5688,52 +5746,17 @@
                     throw new Error("initConnection: this browser does not support websockets and bosh_service_url wasn't specified.");
                 }
                 this.setUpXMLLogging();
-
                 if (this.keepalive) {
-                    if (!this.jid) {
-                        throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");
-                    }
-                    rid = this.session.get('rid');
-                    sid = this.session.get('sid');
-                    jid = this.session.get('jid');
+                    tokens.rid = this.session.get('rid');
+                    tokens.sid = this.session.get('sid');
+                    tokens.jid = this.session.get('jid');
                 }
+                // We now try to resume or automatically set up a new session.
+                // Otherwise the user will be shown a login form.
                 if (this.authentication === PREBIND) {
-                    if (!this.keepalive) {
-                        if (this.jid && this.sid && this.rid) {
-                            this.connection.attach(this.jid, this.sid, this.rid, this.onConnStatusChanged);
-                        } else {
-                            throw new Error("initConnection: If you use prebind and not keepalive, "+
-                                "then you MUST supply JID, RID and SID values");
-                        }
-                    }
-                    if (rid && sid && jid && Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(this.jid)) {
-                        this.session.save({rid: rid}); // The RID needs to be increased with each request.
-                        this.connection.attach(jid, sid, rid, this.onConnStatusChanged);
-                    } else if (this.prebind_url) {
-                        this.startNewBOSHSession();
-                    } else {
-                        delete this.connection;
-                        this.emit('noResumeableSession');
-                    }
+                    this.attemptPreboundSession(tokens);
                 } else {
-                    // Non-prebind case.
-                    if (this.keepalive && rid && sid && jid) {
-                        this.session.save({rid: rid}); // The RID needs to be increased with each request.
-                        this.connection.attach(jid, sid, rid, this.onConnStatusChanged);
-                    } else if (this.auto_login) {
-                        if (!this.jid) {
-                            throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");
-                        }
-                        if (this.authentication === ANONYMOUS) {
-                            this.connection.connect(this.jid, null, this.onConnStatusChanged);
-                        } else if (this.authentication === LOGIN) {
-                            if (!this.password) {
-                                throw new Error("initConnection: If you use auto_login and "+
-                                    "authentication='login' then you also need to provide a password.");
-                            }
-                            this.connection.connect(this.jid, this.password, this.onConnStatusChanged);
-                        }
-                    }
+                    this.attemptNonPreboundSession(tokens);
                 }
             }
         };