|
|
@ -508,33 +508,49 @@ exports.createSecurePair = function(credentials, |
|
|
|
* Because it is also called everywhere, we also check if the connection has |
|
|
|
* completed negotiation and emit 'secure' from here if it has. |
|
|
|
*/ |
|
|
|
SecurePair.prototype._cycle = function() { |
|
|
|
SecurePair.prototype._cycle = function(depth) { |
|
|
|
depth = depth ? depth : 0; |
|
|
|
if (this._done) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// Make this function reentrant.
|
|
|
|
if (this._cycleLock) return; |
|
|
|
this._cycleLock = true; |
|
|
|
this._writeCalled = false; |
|
|
|
if(depth == 0) this._writeCalled = false; |
|
|
|
|
|
|
|
var established = this._secureEstablished; |
|
|
|
|
|
|
|
if (!this._cycleEncryptedPullLock) { |
|
|
|
this._cycleEncryptedPullLock = true; |
|
|
|
this.encrypted._pull(); |
|
|
|
this._cycleEncryptedPullLock = false; |
|
|
|
} |
|
|
|
|
|
|
|
if (!this._cycleCleartextPullLock) { |
|
|
|
this._cycleCleartextPullLock = true; |
|
|
|
this.cleartext._pull(); |
|
|
|
this._cycleCleartextPullLock = false; |
|
|
|
} |
|
|
|
|
|
|
|
if (!this._cycleCleartextPushLock) { |
|
|
|
this._cycleCleartextPushLock = true; |
|
|
|
this.cleartext._push(); |
|
|
|
this.encrypted._push(); |
|
|
|
this._cycleCleartextPushLock = false; |
|
|
|
} |
|
|
|
|
|
|
|
this._cycleLock = false; |
|
|
|
if (!this._cycleEncryptedPushLock) { |
|
|
|
this._cycleEncryptedPushLock = true; |
|
|
|
this.encrypted._push(); |
|
|
|
this._cycleEncryptedPushLock = false; |
|
|
|
} |
|
|
|
|
|
|
|
if (this._done) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if ((!established && this._secureEstablished) || this._writeCalled) { |
|
|
|
if ((!established && this._secureEstablished) || |
|
|
|
(depth == 0 && this._writeCalled)) { |
|
|
|
// If we were not established but now we are, let's cycle again.
|
|
|
|
// Or if there is some data to write...
|
|
|
|
this._cycle(); |
|
|
|
this._cycle(depth + 1); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|