From 2e762fd3d20ee41ec0a5b4c338af6d4d241680d1 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 28 Nov 2023 08:47:44 -0800 Subject: [PATCH] fix: parse report.jsonl without creating large string (#28366) Reference https://github.com/microsoft/playwright/issues/28362 --- packages/playwright/src/reporters/merge.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/playwright/src/reporters/merge.ts b/packages/playwright/src/reporters/merge.ts index f2e4ec8eda..442e55f26d 100644 --- a/packages/playwright/src/reporters/merge.ts +++ b/packages/playwright/src/reporters/merge.ts @@ -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 });