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
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;
|
|
};
|