1
1
import { 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' ;
3
3
import { BufferReader } from './BufferReader' ;
4
4
import assert from 'assert'
5
5
@@ -63,7 +63,12 @@ export class PgPacketStream extends Transform {
63
63
}
64
64
65
65
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
+ }
67
72
let offset = 0 ;
68
73
while ( ( offset + HEADER_LENGTH ) <= combinedBuffer . byteLength ) {
69
74
// code is 1 byte long - it identifies the message type
@@ -125,9 +130,9 @@ export class PgPacketStream extends Transform {
125
130
case MessageCodes . BackendKeyData :
126
131
return this . parseBackendKeyData ( offset , length , bytes ) ;
127
132
case MessageCodes . ErrorMessage :
128
- return this . parseErrorMessage ( offset , length , bytes , ' error' ) ;
133
+ return this . parseErrorMessage ( offset , length , bytes , MessageName . error ) ;
129
134
case MessageCodes . NoticeMessage :
130
- return this . parseErrorMessage ( offset , length , bytes , ' notice' ) ;
135
+ return this . parseErrorMessage ( offset , length , bytes , MessageName . notice ) ;
131
136
case MessageCodes . RowDescriptionMessage :
132
137
return this . parseRowDescriptionMessage ( offset , length , bytes ) ;
133
138
case MessageCodes . CopyIn :
@@ -142,7 +147,7 @@ export class PgPacketStream extends Transform {
142
147
}
143
148
144
149
public _flush ( callback : TransformCallback ) {
145
- this . _transform ( Buffer . alloc ( 0 ) , 'utf-i ' , callback )
150
+ this . _transform ( Buffer . alloc ( 0 ) , 'utf-8 ' , callback )
146
151
}
147
152
148
153
private parseReadyForQueryMessage ( offset : number , length : number , bytes : Buffer ) {
@@ -163,14 +168,14 @@ export class PgPacketStream extends Transform {
163
168
}
164
169
165
170
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 )
167
172
}
168
173
169
174
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 )
171
176
}
172
177
173
- private parseCopyMessage ( offset : number , length : number , bytes : Buffer , messageName : string ) {
178
+ private parseCopyMessage ( offset : number , length : number , bytes : Buffer , messageName : MessageName ) {
174
179
this . reader . setBuffer ( offset , bytes ) ;
175
180
const isBinary = this . reader . byte ( ) !== 0 ;
176
181
const columnCount = this . reader . int16 ( )
@@ -244,8 +249,8 @@ export class PgPacketStream extends Transform {
244
249
this . reader . setBuffer ( offset , bytes ) ;
245
250
const code = this . reader . int32 ( )
246
251
// TODO(bmc): maybe better types here
247
- const message : any = {
248
- name : ' authenticationOk' ,
252
+ const message : BackendMessage & any = {
253
+ name : MessageName . authenticationOk ,
249
254
length,
250
255
} ;
251
256
@@ -254,17 +259,18 @@ export class PgPacketStream extends Transform {
254
259
break ;
255
260
case 3 : // AuthenticationCleartextPassword
256
261
if ( message . length === 8 ) {
257
- message . name = ' authenticationCleartextPassword'
262
+ message . name = MessageName . authenticationCleartextPassword
258
263
}
259
264
break
260
265
case 5 : // AuthenticationMD5Password
261
266
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 ) ;
264
270
}
265
271
break
266
272
case 10 : // AuthenticationSASL
267
- message . name = ' authenticationSASL'
273
+ message . name = MessageName . authenticationSASL
268
274
message . mechanisms = [ ]
269
275
let mechanism : string ;
270
276
do {
@@ -276,11 +282,11 @@ export class PgPacketStream extends Transform {
276
282
} while ( mechanism )
277
283
break ;
278
284
case 11 : // AuthenticationSASLContinue
279
- message . name = ' authenticationSASLContinue'
285
+ message . name = MessageName . authenticationSASLContinue
280
286
message . data = this . reader . string ( length - 4 )
281
287
break ;
282
288
case 12 : // AuthenticationSASLFinal
283
- message . name = ' authenticationSASLFinal'
289
+ message . name = MessageName . authenticationSASLFinal
284
290
message . data = this . reader . string ( length - 4 )
285
291
break ;
286
292
default :
@@ -289,7 +295,7 @@ export class PgPacketStream extends Transform {
289
295
return message ;
290
296
}
291
297
292
- private parseErrorMessage ( offset : number , length : number , bytes : Buffer , name : string ) {
298
+ private parseErrorMessage ( offset : number , length : number , bytes : Buffer , name : MessageName ) {
293
299
this . reader . setBuffer ( offset , bytes ) ;
294
300
var fields : Record < string , string > = { }
295
301
var fieldType = this . reader . string ( 1 )
0 commit comments