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 ) ;
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 ) ;
4+ var COMPRESSED_PACKET_HEADER_LENGTH = 7 ;
45// The maximum precision JS Numbers can hold precisely
56// Don't panic: Good enough to represent byte values up to 8192 TB
67var IEEE_754_BINARY_64_PRECISION = Math . pow ( 2 , 53 ) ;
8+ var PACKET_HEADER_LENGTH = 4 ;
79var MAX_PACKET_LENGTH = Math . pow ( 2 , 24 ) - 1 ;
810var Buffer = require ( 'safe-buffer' ) . Buffer ;
911
@@ -22,8 +24,9 @@ PacketWriter.prototype.toBuffer = function toBuffer(parser) {
2224 var buffer = this . _buffer ;
2325 var length = this . _offset ;
2426 var packets = Math . floor ( length / MAX_PACKET_LENGTH ) + 1 ;
27+ var size = length + ( packets * PACKET_HEADER_LENGTH ) ;
2528
26- this . _buffer = Buffer . allocUnsafe ( length + packets * 4 ) ;
29+ this . _buffer = Buffer . allocUnsafe ( size ) ;
2730 this . _offset = 0 ;
2831
2932 for ( var packet = 0 ; packet < packets ; packet ++ ) {
@@ -43,6 +46,34 @@ PacketWriter.prototype.toBuffer = function toBuffer(parser) {
4346 this . writeBuffer ( buffer . slice ( start , end ) ) ;
4447 }
4548
49+ if ( parser . _compressed ) {
50+ buffer = this . _buffer ;
51+ length = this . _offset ;
52+ packets = Math . floor ( length / MAX_PACKET_LENGTH ) + 1 ;
53+ size = length + ( packets * COMPRESSED_PACKET_HEADER_LENGTH ) ;
54+
55+ this . _buffer = Buffer . allocUnsafe ( size ) ;
56+ this . _offset = 0 ;
57+
58+ for ( packet = 0 ; packet < packets ; packet ++ ) {
59+ isLast = ( packet + 1 === packets ) ;
60+ packetLength = ( isLast )
61+ ? length % MAX_PACKET_LENGTH
62+ : MAX_PACKET_LENGTH ;
63+
64+ packetNumber = parser . incrementCompressedPacketNumber ( ) ;
65+
66+ this . writeUnsignedNumber ( 3 , packetLength ) ;
67+ this . writeUnsignedNumber ( 1 , packetNumber ) ;
68+ this . writeUnsignedNumber ( 3 , 0 ) ;
69+
70+ var start = packet * MAX_PACKET_LENGTH ;
71+ var end = start + packetLength ;
72+
73+ this . writeBuffer ( buffer . slice ( start , end ) ) ;
74+ }
75+ }
76+
4677 return this . _buffer ;
4778} ;
4879
0 commit comments