1
- var BIT_16 = Math . pow ( 2 , 16 ) ;
2
- var BIT_24 = Math . pow ( 2 , 24 ) ;
1
+ var BIT_16 = Math . pow ( 2 , 16 ) ;
2
+ var BIT_24 = Math . pow ( 2 , 24 ) ;
3
+ var BUFFER_ALLOC_SIZE = Math . pow ( 2 , 8 ) ;
3
4
// The maximum precision JS Numbers can hold precisely
4
5
// Don't panic: Good enough to represent byte values up to 8192 TB
5
6
var IEEE_754_BINARY_64_PRECISION = Math . pow ( 2 , 53 ) ;
6
7
var MAX_PACKET_LENGTH = Math . pow ( 2 , 24 ) - 1 ;
7
8
8
9
module . exports = PacketWriter ;
9
10
function PacketWriter ( ) {
10
- this . _buffer = new Buffer ( 0 ) ;
11
+ this . _buffer = null ;
11
12
this . _offset = 0 ;
12
13
}
13
14
14
- PacketWriter . prototype . toBuffer = function ( parser ) {
15
- var packets = Math . floor ( this . _buffer . length / MAX_PACKET_LENGTH ) + 1 ;
16
- var buffer = this . _buffer ;
17
- this . _buffer = new Buffer ( this . _buffer . length + packets * 4 ) ;
15
+ PacketWriter . prototype . toBuffer = function toBuffer ( parser ) {
16
+ if ( ! this . _buffer ) {
17
+ this . _buffer = new Buffer ( 0 ) ;
18
+ this . _offset = 0 ;
19
+ }
18
20
19
- for ( var packet = 0 ; packet < packets ; packet ++ ) {
20
- this . _offset = packet * ( MAX_PACKET_LENGTH + 4 ) ;
21
+ var buffer = this . _buffer ;
22
+ var length = this . _offset ;
23
+ var packets = Math . floor ( length / MAX_PACKET_LENGTH ) + 1 ;
21
24
25
+ this . _buffer = new Buffer ( length + packets * 4 ) ;
26
+ this . _offset = 0 ;
27
+
28
+ for ( var packet = 0 ; packet < packets ; packet ++ ) {
22
29
var isLast = ( packet + 1 === packets ) ;
23
30
var packetLength = ( isLast )
24
- ? buffer . length % MAX_PACKET_LENGTH
31
+ ? length % MAX_PACKET_LENGTH
25
32
: MAX_PACKET_LENGTH ;
26
33
27
34
var packetNumber = parser . incrementPacketNumber ( ) ;
@@ -179,9 +186,10 @@ PacketWriter.prototype.writeLengthCodedString = function(value) {
179
186
this . _offset += bytes ;
180
187
} ;
181
188
182
- PacketWriter . prototype . _allocate = function ( bytes ) {
189
+ PacketWriter . prototype . _allocate = function _allocate ( bytes ) {
183
190
if ( ! this . _buffer ) {
184
- this . _buffer = new Buffer ( bytes ) ;
191
+ this . _buffer = new Buffer ( BUFFER_ALLOC_SIZE ) ;
192
+ this . _offset = 0 ;
185
193
return ;
186
194
}
187
195
@@ -190,8 +198,9 @@ PacketWriter.prototype._allocate = function(bytes) {
190
198
return ;
191
199
}
192
200
201
+ var newSize = this . _buffer . length + Math . max ( BUFFER_ALLOC_SIZE , bytes ) ;
193
202
var oldBuffer = this . _buffer ;
194
203
195
- this . _buffer = new Buffer ( oldBuffer . length + bytes ) ;
204
+ this . _buffer = new Buffer ( newSize ) ;
196
205
oldBuffer . copy ( this . _buffer ) ;
197
206
} ;
0 commit comments