IGNITE-9382: Fix Node.js client o process large payloads. - Fixes #4629.
Signed-off-by: shroman <rshtykh@yahoo.com>
diff --git a/lib/internal/ClientSocket.js b/lib/internal/ClientSocket.js
index 1d1a4dd..73e11f0 100644
--- a/lib/internal/ClientSocket.js
+++ b/lib/internal/ClientSocket.js
@@ -110,6 +110,8 @@
this._onSocketDisconnect = onSocketDisconnect;
this._error = null;
this._wasConnected = false;
+ this._buffer = null;
+ this._offset = 0;
}
async connect() {
@@ -198,28 +200,43 @@
if (this._state === STATE.DISCONNECTED) {
return;
}
- let offset = 0;
- while (offset < message.length) {
- let buffer = MessageBuffer.from(message, offset);
+ if (this._buffer) {
+ this._buffer.concat(message);
+ this._buffer.position = this._offset;
+ }
+ else {
+ this._buffer = MessageBuffer.from(message, 0);
+ }
+ while (this._buffer && this._offset < this._buffer.length) {
// Response length
- const length = buffer.readInteger();
- offset += length + BinaryUtils.getSize(BinaryUtils.TYPE_CODE.INTEGER);
+ const length = this._buffer.readInteger() + BinaryUtils.getSize(BinaryUtils.TYPE_CODE.INTEGER);
+ if (this._buffer.length < this._offset + length) {
+ break;
+ }
+ this._offset += length;
+
let requestId, isSuccess;
const isHandshake = this._state === STATE.HANDSHAKE;
if (isHandshake) {
// Handshake status
- isSuccess = (buffer.readByte() === HANDSHAKE_SUCCESS_STATUS_CODE)
+ isSuccess = (this._buffer.readByte() === HANDSHAKE_SUCCESS_STATUS_CODE);
requestId = this._handshakeRequestId.toString();
}
else {
// Request id
- requestId = buffer.readLong().toString();
+ requestId = this._buffer.readLong().toString();
// Status code
- isSuccess = (buffer.readInteger() === REQUEST_SUCCESS_STATUS_CODE);
+ isSuccess = (this._buffer.readInteger() === REQUEST_SUCCESS_STATUS_CODE);
}
- this._logMessage(requestId, false, buffer.data);
+ this._logMessage(requestId, false, this._buffer.data);
+
+ const buffer = this._buffer;
+ if (this._offset === this._buffer.length) {
+ this._buffer = null;
+ this._offset = 0;
+ }
if (this._requests.has(requestId)) {
const request = this._requests.get(requestId);
diff --git a/lib/internal/MessageBuffer.js b/lib/internal/MessageBuffer.js
index f1407bf..dc3e928 100644
--- a/lib/internal/MessageBuffer.js
+++ b/lib/internal/MessageBuffer.js
@@ -42,6 +42,12 @@
return buf;
}
+ concat(source) {
+ this._buffer = Buffer.concat([this._buffer, source]);
+ this._length = this._buffer.length;
+ this._capacity = this._length;
+ }
+
get position() {
return this._position;
}