perf: improve message parser

This commit is contained in:
Carlos Marques 2026-04-27 03:12:47 -07:00 committed by Overtorment
parent d9f511d97f
commit 83420b861b

View File

@ -9,26 +9,6 @@ const makeRequest = (exports.makeRequest = (method, params, id) => {
});
});
const createRecuesiveParser = (exports.createRecuesiveParser = (max_depth, delimiter) => {
const MAX_DEPTH = max_depth;
const DELIMITER = delimiter;
const recursiveParser = (n, buffer, callback) => {
if (buffer.length === 0) {
return { code: 0, buffer: buffer };
}
if (n > MAX_DEPTH) {
return { code: 1, buffer: buffer };
}
const xs = buffer.split(DELIMITER);
if (xs.length === 1) {
return { code: 0, buffer: buffer };
}
callback(xs.shift(), n);
return recursiveParser(n + 1, xs.join(DELIMITER), callback);
};
return recursiveParser;
});
const createPromiseResult = (exports.createPromiseResult = (resolve, reject) => {
return (err, result) => {
if (err) reject(err);
@ -51,18 +31,30 @@ const createPromiseResultBatch = (exports.createPromiseResultBatch = (resolve, r
class MessageParser {
constructor(callback) {
this.buffer = '';
this.parts = [];
this.partsLen = 0;
this.callback = callback;
this.recursiveParser = createRecuesiveParser(20, '\n');
}
run(chunk) {
this.buffer += chunk;
let s = chunk;
if (this.partsLen > 0) {
this.parts.push(chunk);
s = this.parts.join('');
this.parts = [];
this.partsLen = 0;
}
let start = 0;
let n = 0;
while (true) {
const res = this.recursiveParser(0, this.buffer, this.callback);
this.buffer = res.buffer;
if (res.code === 0) {
break;
}
const idx = s.indexOf('\n', start);
if (idx === -1) break;
this.callback(s.slice(start, idx), n++);
start = idx + 1;
}
if (start < s.length) {
const tail = start === 0 ? s : s.slice(start);
this.parts.push(tail);
this.partsLen += tail.length;
}
}
}