From 8e99d2a345ae94426a502d05aa5d57b966f6bc78 Mon Sep 17 00:00:00 2001 From: guest271314 Date: Sat, 3 Jun 2023 16:53:17 -0700 Subject: [PATCH] Fixes https://github.com/simov/native-messaging/issues/10 - Set message value length once - Store accrued message length read - Reset dynamic variables after sending accrued read message to client --- protocol.js | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/protocol.js b/protocol.js index 91662a3..50b7be9 100644 --- a/protocol.js +++ b/protocol.js @@ -1,25 +1,10 @@ - module.exports = (handleMessage) => { - process.stdin.on('readable', () => { - var input = [] - var chunk - while (chunk = process.stdin.read()) { - input.push(chunk) - } - input = Buffer.concat(input) - - var msgLen = input.readUInt32LE(0) - var dataLen = msgLen + 4 - - if (input.length >= dataLen) { - var content = input.slice(4, dataLen) - var json = JSON.parse(content.toString()) - handleMessage(json) - } - }) + var msgLen = 0, + dataLen = 0, + input = [] - function sendMessage (msg) { + function sendMessage(msg) { var buffer = Buffer.from(JSON.stringify(msg)) var header = Buffer.alloc(4) @@ -29,10 +14,34 @@ module.exports = (handleMessage) => { process.stdout.write(data) } + process.stdin.on('readable', () => { + var chunk + while (chunk = process.stdin.read()) { + // Set message value length once + if (msgLen === 0 && dataLen === 0) { + msgLen = chunk.readUInt32LE(0) + chunk = chunk.subarray(4) + } + // Store accrued message length read + dataLen += chunk.length + input.push(chunk) + if (dataLen === msgLen) { + // Send accrued message from client back to client + handleMessage(JSON.parse(Buffer.concat(input).toString())) + // Reset dynamic variables after sending accrued read message to client + msgLen = 0, + dataLen = 0, + input = [] + } + } + }) + process.on('uncaughtException', (err) => { - sendMessage({error: err.toString()}) + sendMessage({ + error: err.toString() + }) }) return sendMessage - + }