@@ -11,19 +11,20 @@ module.exports = Parser;
11
11
function Parser ( options ) {
12
12
options = options || { } ;
13
13
14
- this . _supportBigNumbers = options . config && options . config . supportBigNumbers ;
15
- this . _buffer = Buffer . alloc ( 0 ) ;
16
- this . _nextBuffers = new BufferList ( ) ;
17
- this . _longPacketBuffers = new BufferList ( ) ;
18
- this . _offset = 0 ;
19
- this . _packetEnd = null ;
20
- this . _packetHeader = null ;
21
- this . _packetOffset = null ;
22
- this . _onError = options . onError || function ( err ) { throw err ; } ;
23
- this . _onPacket = options . onPacket || function ( ) { } ;
24
- this . _nextPacketNumber = 0 ;
25
- this . _encoding = 'utf-8' ;
26
- this . _paused = false ;
14
+ this . _supportBigNumbers = options . config && options . config . supportBigNumbers ;
15
+ this . _buffer = Buffer . alloc ( 0 ) ;
16
+ this . _nextBuffers = new BufferList ( ) ;
17
+ this . _expectedPacketNumber = 0 ;
18
+ this . _longPacketBuffers = new BufferList ( ) ;
19
+ this . _offset = 0 ;
20
+ this . _packetEnd = null ;
21
+ this . _packetHeader = null ;
22
+ this . _packetOffset = null ;
23
+ this . _onError = options . onError || function ( err ) { throw err ; } ;
24
+ this . _onPacket = options . onPacket || function ( ) { } ;
25
+ this . _nextPacketNumber = 0 ;
26
+ this . _encoding = 'utf-8' ;
27
+ this . _paused = false ;
27
28
}
28
29
29
30
Parser . prototype . write = function write ( chunk ) {
@@ -103,6 +104,16 @@ Parser.prototype.append = function append(chunk) {
103
104
: null ;
104
105
} ;
105
106
107
+ Parser . prototype . isExpectedPacketNumber = function isExpectedPacketNumber ( num ) {
108
+ if ( this . _expectedPacketNumber === this . _nextPacketNumber ) {
109
+ return this . _expectedPacketNumber === num ;
110
+ } else if ( this . _expectedPacketNumber < this . _nextPacketNumber ) {
111
+ return this . _expectedPacketNumber <= num && this . _nextPacketNumber >= num ;
112
+ } else {
113
+ return this . _expectedPacketNumber <= num || this . _nextPacketNumber >= num ;
114
+ }
115
+ } ;
116
+
106
117
Parser . prototype . pause = function ( ) {
107
118
this . _paused = true ;
108
119
} ;
@@ -345,15 +356,20 @@ Parser.prototype.reachedPacketEnd = function() {
345
356
return this . _offset === this . _packetEnd ;
346
357
} ;
347
358
348
- Parser . prototype . incrementPacketNumber = function ( ) {
359
+ Parser . prototype . incrementPacketNumber = function incrementPacketNumber ( isContinuation ) {
349
360
var currentPacketNumber = this . _nextPacketNumber ;
350
361
this . _nextPacketNumber = ( this . _nextPacketNumber + 1 ) % 256 ;
351
362
363
+ if ( ! isContinuation ) {
364
+ this . _expectedPacketNumber = this . _nextPacketNumber ;
365
+ }
366
+
352
367
return currentPacketNumber ;
353
368
} ;
354
369
355
370
Parser . prototype . resetPacketNumber = function ( ) {
356
- this . _nextPacketNumber = 0 ;
371
+ this . _expectedPacketNumber = 0 ;
372
+ this . _nextPacketNumber = 0 ;
357
373
} ;
358
374
359
375
Parser . prototype . packetLength = function packetLength ( ) {
@@ -466,7 +482,7 @@ Parser.prototype._tryReadPacketHeader = function _tryReadPacketHeader() {
466
482
this . parseUnsignedNumber ( 1 )
467
483
) ;
468
484
469
- if ( this . _packetHeader . number !== this . _nextPacketNumber ) {
485
+ if ( ! this . isExpectedPacketNumber ( this . _packetHeader . number ) ) {
470
486
var err = new Error (
471
487
'Packets out of order. Got: ' + this . _packetHeader . number + ' ' +
472
488
'Expected: ' + this . _nextPacketNumber
0 commit comments