From ed99d411b286220c0733de48560d6a2f3820845b Mon Sep 17 00:00:00 2001 From: Parnic Date: Mon, 10 Feb 2020 21:36:13 -0600 Subject: [PATCH] Minor optimization to set buffer size appropriately This avoids unnecessary allocations/reallocations while decoding a message by pre-sizing the buffer to the amount we know it will require. I feel like there's probably a better way to handle this, but this works for now. --- messages/SLChallengeMessage.js | 6 +++++- messages/SLChemDataMessage.js | 7 ++++++- messages/SLControllerConfigMessage.js | 7 ++++++- messages/SLGetGatewayDataMessage.js | 6 +++++- messages/SLMessage.js | 10 ++++++++-- messages/SLPoolStatusMessage.js | 7 ++++++- messages/SLSaltCellConfigMessage.js | 7 ++++++- messages/SLVersionMessage.js | 7 ++++++- 8 files changed, 48 insertions(+), 9 deletions(-) diff --git a/messages/SLChallengeMessage.js b/messages/SLChallengeMessage.js index a077fd1..220ec78 100755 --- a/messages/SLChallengeMessage.js +++ b/messages/SLChallengeMessage.js @@ -6,7 +6,11 @@ const MSG_ID = 14; exports.SLChallengeMessage = class SLChallengeMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); if (buf) { this._wroteSize = true; diff --git a/messages/SLChemDataMessage.js b/messages/SLChemDataMessage.js index c27fbaa..24024c8 100755 --- a/messages/SLChemDataMessage.js +++ b/messages/SLChemDataMessage.js @@ -6,7 +6,12 @@ const MSG_ID = 12592; exports.SLChemDataMessage = class SLChemDataMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); + if (!buf) { this.writeInt32LE(0); // controller index } else { diff --git a/messages/SLControllerConfigMessage.js b/messages/SLControllerConfigMessage.js index e09d66a..8051c25 100755 --- a/messages/SLControllerConfigMessage.js +++ b/messages/SLControllerConfigMessage.js @@ -6,7 +6,12 @@ const MSG_ID = 12532; exports.SLControllerConfigMessage = class SLControllerConfigMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); + if (!buf) { this.writeInt32LE(0); this.writeInt32LE(0); diff --git a/messages/SLGetGatewayDataMessage.js b/messages/SLGetGatewayDataMessage.js index 4d7f8cc..7d31294 100644 --- a/messages/SLGetGatewayDataMessage.js +++ b/messages/SLGetGatewayDataMessage.js @@ -6,7 +6,11 @@ const MSG_ID = 18003; exports.SLGetGatewayDataMessage = class SLGetGatewayDataMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); if (typeof buf === 'string') { this.writeSLString(buf); diff --git a/messages/SLMessage.js b/messages/SLMessage.js index f5bd9ea..5d0f413 100644 --- a/messages/SLMessage.js +++ b/messages/SLMessage.js @@ -3,8 +3,14 @@ const SmartBuffer = require('smart-buffer').SmartBuffer; exports.SLMessage = class SLMessage extends SmartBuffer { - constructor(senderId, messageId) { - super(); + constructor(senderId, messageId, size) { + var options; + if (size) { + options = { + size: size, + }; + } + super(options); if (typeof senderId === 'number' || typeof senderId === 'undefined') { this.writeUInt16LE(senderId || 0); diff --git a/messages/SLPoolStatusMessage.js b/messages/SLPoolStatusMessage.js index c1032a8..58c7fd7 100755 --- a/messages/SLPoolStatusMessage.js +++ b/messages/SLPoolStatusMessage.js @@ -9,7 +9,12 @@ const POOL_CIRCUIT_ID = 505; exports.SLPoolStatusMessage = class SLPoolStatusMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); + if (!buf) { this.writeInt32LE(0); } else { diff --git a/messages/SLSaltCellConfigMessage.js b/messages/SLSaltCellConfigMessage.js index c759777..3285927 100755 --- a/messages/SLSaltCellConfigMessage.js +++ b/messages/SLSaltCellConfigMessage.js @@ -6,7 +6,12 @@ const MSG_ID = 12572; exports.SLSaltCellConfigMessage = class SLSaltCellConfigMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); + if (!buf) { this.writeInt32LE(0); // controller index } else { diff --git a/messages/SLVersionMessage.js b/messages/SLVersionMessage.js index 2aaba84..eca449e 100755 --- a/messages/SLVersionMessage.js +++ b/messages/SLVersionMessage.js @@ -6,7 +6,12 @@ const MSG_ID = 8120; exports.SLVersionMessage = class SLVersionMessage extends SLMessage { constructor(buf) { - super(0, MSG_ID); + var size; + if (buf) { + size = buf.readInt32LE(4) + 8; + } + super(0, MSG_ID, size); + if (buf) { this._wroteSize = true; this.writeBuffer(buf, 0);