init in loadTrace

This commit is contained in:
Simon Knott 2024-11-14 10:37:25 +01:00
parent 92bbb2e3df
commit 115b5ff89b
No known key found for this signature in database
GPG key ID: 8CEDC00028084AEC

View file

@ -36,13 +36,21 @@ const scopePath = new URL(self.registration.scope).pathname;
const loadedTraces = new Map<string, { traceModel: TraceModel, snapshotServer: SnapshotServer }>(); const loadedTraces = new Map<string, { traceModel: TraceModel, snapshotServer: SnapshotServer }>();
const clientIdToTraceUrls = new Map<string, { limit: number | undefined, traceUrls: Set<string> }>(); const clientIdToTraceUrls = new Map<string, { limit: number | undefined, traceUrls: Set<string>, traceViewerServer: TraceViewerServer }>();
async function loadTrace(traceUrl: string, traceFileName: string | null, clientId: string, traceViewerServer: TraceViewerServer, limit: number | undefined, progress: (done: number, total: number) => undefined): Promise<TraceModel> { async function loadTrace(traceUrl: string, traceFileName: string | null, client: any | undefined, limit: number | undefined, progress: (done: number, total: number) => undefined): Promise<TraceModel> {
await gc(); await gc();
const clientId = client?.id ?? '';
let data = clientIdToTraceUrls.get(clientId); let data = clientIdToTraceUrls.get(clientId);
if (!data) { 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); clientIdToTraceUrls.set(clientId, data);
} }
data.traceUrls.add(traceUrl); data.traceUrls.add(traceUrl);
@ -51,7 +59,7 @@ async function loadTrace(traceUrl: string, traceFileName: string | null, clientI
try { try {
// Allow 10% to hop from sw to page. // Allow 10% to hop from sw to page.
const [fetchProgress, unzipProgress] = splitProgress(progress, [0.5, 0.4, 0.1]); 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); await traceModel.load(backend, unzipProgress);
} catch (error: any) { } catch (error: any) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
@ -69,22 +77,6 @@ async function loadTrace(traceUrl: string, traceFileName: string | null, clientI
return traceModel; return traceModel;
} }
const traceViewerServers = new Map<string, TraceViewerServer>();
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 // @ts-ignore
async function doFetch(event: FetchEvent): Promise<Response> { async function doFetch(event: FetchEvent): Promise<Response> {
// In order to make Accessibility Insights for Web work. // In order to make Accessibility Insights for Web work.
@ -93,7 +85,6 @@ async function doFetch(event: FetchEvent): Promise<Response> {
const request = event.request; const request = event.request;
const client = await self.clients.get(event.clientId); const client = await self.clients.get(event.clientId);
const traceViewerServer = getTraceViewerServer(client);
// When trace viewer is deployed over https, we will force upgrade // When trace viewer is deployed over https, we will force upgrade
// insecure http subresources to https. Otherwise, these will fail // insecure http subresources to https. Otherwise, these will fail
@ -115,7 +106,7 @@ async function doFetch(event: FetchEvent): Promise<Response> {
if (relativePath === '/contexts') { if (relativePath === '/contexts') {
try { try {
const limit = url.searchParams.has('limit') ? +url.searchParams.get('limit')! : undefined; 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 } }); client.postMessage({ method: 'progress', params: { done, total } });
}); });
return new Response(JSON.stringify(traceModel!.contextEntries), { return new Response(JSON.stringify(traceModel!.contextEntries), {
@ -167,6 +158,9 @@ async function doFetch(event: FetchEvent): Promise<Response> {
if (relativePath.startsWith('/file/')) { if (relativePath.startsWith('/file/')) {
const path = url.searchParams.get('path')!; 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); const response = await traceViewerServer.readFile(path);
if (!response) if (!response)
return new Response(null, { status: 404 }); return new Response(null, { status: 404 });