11import { Transform , TransformCallback , TransformOptions } from 'stream' ;
2- import { Mode , bindComplete , parseComplete , closeComplete , noData , portalSuspended , copyDone , replicationStart , emptyQuery , ReadyForQueryMessage , CommandCompleteMessage , CopyDataMessage , CopyResponse , NotificationResponseMessage , RowDescriptionMessage , Field , DataRowMessage , ParameterStatusMessage , BackendKeyDataMessage , DatabaseError , BackendMessage } from './messages' ;
2+ import { Mode , bindComplete , parseComplete , closeComplete , noData , portalSuspended , copyDone , replicationStart , emptyQuery , ReadyForQueryMessage , CommandCompleteMessage , CopyDataMessage , CopyResponse , NotificationResponseMessage , RowDescriptionMessage , Field , DataRowMessage , ParameterStatusMessage , BackendKeyDataMessage , DatabaseError , BackendMessage , MessageName , AuthenticationMD5Password } from './messages' ;
33import { BufferReader } from './BufferReader' ;
44import assert from 'assert'
55
@@ -63,7 +63,12 @@ export class PgPacketStream extends Transform {
6363 }
6464
6565 public _transform ( buffer : Buffer , encoding : string , callback : TransformCallback ) {
66- const combinedBuffer : Buffer = this . remainingBuffer . byteLength ? Buffer . concat ( [ this . remainingBuffer , buffer ] , this . remainingBuffer . length + buffer . length ) : buffer ;
66+ let combinedBuffer = buffer ;
67+ if ( this . remainingBuffer . byteLength ) {
68+ combinedBuffer = Buffer . allocUnsafe ( this . remainingBuffer . byteLength + buffer . byteLength ) ;
69+ this . remainingBuffer . copy ( combinedBuffer )
70+ buffer . copy ( combinedBuffer , this . remainingBuffer . byteLength )
71+ }
6772 let offset = 0 ;
6873 while ( ( offset + HEADER_LENGTH ) <= combinedBuffer . byteLength ) {
6974 // code is 1 byte long - it identifies the message type
@@ -125,9 +130,9 @@ export class PgPacketStream extends Transform {
125130 case MessageCodes . BackendKeyData :
126131 return this . parseBackendKeyData ( offset , length , bytes ) ;
127132 case MessageCodes . ErrorMessage :
128- return this . parseErrorMessage ( offset , length , bytes , ' error' ) ;
133+ return this . parseErrorMessage ( offset , length , bytes , MessageName . error ) ;
129134 case MessageCodes . NoticeMessage :
130- return this . parseErrorMessage ( offset , length , bytes , ' notice' ) ;
135+ return this . parseErrorMessage ( offset , length , bytes , MessageName . notice ) ;
131136 case MessageCodes . RowDescriptionMessage :
132137 return this . parseRowDescriptionMessage ( offset , length , bytes ) ;
133138 case MessageCodes . CopyIn :
@@ -142,7 +147,7 @@ export class PgPacketStream extends Transform {
142147 }
143148
144149 public _flush ( callback : TransformCallback ) {
145- this . _transform ( Buffer . alloc ( 0 ) , 'utf-i ' , callback )
150+ this . _transform ( Buffer . alloc ( 0 ) , 'utf-8 ' , callback )
146151 }
147152
148153 private parseReadyForQueryMessage ( offset : number , length : number , bytes : Buffer ) {
@@ -163,14 +168,14 @@ export class PgPacketStream extends Transform {
163168 }
164169
165170 private parseCopyInMessage ( offset : number , length : number , bytes : Buffer ) {
166- return this . parseCopyMessage ( offset , length , bytes , ' copyInResponse' )
171+ return this . parseCopyMessage ( offset , length , bytes , MessageName . copyInResponse )
167172 }
168173
169174 private parseCopyOutMessage ( offset : number , length : number , bytes : Buffer ) {
170- return this . parseCopyMessage ( offset , length , bytes , ' copyOutResponse' )
175+ return this . parseCopyMessage ( offset , length , bytes , MessageName . copyOutResponse )
171176 }
172177
173- private parseCopyMessage ( offset : number , length : number , bytes : Buffer , messageName : string ) {
178+ private parseCopyMessage ( offset : number , length : number , bytes : Buffer , messageName : MessageName ) {
174179 this . reader . setBuffer ( offset , bytes ) ;
175180 const isBinary = this . reader . byte ( ) !== 0 ;
176181 const columnCount = this . reader . int16 ( )
@@ -244,8 +249,8 @@ export class PgPacketStream extends Transform {
244249 this . reader . setBuffer ( offset , bytes ) ;
245250 const code = this . reader . int32 ( )
246251 // TODO(bmc): maybe better types here
247- const message : any = {
248- name : ' authenticationOk' ,
252+ const message : BackendMessage & any = {
253+ name : MessageName . authenticationOk ,
249254 length,
250255 } ;
251256
@@ -254,17 +259,18 @@ export class PgPacketStream extends Transform {
254259 break ;
255260 case 3 : // AuthenticationCleartextPassword
256261 if ( message . length === 8 ) {
257- message . name = ' authenticationCleartextPassword'
262+ message . name = MessageName . authenticationCleartextPassword
258263 }
259264 break
260265 case 5 : // AuthenticationMD5Password
261266 if ( message . length === 12 ) {
262- message . name = 'authenticationMD5Password'
263- message . salt = this . reader . bytes ( 4 ) ;
267+ message . name = MessageName . authenticationMD5Password
268+ const salt = this . reader . bytes ( 4 ) ;
269+ return new AuthenticationMD5Password ( length , salt ) ;
264270 }
265271 break
266272 case 10 : // AuthenticationSASL
267- message . name = ' authenticationSASL'
273+ message . name = MessageName . authenticationSASL
268274 message . mechanisms = [ ]
269275 let mechanism : string ;
270276 do {
@@ -276,11 +282,11 @@ export class PgPacketStream extends Transform {
276282 } while ( mechanism )
277283 break ;
278284 case 11 : // AuthenticationSASLContinue
279- message . name = ' authenticationSASLContinue'
285+ message . name = MessageName . authenticationSASLContinue
280286 message . data = this . reader . string ( length - 4 )
281287 break ;
282288 case 12 : // AuthenticationSASLFinal
283- message . name = ' authenticationSASLFinal'
289+ message . name = MessageName . authenticationSASLFinal
284290 message . data = this . reader . string ( length - 4 )
285291 break ;
286292 default :
@@ -289,7 +295,7 @@ export class PgPacketStream extends Transform {
289295 return message ;
290296 }
291297
292- private parseErrorMessage ( offset : number , length : number , bytes : Buffer , name : string ) {
298+ private parseErrorMessage ( offset : number , length : number , bytes : Buffer , name : MessageName ) {
293299 this . reader . setBuffer ( offset , bytes ) ;
294300 var fields : Record < string , string > = { }
295301 var fieldType = this . reader . string ( 1 )
0 commit comments