export interface ParseJSONResult { parsedObjects: Array remainingBuffer: Buffer } export function tryParseJSON(buffer: Buffer): ParseJSONResult { const parsedObjects: Array = [] let braceCount = 0 let inString = false let escaped = false let objectStart = -1 for (let i = 0; i < buffer.length; i++) { const ch = buffer[i] if (inString) { if (escaped) { escaped = false // backslash '\' } else if (ch === 0x5c) { escaped = true // double quote '"' } else if (ch === 0x22) { inString = false } // double quote '"' } else if (ch === 0x22) { inString = true // opening brace '{' } else if (ch === 0x7b) { if (braceCount === 0) { objectStart = i } braceCount++ // closing brace '}' } else if (ch === 0x7d) { braceCount-- if (braceCount === 0 && objectStart !== -1) { // full object from objectStart..i parsedObjects.push(JSON.parse(buffer.subarray(objectStart, i + 1).toString('utf-8')) as T) objectStart = -1 } } } // any leftover (partial) object const remainingBuffer = objectStart >= 0 ? buffer.subarray(objectStart) : Buffer.alloc(0) return { parsedObjects, remainingBuffer } }