From 5c9a7dbb4403104e9b68dc0dcf903cbbcd599505 Mon Sep 17 00:00:00 2001 From: nuno <59452877+komen205@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:53:10 +0100 Subject: [PATCH] Order HAR exports chronologically --- src/model/http/har.ts | 16 ++++++++++------ test/unit/model/http/har.spec.ts | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 test/unit/model/http/har.spec.ts diff --git a/src/model/http/har.ts b/src/model/http/har.ts index 7e15315a..a64f8074 100644 --- a/src/model/http/har.ts +++ b/src/model/http/har.ts @@ -83,6 +83,12 @@ export interface HarEntry extends HarFormat.Entry { _pinned?: true; } +const compareHarEntryStartTimes = ( + a: Pick, + b: Pick +) => dateFns.parse(a.startedDateTime).getTime() - + dateFns.parse(b.startedDateTime).getTime(); + export interface HarWebSocketMessage { type: 'send' | 'receive'; opcode: 1 | 2; @@ -119,7 +125,9 @@ export async function generateHar( const errors = otherEvents.filter(e => e.isTlsFailure()) as FailedTlsConnection[]; const sourcePages = getSourcesAsHarPages(exchanges); - const entries = await Promise.all(exchanges.map(e => generateHarHttpEntry(e, options))); + const entries = (await Promise.all( + exchanges.map(e => generateHarHttpEntry(e, options)) + )).sort(compareHarEntryStartTimes); const errorEntries = errors.map(generateHarTlsError); return { @@ -529,11 +537,7 @@ export async function parseHar(harContents: unknown): Promise { const pinnedIds: string[] = [] har.log.entries - .sort((a, b) => { - const aStartTime = dateFns.parse(a.startedDateTime).getTime(); - const bStartTime = dateFns.parse(b.startedDateTime).getTime(); - return aStartTime - bStartTime; - }) + .sort(compareHarEntryStartTimes) .forEach((entry, i) => { const id = baseId + i; const isWebSocket = entry._resourceType === 'websocket'; diff --git a/test/unit/model/http/har.spec.ts b/test/unit/model/http/har.spec.ts new file mode 100644 index 00000000..aba237ea --- /dev/null +++ b/test/unit/model/http/har.spec.ts @@ -0,0 +1,19 @@ +import { expect } from '../../../test-setup'; + +import { generateHar } from '../../../../src/model/http/har'; +import { getExchangeData } from '../../unit-test-helpers'; + +describe('HAR generation', () => { + it('orders entries chronologically regardless of selection order', async () => { + const olderExchange = getExchangeData({ statusCode: 403 }); + olderExchange.timingEvents.startTime = Date.parse('2026-07-17T20:35:23.997+01:00'); + + const newerExchange = getExchangeData({ statusCode: 200 }); + newerExchange.timingEvents.startTime = Date.parse('2026-07-17T20:36:12.733+01:00'); + + const har = await generateHar([newerExchange, olderExchange]); + + expect(har.log.entries.map(entry => entry.response.status)) + .to.deep.equal([403, 200]); + }); +});