From 2b915ddcd7e600d13f6df71712932f5aeb094101 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Tue, 23 Jun 2026 01:52:02 +0800 Subject: [PATCH] fix(workbench): enrich api resource timing at rum flush (#1935) --- .../src/utils/workbench-performance.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/web/hwlab-cloud-web/src/utils/workbench-performance.ts b/web/hwlab-cloud-web/src/utils/workbench-performance.ts index fecf44dd..b699c73e 100644 --- a/web/hwlab-cloud-web/src/utils/workbench-performance.ts +++ b/web/hwlab-cloud-web/src/utils/workbench-performance.ts @@ -528,7 +528,7 @@ function flushWorkbenchPerformance(useBeacon: boolean): void { flushTimer = null; } if (!queue.length || typeof window === "undefined") return; - const events = queue.splice(0, queue.length); + const events = queue.splice(0, queue.length).map(enrichWorkbenchEventForFlush); const body = JSON.stringify({ schemaVersion: SCHEMA_VERSION, serviceId: "hwlab-cloud-web", page: pageRoute(), events }); if (useBeacon && navigator.sendBeacon) { navigator.sendBeacon("/v1/web-performance", new Blob([body], { type: "application/json" })); @@ -537,6 +537,15 @@ function flushWorkbenchPerformance(useBeacon: boolean): void { void fetch("/v1/web-performance", { method: "POST", headers: { "content-type": "application/json" }, body, credentials: "same-origin", keepalive: true }).catch(() => undefined); } +function enrichWorkbenchEventForFlush(event: WorkbenchPerformanceEvent): WorkbenchPerformanceEvent { + if (event.kind !== "workbench_ui_event" || event.eventType !== "api_request") return event; + if (event.resourceDurationMs !== undefined) return event; + const route = safeText(event.route); + if (!route || !Number.isFinite(event.startedAtEpochMs) || !Number.isFinite(event.endedAtEpochMs)) return event; + const timing = resourceTimingForApiRequest(route, Number(event.startedAtEpochMs), Number(event.endedAtEpochMs)); + return Object.keys(timing).length > 0 ? { ...event, ...timing } : event; +} + function ensureInstalled(): void { if (installed || typeof document === "undefined") return; installed = true;