You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.5 KiB

let bufferedData = '';
const findValidJSONStrings = (inputStr: string) => {
const validJSONStrings = [];
let startIndex = 0;
while (startIndex < inputStr.length) {
const openingBraceIndex = inputStr.indexOf('{', startIndex);
if (openingBraceIndex === -1) break; // No more opening braces
let closingBraceIndex = openingBraceIndex;
let braceCount = 0;
// find couple of braces
while (closingBraceIndex < inputStr.length) {
if (inputStr[closingBraceIndex] === '{') {
braceCount++;
} else if (inputStr[closingBraceIndex] === '}') {
braceCount--;
}
if (braceCount === 0) {
break;
}
closingBraceIndex++;
}
if (braceCount !== 0) {
// no matching closing brace
break;
}
const jsonString = inputStr.substring(
openingBraceIndex,
closingBraceIndex + 1
);
try {
const parsedData = JSON.parse(jsonString);
validJSONStrings.push(parsedData);
startIndex = closingBraceIndex + 1;
} catch (error) {
// mabye invalid JSON
break;
}
}
return {
parsedJSON: validJSONStrings,
remainingData: inputStr.slice(startIndex) // it is the not parsed data
};
};
// Web Worker
self.onmessage = function (event) {
bufferedData += event.data;
const { parsedJSON, remainingData } = findValidJSONStrings(bufferedData);
if (parsedJSON.length > 0) {
postMessage(parsedJSON);
}
// save the remaining data for the next message
bufferedData = remainingData;
};