fix: parse report.jsonl without creating large string (#28366)

Reference https://github.com/microsoft/playwright/issues/28362
This commit is contained in:
Yury Semikhatsky 2023-11-28 08:47:44 -08:00 committed by GitHub
parent 022b36332d
commit 2e762fd3d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -81,19 +81,37 @@ const commonEvents = new Set(commonEventNames);
const commonEventRegex = new RegExp(`${commonEventNames.join('|')}`);
function parseCommonEvents(reportJsonl: Buffer): JsonEvent[] {
return reportJsonl.toString().split('\n')
return splitBufferLines(reportJsonl)
.map(line => line.toString('utf8'))
.filter(line => commonEventRegex.test(line)) // quick filter
.map(line => JSON.parse(line) as JsonEvent)
.filter(event => commonEvents.has(event.method));
}
function parseTestEvents(reportJsonl: Buffer): JsonEvent[] {
return reportJsonl.toString().split('\n')
return splitBufferLines(reportJsonl)
.map(line => line.toString('utf8'))
.filter(line => line.length)
.map(line => JSON.parse(line) as JsonEvent)
.filter(event => !commonEvents.has(event.method));
}
function splitBufferLines(buffer: Buffer) {
const lines = [];
let start = 0;
while (start < buffer.length) {
// 0x0A is the byte for '\n'
const end = buffer.indexOf(0x0A, start);
if (end === -1) {
lines.push(buffer.slice(start));
break;
}
lines.push(buffer.slice(start, end));
start = end + 1;
}
return lines;
}
async function extractAndParseReports(dir: string, shardFiles: string[], internalizer: JsonStringInternalizer, printStatus: StatusCallback) {
const shardEvents: { file: string, localPath: string, metadata: BlobReportMetadata, parsedEvents: JsonEvent[] }[] = [];
await fs.promises.mkdir(path.join(dir, 'resources'), { recursive: true });