diff --git a/lib/ConnectionManager.js b/lib/ConnectionManager.js index 0ae6086..77475cd 100644 --- a/lib/ConnectionManager.js +++ b/lib/ConnectionManager.js @@ -62,6 +62,13 @@ function ConnectionManager(connectionString, options, stateListener) { this.updateTimeout(options.sessionTimeout); this.connectTimeoutHandler = null; + /** + * add sessionTimeoutHandler + * + * @type {number} + */ + this.sessionTimeoutHandler = null; + this.xid = 0; this.sessionId = new Buffer(8); @@ -219,6 +226,11 @@ ConnectionManager.prototype.connect = function () { self.findNextServer(function (server) { self.socket = net.connect(server); + self.sessionTimeoutHandler = setTimeout( + self.onSessionTimeout.bind(self), + self.options.sessionTimeout + ); + self.connectTimeoutHandler = setTimeout( self.onSocketConnectTimeout.bind(self), self.connectTimeout @@ -290,6 +302,18 @@ ConnectionManager.prototype.onSocketError = function (error) { // we will retry connect in that listener function. }; +ConnectionManager.prototype.onSessionTimeout = function () { + var connectStates = [STATES.CONNECTED, STATES.CONNECTED_READ_ONLY]; + + if (connectStates.indexOf(this.state) === -1) { + this.setState(STATES.SESSION_EXPIRED); + } + + if (this.socket) { + this.socket.destroy(); + } +}; + ConnectionManager.prototype.onSocketConnectTimeout = function () { // Destroy the current socket so the socket closed event // will be trigger. @@ -305,6 +329,8 @@ ConnectionManager.prototype.onSocketConnected = function () { if (this.connectTimeoutHandler) { clearTimeout(this.connectTimeoutHandler); + //clear sessionTimeoutHandler + clearTimeout(this.sessionTimeoutHandler); } connectRequest = new jute.Request(null, new jute.protocol.ConnectRequest(