@@ -75,6 +75,8 @@ export type MessageCallback = (msg: BackendMessage) => void
75
75
76
76
export class Parser {
77
77
private remainingBuffer : Buffer = emptyBuffer
78
+ private remainingBufferLength : number = 0
79
+ private remainingBufferOffset : number = 0
78
80
private reader = new BufferReader ( )
79
81
private mode : Mode
80
82
@@ -87,13 +89,33 @@ export class Parser {
87
89
88
90
public parse ( buffer : Buffer , callback : MessageCallback ) {
89
91
let combinedBuffer = buffer
90
- if ( this . remainingBuffer . byteLength ) {
91
- combinedBuffer = Buffer . allocUnsafe ( this . remainingBuffer . byteLength + buffer . byteLength )
92
- this . remainingBuffer . copy ( combinedBuffer )
93
- buffer . copy ( combinedBuffer , this . remainingBuffer . byteLength )
92
+ let combinedBufferOffset = 0
93
+ let combinedBufferLength = buffer . byteLength
94
+ const newRealLength = this . remainingBufferLength + combinedBufferLength
95
+ if ( this . remainingBufferLength ) {
96
+ const newLength = newRealLength + this . remainingBufferOffset
97
+ if ( newLength > this . remainingBuffer . byteLength ) {
98
+ let newBufferLength = this . remainingBufferLength * 2
99
+ while ( newRealLength >= newBufferLength ) {
100
+ newBufferLength *= 2
101
+ }
102
+ const newBuffer = Buffer . allocUnsafe ( newBufferLength )
103
+ this . remainingBuffer . copy (
104
+ newBuffer ,
105
+ 0 ,
106
+ this . remainingBufferOffset ,
107
+ this . remainingBufferOffset + this . remainingBufferLength
108
+ )
109
+ this . remainingBuffer = newBuffer
110
+ this . remainingBufferOffset = 0
111
+ }
112
+ buffer . copy ( this . remainingBuffer , this . remainingBufferOffset + this . remainingBufferLength )
113
+ combinedBuffer = this . remainingBuffer
114
+ combinedBufferLength = newRealLength
115
+ combinedBufferOffset = this . remainingBufferOffset
94
116
}
95
- let offset = 0
96
- while ( offset + HEADER_LENGTH <= combinedBuffer . byteLength ) {
117
+ let offset = combinedBufferOffset
118
+ while ( offset + HEADER_LENGTH <= combinedBufferLength ) {
97
119
// code is 1 byte long - it identifies the message type
98
120
const code = combinedBuffer [ offset ]
99
121
@@ -102,7 +124,7 @@ export class Parser {
102
124
103
125
const fullMessageLength = CODE_LENGTH + length
104
126
105
- if ( fullMessageLength + offset <= combinedBuffer . byteLength ) {
127
+ if ( fullMessageLength + offset <= combinedBufferLength ) {
106
128
const message = this . handlePacket ( offset + HEADER_LENGTH , code , length , combinedBuffer )
107
129
callback ( message )
108
130
offset += fullMessageLength
@@ -111,10 +133,14 @@ export class Parser {
111
133
}
112
134
}
113
135
114
- if ( offset === combinedBuffer . byteLength ) {
136
+ if ( offset === combinedBufferLength ) {
115
137
this . remainingBuffer = emptyBuffer
138
+ this . remainingBufferLength = 0
139
+ this . remainingBufferOffset = 0
116
140
} else {
117
- this . remainingBuffer = combinedBuffer . slice ( offset )
141
+ this . remainingBuffer = combinedBuffer
142
+ this . remainingBufferLength = combinedBufferLength - offset
143
+ this . remainingBufferOffset += offset
118
144
}
119
145
}
120
146
0 commit comments