From 115b5ff89b0921e874cab60a33bad2cf2743e4e9 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 14 Nov 2024 10:37:25 +0100 Subject: [PATCH] init in loadTrace --- packages/trace-viewer/src/sw/main.ts | 38 ++++++++++++---------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/packages/trace-viewer/src/sw/main.ts b/packages/trace-viewer/src/sw/main.ts index acc3f1ecfd..d977b0d7b7 100644 --- a/packages/trace-viewer/src/sw/main.ts +++ b/packages/trace-viewer/src/sw/main.ts @@ -36,13 +36,21 @@ const scopePath = new URL(self.registration.scope).pathname; const loadedTraces = new Map(); -const clientIdToTraceUrls = new Map }>(); +const clientIdToTraceUrls = new Map, traceViewerServer: TraceViewerServer }>(); -async function loadTrace(traceUrl: string, traceFileName: string | null, clientId: string, traceViewerServer: TraceViewerServer, limit: number | undefined, progress: (done: number, total: number) => undefined): Promise { +async function loadTrace(traceUrl: string, traceFileName: string | null, client: any | undefined, limit: number | undefined, progress: (done: number, total: number) => undefined): Promise { await gc(); + const clientId = client?.id ?? ''; let data = clientIdToTraceUrls.get(clientId); if (!data) { - data = { limit, traceUrls: new Set() }; + let traceViewerServerBaseUrl = self.registration.scope; + if (client?.url) { + const clientUrl = new URL(client.url); + if (clientUrl.searchParams.has('server')) + traceViewerServerBaseUrl = clientUrl.searchParams.get('server')!; + } + + data = { limit, traceUrls: new Set(), traceViewerServer: new TraceViewerServer(traceViewerServerBaseUrl) }; clientIdToTraceUrls.set(clientId, data); } data.traceUrls.add(traceUrl); @@ -51,7 +59,7 @@ async function loadTrace(traceUrl: string, traceFileName: string | null, clientI try { // Allow 10% to hop from sw to page. const [fetchProgress, unzipProgress] = splitProgress(progress, [0.5, 0.4, 0.1]); - const backend = traceUrl.endsWith('json') ? new FetchTraceModelBackend(traceUrl, traceViewerServer) : new ZipTraceModelBackend(traceUrl, traceViewerServer, fetchProgress); + const backend = traceUrl.endsWith('json') ? new FetchTraceModelBackend(traceUrl, data.traceViewerServer) : new ZipTraceModelBackend(traceUrl, data.traceViewerServer, fetchProgress); await traceModel.load(backend, unzipProgress); } catch (error: any) { // eslint-disable-next-line no-console @@ -69,22 +77,6 @@ async function loadTrace(traceUrl: string, traceFileName: string | null, clientI return traceModel; } -const traceViewerServers = new Map(); - -function getTraceViewerServer(client?: any): TraceViewerServer { - let traceViewerServerBaseUrl = self.registration.scope; - if (client?.url) { - const clientUrl = new URL(client.url); - if (clientUrl.searchParams.has('server')) - traceViewerServerBaseUrl = clientUrl.searchParams.get('server')!; - } - - if (!traceViewerServers.has(traceViewerServerBaseUrl)) - traceViewerServers.set(traceViewerServerBaseUrl, new TraceViewerServer(traceViewerServerBaseUrl)); - - return traceViewerServers.get(traceViewerServerBaseUrl)!; -} - // @ts-ignore async function doFetch(event: FetchEvent): Promise { // In order to make Accessibility Insights for Web work. @@ -93,7 +85,6 @@ async function doFetch(event: FetchEvent): Promise { const request = event.request; const client = await self.clients.get(event.clientId); - const traceViewerServer = getTraceViewerServer(client); // When trace viewer is deployed over https, we will force upgrade // insecure http subresources to https. Otherwise, these will fail @@ -115,7 +106,7 @@ async function doFetch(event: FetchEvent): Promise { if (relativePath === '/contexts') { try { const limit = url.searchParams.has('limit') ? +url.searchParams.get('limit')! : undefined; - const traceModel = await loadTrace(traceUrl!, url.searchParams.get('traceFileName'), event.clientId, traceViewerServer, limit, (done: number, total: number) => { + const traceModel = await loadTrace(traceUrl!, url.searchParams.get('traceFileName'), client, limit, (done: number, total: number) => { client.postMessage({ method: 'progress', params: { done, total } }); }); return new Response(JSON.stringify(traceModel!.contextEntries), { @@ -167,6 +158,9 @@ async function doFetch(event: FetchEvent): Promise { if (relativePath.startsWith('/file/')) { const path = url.searchParams.get('path')!; + const traceViewerServer = clientIdToTraceUrls.get(event.clientId ?? '')?.traceViewerServer; + if (!traceViewerServer) + throw new Error('client is not initialized'); const response = await traceViewerServer.readFile(path); if (!response) return new Response(null, { status: 404 });