1
- var MAX_PACKET_LENGTH = Math . pow ( 2 , 24 ) - 1 ;
2
- var MUL_32BIT = Math . pow ( 2 , 32 ) ;
3
- var PacketHeader = require ( './PacketHeader' ) ;
4
- var BigNumber = require ( 'bignumber.js' ) ;
5
- var Buffer = require ( 'safe-buffer' ) . Buffer ;
6
- var BufferList = require ( './BufferList' ) ;
1
+ var PacketHeader = require ( './PacketHeader' ) ;
2
+ var BigNumber = require ( 'bignumber.js' ) ;
3
+ var Buffer = require ( 'safe-buffer' ) . Buffer ;
4
+ var BufferList = require ( './BufferList' ) ;
5
+
6
+ var MAX_PACKET_LENGTH = Math . pow ( 2 , 24 ) - 1 ;
7
+ var MUL_32BIT = Math . pow ( 2 , 32 ) ;
8
+ var PACKET_HEADER_LENGTH = 4 ;
7
9
8
10
module . exports = Parser ;
9
11
function Parser ( options ) {
@@ -28,71 +30,17 @@ Parser.prototype.write = function write(chunk) {
28
30
this . _nextBuffers . push ( chunk ) ;
29
31
30
32
while ( ! this . _paused ) {
31
- if ( ! this . _packetHeader ) {
32
- if ( ! this . _combineNextBuffers ( 4 ) ) {
33
- break ;
34
- }
35
-
36
- this . _packetHeader = new PacketHeader (
37
- this . parseUnsignedNumber ( 3 ) ,
38
- this . parseUnsignedNumber ( 1 )
39
- ) ;
40
-
41
- if ( this . _packetHeader . number !== this . _nextPacketNumber ) {
42
- var err = new Error (
43
- 'Packets out of order. Got: ' + this . _packetHeader . number + ' ' +
44
- 'Expected: ' + this . _nextPacketNumber
45
- ) ;
46
-
47
- err . code = 'PROTOCOL_PACKETS_OUT_OF_ORDER' ;
48
- err . fatal = true ;
33
+ var packetHeader = this . _tryReadPacketHeader ( ) ;
49
34
50
- this . _onError ( err ) ;
51
- }
52
-
53
- this . incrementPacketNumber ( ) ;
54
- }
55
-
56
- if ( ! this . _combineNextBuffers ( this . _packetHeader . length ) ) {
35
+ if ( ! packetHeader ) {
57
36
break ;
58
37
}
59
38
60
- this . _packetEnd = this . _offset + this . _packetHeader . length ;
61
- this . _packetOffset = this . _offset ;
62
-
63
- if ( this . _packetHeader . length === MAX_PACKET_LENGTH ) {
64
- this . _longPacketBuffers . push ( this . _buffer . slice ( this . _packetOffset , this . _packetEnd ) ) ;
65
-
66
- this . _advanceToNextPacket ( ) ;
67
- continue ;
39
+ if ( ! this . _combineNextBuffers ( packetHeader . length ) ) {
40
+ break ;
68
41
}
69
42
70
- this . _combineLongPacketBuffers ( ) ;
71
-
72
- // Try...finally to ensure exception safety. Unfortunately this is costing
73
- // us up to ~10% performance in some benchmarks.
74
- var hadException = true ;
75
- try {
76
- this . _onPacket ( this . _packetHeader ) ;
77
- hadException = false ;
78
- } catch ( err ) {
79
- if ( ! err || typeof err . code !== 'string' || err . code . substr ( 0 , 7 ) !== 'PARSER_' ) {
80
- throw err ; // Rethrow non-MySQL errors
81
- }
82
-
83
- // Pass down parser errors
84
- this . _onError ( err ) ;
85
- hadException = false ;
86
- } finally {
87
- this . _advanceToNextPacket ( ) ;
88
-
89
- // If we had an exception, the parser while loop will be broken out
90
- // of after the finally block. So we need to make sure to re-enter it
91
- // to continue parsing any bytes that may already have been received.
92
- if ( hadException ) {
93
- process . nextTick ( this . write . bind ( this ) ) ;
94
- }
95
- }
43
+ this . _parsePacket ( packetHeader ) ;
96
44
}
97
45
} ;
98
46
@@ -468,6 +416,73 @@ Parser.prototype._combineLongPacketBuffers = function _combineLongPacketBuffers(
468
416
this . _packetOffset = 0 ;
469
417
} ;
470
418
419
+ Parser . prototype . _parsePacket = function _parsePacket ( packetHeader ) {
420
+ this . _packetEnd = this . _offset + packetHeader . length ;
421
+ this . _packetOffset = this . _offset ;
422
+
423
+ if ( packetHeader . length === MAX_PACKET_LENGTH ) {
424
+ this . _longPacketBuffers . push ( this . _buffer . slice ( this . _packetOffset , this . _packetEnd ) ) ;
425
+ this . _advanceToNextPacket ( ) ;
426
+ return ;
427
+ }
428
+
429
+ this . _combineLongPacketBuffers ( ) ;
430
+
431
+ var hadException = true ;
432
+ try {
433
+ this . _onPacket ( packetHeader ) ;
434
+ hadException = false ;
435
+ } catch ( err ) {
436
+ if ( ! err || typeof err . code !== 'string' || err . code . substr ( 0 , 7 ) !== 'PARSER_' ) {
437
+ throw err ; // Rethrow non-MySQL errors
438
+ }
439
+
440
+ // Pass down parser errors
441
+ this . _onError ( err ) ;
442
+ hadException = false ;
443
+ } finally {
444
+ this . _advanceToNextPacket ( ) ;
445
+
446
+ // If there was an exception, the parser while loop will be broken out
447
+ // of after the finally block. So schedule a blank write to re-enter it
448
+ // to continue parsing any bytes that may already have been received.
449
+ if ( hadException ) {
450
+ process . nextTick ( this . write . bind ( this ) ) ;
451
+ }
452
+ }
453
+ } ;
454
+
455
+ Parser . prototype . _tryReadPacketHeader = function _tryReadPacketHeader ( ) {
456
+ if ( this . _packetHeader ) {
457
+ return this . _packetHeader ;
458
+ }
459
+
460
+ if ( ! this . _combineNextBuffers ( PACKET_HEADER_LENGTH ) ) {
461
+ return null ;
462
+ }
463
+
464
+ this . _packetHeader = new PacketHeader (
465
+ this . parseUnsignedNumber ( 3 ) ,
466
+ this . parseUnsignedNumber ( 1 )
467
+ ) ;
468
+
469
+ if ( this . _packetHeader . number !== this . _nextPacketNumber ) {
470
+ var err = new Error (
471
+ 'Packets out of order. Got: ' + this . _packetHeader . number + ' ' +
472
+ 'Expected: ' + this . _nextPacketNumber
473
+ ) ;
474
+
475
+ err . code = 'PROTOCOL_PACKETS_OUT_OF_ORDER' ;
476
+ err . fatal = true ;
477
+
478
+ this . _onError ( err ) ;
479
+ }
480
+
481
+ this . incrementPacketNumber ( ) ;
482
+
483
+ return this . _packetHeader ;
484
+ } ;
485
+
471
486
Parser . prototype . _advanceToNextPacket = function ( ) {
472
487
this . _offset = this . _packetEnd ;
473
488
this . _packetHeader = null ;
0 commit comments