Skip to content

Commit bc53935

Browse files
committed
lint: reduce complexity of parser write method
1 parent 37fbbdd commit bc53935

File tree

1 file changed

+80
-65
lines changed

1 file changed

+80
-65
lines changed

lib/protocol/Parser.js

Lines changed: 80 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
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;
79

810
module.exports = Parser;
911
function Parser(options) {
@@ -28,71 +30,17 @@ Parser.prototype.write = function write(chunk) {
2830
this._nextBuffers.push(chunk);
2931

3032
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();
4934

50-
this._onError(err);
51-
}
52-
53-
this.incrementPacketNumber();
54-
}
55-
56-
if (!this._combineNextBuffers(this._packetHeader.length)) {
35+
if (!packetHeader) {
5736
break;
5837
}
5938

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;
6841
}
6942

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);
9644
}
9745
};
9846

@@ -468,6 +416,73 @@ Parser.prototype._combineLongPacketBuffers = function _combineLongPacketBuffers(
468416
this._packetOffset = 0;
469417
};
470418

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+
471486
Parser.prototype._advanceToNextPacket = function() {
472487
this._offset = this._packetEnd;
473488
this._packetHeader = null;

0 commit comments

Comments
 (0)